ボリュームでサーボ制御

ボリューム入力ブロック サーボ動作ブロックを作ったので、 2つをつなげます

 

  ボリューム入力ブロック → サーボ動作ブロック 
と接続しボリュームでサーボモーターをコントロールしてみます

ブロックの連結

ボリューム入力ブロックで

ツマミを回すと この様に 設定した範囲の数値が出る モジュールをつくりました。


その出てきた数値を 以下のサーボ動作ブロックに入れると数値入力に応じて
サーボが回転するので 

 

このようになり

 

結果、ツマミでサーボの回転をコントロールできる ということになります。

 

ということで、 作った2つを接続して動かします

 

回路図


 

 

プログラム

 

H8_adv_ADsarvo2in1


 #include<3664.h>
#include

struct sarvo{
    float ang_max;
    float ang_min;
};

int GRB;

void ini_AD(void){
   AD.ADCSR.BYTE = 0x38;     /* 0011 1000*/
                            /* A/D変換開始 */
                            /* スキャンモード */
                            /* 高速変換 */
                           /* AN0 */ 
}

int AD_Vlm(int div){
/**************************************
  引数 : div (VLキザミ値)
        4,8,16,32,64,128,256 で指定
        
  返値 : 0~div を返す
           VLボリュームの回転に応じて
 **************************************/       

    int i;
    switch(div){
        case  4:    i=14; break;
        case  8:    i=13; break;
        case 16:    i=12; break;
        case 32:    i=11; break;
        case 64:    i=10; break;
        case 128:   i=9 ; break;
        case 256:   i=8;  break;
       default:     i=14; 
    }

   while(AD.ADCSR.BIT.ADF==0);      // 変換結果がでるまで待つ

   return( (int)( AD.ADDRA>> i ) );   // ビットシフト(i桁ずらす)

//    AD.ADCSR.BIT.ADF=0;           /* 終了フラグを0に戻す  */
}

void ini_DrvSarvo2M(){

  TW.TMRW.BYTE=0x01;      // FTIOB端子をPWM出力に設定 
  TW.TCRW.BYTE=0xB2;      // マッチAでカウンタクリア、内部クロックの1/8( 2MHz ) 
  			//FTIOBの初期値は1

  TW.TCNT=0x0000;         // TCNの初期化
  TW.GRA=20000;            // 20mS (50Hz)
  TW.GRB=3000;            // 1.5mS 
}

void DrvSarvo2M(struct sarvo sv,int inp,int div){
/**********************************
機能 = 引数inpの数字に応じてサーボを回転させる
 引数:struct sarvo sv  サーボ上下限値(ms)
   :div スケール
   :inp 入力数値
 返値:なし
 動作:サーボ回転
***********************************/

    int GRout;
    long GRmax;
    long GRmin;
    long p;

//範囲外処理 
     if(sv.ang_max > 2.3 || sv.ang_min < 0.7) {return;} //何もせずに返る
     
    GRmax=(int)2000*sv.ang_max;
    GRmin=(int)2000*sv.ang_min;

    GRmax=GRmax*100;//少数演算用100倍long
    GRmin=GRmin*100;//少数演算用100倍long
    p=(  ((GRmax-GRmin)/div)*inp ); //

    GRout=(p + GRmin )/100;

//範囲外処理 
    if(GRout > 4600 || GRout < 1400) {return;}

    GRB=GRout;   //デバッグ出力
    TW.GRB=GRout;//パルス発生出力
}


void main(void)
{

  DI;
  
    LCD_init( 16 ); 
    ini_AD();
    ini_DrvSarvo2M();

  TW.TMRW.BIT.CTS=1;      // TCNTカウンタスタート 
  EI;

  while(1){

  struct sarvo s3003;
    s3003.ang_max=2.0;
    s3003.ang_min=1.0;    

 DrvSarvo2M(s3003,  AD_Vlm( 64 ),  63);

        //LCD表示                   
        LCD_locate(1,2);
        LCD_dataout(GRB );
  }

}

       

 

ボリュームの数値を サーボ関数に入れるところは
 DrvSarvo2M(s3003, AD_Vlm( 64 ), 63);;

このようにしています。
サーボの入力数値範囲は ボリューム入力にあわせ0~63

 

実行結果

ツマミを回すとサーボがそれに応じて回転します。
同時にGRB値をLCDに表示します。

いっぺんに作ったのでなく、
それぞれのブロック(モジュール)で入出力が正しく機能することを確認して接続したので、うまく動いても当たり前のような気もします。


最初から一発できれいに動作しても、まあ、それだけ、切り分けて開発できるということでしょう。

 

 

 

スポンサーリンク
  • facebook
  • twtter
  • google+
  • hatena