21章:糸巻き式自動深さ測定機(2)制御編

    作成2015.02.21

     コパルステッピングモーター SPG27−1702の応用として糸巻き式自動深さ測定機を製作してみました。

  1. 糸巻き式自動深さ測定機の制御回路図
     糸巻き式自動深さ測定機の制御回路図を以下に示します。

     上記回路図において
    (1)コパルステッピングモーター SPG27−1702をトランジスタアレイ(7chダーリントンシンクドライバ)TD62003APGで駆動します。
    (2)圧力センサーFSR400 SHORT(秋月電子通商)の抵抗値変化は電源電圧3.3Vを10kΩの抵抗で分圧し、オペアンプLM358Nで電圧フォロアします。
    (3)長さ(mm)または荷重の値をダイナミック接続4桁高輝度赤色7セグメントLED表示器 カソードコモン カソード共通接続で表示します。
    (4)動作モード、動作条件、測定結果はシリアルIスケアC EEPROM 24FC256−I/Pに記録します。


  2. 糸巻き式自動深さ測定機の制御回路外観
     糸巻き式自動深さ測定機の制御回路を以下に示します。



  3. 糸巻き式自動深さ測定機のプログラム
     16章:高温用温度レコーダの製作、「41-16.zip」をベースに修正しました。
     まずは下記の「41-21.zip」ファイルをダウンロードしてください。
    [41-21.zip]をダウンロードする。

    解凍するとフォルダー内にUMy-CDC-Basicフォルダーとdynamic_cdc_demo.exeがあります。USB-HID-SCDフォルダー内に

    (1)UMy-CDC-Basicフォルダー
    *My-CDC-Basic.Xがソースプログラムです。
    *「XC8」用です。

    (2)dynamic_cdc_demo.exe
    *標準のWindows用実行ファイルです。
    *Win-PingPong.exeでも同様な操作ができます。

    (3)注意事項
    *上記プログラムはPIC18F4553用です。


  4. 操作方法
    (1)PIC18F4553にプログラムを書込みます。
    (2)USBを接続し、dynamic_cdc_demo.exeを起動します。
    (3)Send DataにAA#を設定して、Send Dataボタンを押します。
    (4)最後に実施した動作条件と測定結果が表示されます。(最初は、正しい表示がありません。)

    *M0=0のとき7セグLEDには高さ(mm)が表示、M0=1のとき荷重(div)が表示されます。
    *gN=1のとき、測定間隔は0.1sとなります。設定可能最大値は65535です。
    *gSNo=480は測定データ数です。
    *Vth=20は重量変化検出閾値です。20x10=200divで閾値判定します。設定可能最大値は255です。
    *測定データはNo、高さ(mm)、荷重(div)の順で表示されます。
    (5)M0とgNの変更:例えばM0=1、gN=10に変更する場合
      Send DataにBB#1#10#を設定して、Send Dataボタンを押します。
    (6)Vthの変更:例えばVth=30に変更する場合
       Send DataにCC#30#を設定して、Send Dataボタンを押します。
    (7)SWRボタンを押すとリセットされますが、M0、gN等記録データはリセットされません。電源をON/OFFしても同じです。
    (8)SW3ボタンを押している間だけ下降します。(手動モード)
    (9)SW4ボタンを押している間だけ上昇します。(手動モード)
    (10)SW1ボタンを押して離すと自動測定を開始します。(自動モード)
        *測定結果は自動記録されます。
    (11)SW2ボタンを押して離すと自動測定を終了して、元の高さまで戻ります。(自動モード)


  5. 測定事例
     約600mm程度の高さから、約150mm程度の高さまで水がはいった容器をおいて測定してみました。
     また、重りは鉄製金具9gx5枚=45gとしました。
    (1)測定結果生データ
     測定結果生データは21-1.txtを参照願います。
    [21-1.txt]をダウンロードする。

    (2)測定結果グラフ
     測定結果グラフを以下に示します。


     上記グラフから
    (1)荷重変動は起動時に大きく、徐々に減衰する。
    (2)水面に達すると僅かに荷重が減少する。
    (3)水底に達すると荷重は大きく振動しながら、高さは一定に保たれる。
    等がわかります。


  6. My-CDC-Basic.Xプログラムコードのポイント
    *MPLAB_X_IDE_v2.25とPIC18F4553マイコンの復習、16章:高温用温度レコーダの製作をベースに修正しました。
    *コパルステッピングモーター SPG27−1702の制御に関しては19章:ステッピングモーターの制御を参照しました。
    (1)EPROM書込み方法の変更
    *測定データのEPROMへの書込みはタイマー0割込みから呼び出されるvoid Int_Low()関数内で行っています。
    *void Int_Low()関数内で1バイト書込み関数void Write_EPROM(unsigned short addr,unsigned char send_data)を多数回実行するとタイミング的な不具合が発生しました。

     そこでvoid Int_Low()関数内での書き込みを
    gEPdata[0]=(unsigned char)(X1/256);
    gEPdata[1]=(unsigned char)(X1);
    gEPdata[2]=(unsigned char)(X2/256);
    gEPdata[3]=(unsigned char)(X2);
    Write_EPROM_N(4*gSNo+8,4);//EPROM書込み
    と1回に変更しました。

    unsigned char gEPdata[10];//Write_EPROM_N用グローバル配列変数
    
    //N個のgEPdata[i]を同時にEPROMに書込み
    void Write_EPROM_N(unsigned short addr,unsigned char N)
    {
        int i;
    
        TRISB   =	0b00000011; //B1=SCL(INPUT),BO=SDA(OUTPUT)I2C通信
        SSPCON1 = 0x28;		// SSP enable & I2C Master mode, clock = FOSC / (4 * (SSPADD+1))
        SSPADD = 0x0F;		// 0x00だと動作しないクロック設定
    
        unsigned char    addr1, addr2;
        addr2=addr;
        addr1=addr >> 8;
    
         //1バイト書込み
            PIR1bits.SSPIF = 0;//I2C_通信割込みフラグクリア
    	SSPCON2bits.SEN = 1;//I2C_startビット
    	while (SSPCON2bits.SEN) {}//終了待ち
    
    	PIR1bits.SSPIF = 0;//I2C_通信割込みフラグクリア
            while(SSPSTATbits.BF){};
    	SSPBUF =0xA0;//0xA0 //書込み制御コード
            if (SSPCON2bits.ACKSTAT) {PORTD=0b11111110;}//ACKチェック
    	while (!PIR1bits.SSPIF) {}//終了待ち
    
    	PIR1bits.SSPIF = 0;//I2C_通信割込みフラグクリア
            while(SSPSTATbits.BF){};//SSPBUFの干渉確認
    	SSPBUF = addr1; // 書き込みアドレス1
            if (SSPCON2bits.ACKSTAT) {PORTD=0b11111101;}//ACKチェック
    	while (!PIR1bits.SSPIF) {}//終了待ち
    
    	PIR1bits.SSPIF = 0;//I2C_通信割込みフラグクリア
            while(SSPSTATbits.BF){};//SSPBUFの干渉確認
    	SSPBUF = addr2;// 書き込みアドレス2
            if (SSPCON2bits.ACKSTAT) {PORTD=0b11111100;}//ACKチェック
    	while (!PIR1bits.SSPIF) {}//終了待ち
    
            for(i=0;i < N;i++)
            {
                PIR1bits.SSPIF = 0;//I2C_通信割込みフラグクリア
                while(SSPSTATbits.BF){};//SSPBUFの干渉確認
                SSPBUF =gEPdata[i];// send_data書き込み
                if (SSPCON2bits.ACKSTAT) {PORTD=0b11111011;}//ACKチェック
                while (!PIR1bits.SSPIF) {}//終了待ち
            }
            PIR1bits.SSPIF = 0;//I2C_通信割込みフラグクリア
            SSPCON2bits.PEN = 1;//I2C_通信終了
            while (SSPCON2bits.PEN) {}//終了待ち
    }
    
  7. 糸巻き式自動深さ測定制御編まとめ
    (1)制御回路と制御ソフトはMPLAB_X_IDE_v2.25とPIC18F4553マイコンの復習、16章:高温用温度レコーダの製作をベースに修正しました。
    (2)コパルステッピングモーター SPG27−1702の制御に関しては19章:ステッピングモーターの制御を参照しました。
    (3)測定データのEPROMへの書込みはタイマー0割込みから呼び出されるvoid Int_Low()関数内で行っています。
    (4)void Int_Low()関数内で1バイト書込み関数void Write_EPROM(unsigned short addr,unsigned char send_data)を多数回実行するとタイミング的な不具合が発生しました。
    (5)N個のgEPdata[i]を同時にEPROMに書込みをvoid Write_EPROM_N(unsigned short addr,unsigned char N)の1回呼び出しに変更しました。
    (6)原因がよくわからないのですが、USBを接続状態でリセットすると、EPROMに記録したデータが変化することがあります。 電源ON/OFFとリセット時はUSBをはずした方が安全です。
    (7)実働評価結果において
    *荷重変動は起動時に大きく、徐々に減衰する。
    *水面に達すると僅かに荷重が減少する。
    *水底に達すると荷重は大きく振動しながら、高さは一定に保たれる。
    等が確認できました。




22章:3次元パソコン制御ルータ加工機の製作(1)ルータ編に行く。

トップページに戻る。