パソコンでモーターPWM制御

モータードライバICでモーターを制御する方法
ボリューム変化をモジュールで読み、モータードライブモジュール関数に渡す方法で、モーター回転を制御する方法の解説


PWM制御 回転速コントロール

モータードライバICを使うと、回転方向などの制御ができました。加えてPWM制御でモーター回転速度を変える。

 

PWMでモーター回転を制御するのを以前やってみたので、モータードライバICを使ってパソコンから動かしてみる実験。

  • 回転方向
  • モーター回転速度

 

ドライバICの制御端子への信号をPWM制御して回転速度をコントロールする

変更の入力はRCサーボ制御と同様に、パソコンとつなぎ回転速度と方向をパソコンから入力。

 

回路

回路は モータードライバICを使う のドライバIC接続部分と同様です。 

 

ドライバIC TA7291S
(今回使用するのは ドライバICとの接続P11 P12だけ)

 

 

プログラム

 

2tmrWwm_trs


 
/*
 PWM制御
    
    tmrWの割り込みを使い   出力ピンを変えて モータをPWM制御する
    
	pcの入力でモーター回転方向と速度を変更
    
	マッチAで カウンタクリアで 周期を作り 最初High
	マッチBで 割り込み=IOピンでパルス波形  マッチBで Low   --↓__
	
	    周期        1kHz    TW.GRA = 2000;
		デユーティ比    1999以下 TW.GRB = duty; へ入力  

    出力)    IO出力pin :P80 P81 またはp11p12
	
	入力)      PCで 三文字 以下アルファベット1文字 +2桁数値を入力
	                r:cw  l:ccw  s:stop  b:brake        1~15 を入力
		            TW.GRB = (1~15) * (CONST=133)   :   133~1995
*/

#include <3664.h>


/*
#define     CW      0x01    //0000 0001
#define     CCW     0x02    //0000 0010
#define     STOP    0x11    //0000 0011
#define     BRK     0x00    //0000 0000
*/


#define     CCW      0x01    //0000 0001
#define     CW       0x02    //0000 0010
#define     BRK      0x11    //0000 0011
#define     STOP     0x00    //0000 0000

#define     CONST   133    //

char txb[10], rxb[10];
char b[20];

int mtr_cntl=CW;
unsigned int  duty,hz;

void int_timerw (void){

     if(TW.TSRW.BIT.IMFA  == 1){   // GRA コンペアマッチ

    // GRAコンペアマッチ発生時の処理
//        IO.PDR8.BYTE =  mtr_cntl;   //ピン出力
        IO.PDR1.BYTE =  mtr_cntl<<1;   //ピン出力

        TW.TSRW.BIT.IMFA = 0;       // 割り込みフラグクリア
    }

    if(TW.TSRW.BIT.IMFB  == 1){   // GRB コンペアマッチ

    // GRBコンペアマッチ発生時の処理
//        IO.PDR8.BYTE &= 0x00;       //ピン出力OFF
        IO.PDR1.BYTE = 0x00;   //ピン出力
		
        TW.TSRW.BIT.IMFB = 0;       // 割り込みフラグクリア
  }
}



void main()
{
    int dat =0;
    char inpchar;


//    IO.PCR8=0x0F;     // 0000 1111   0--4出力設定
    IO.PCR1=0x0F;     // 0000 1111   0--4出力設定

    //タイマW	                   
    TW.TCRW.BYTE=0xB0; // 1011 0000    
	                   // |----------- マッチAでカウンタクリア
	                   //  |||-------- 011 =1/8clok
					   //      ||||--- FTIOxピン出力なし

  TW.TIERW.BIT.IMIEA=1; //タイマW マッチA 割り込み あり
  TW.TIERW.BIT.IMIEB=1; //タイマW マッチB 割り込み あり

  
   //  初期化

   TW.GRA =2010;     TW.GRB = duty;
   duty = 1000;
   mtr_cntl = CW; 
//   IO.PDR8.BYTE = mtr_cntl ; 
   IO.PDR1.BYTE = mtr_cntl<<1 ; 

   TW.TMRW.BIT.CTS=1;       // ITU0 TCNTカウント開始 

    SCI3_INIT(br38400, txb, sizeof(txb), rxb, sizeof(rxb));       //初期化

 EI;                  //割り込み許可


   SCI3_OUT_STRING ("\n入力した文字をオウム返しに出す\n");//文字列送信関数


    while(1){

       SCI3_IN_STRING (b, sizeof(b) - 1);//文字列受信関数
       SCI3_PRINTF("[%s]\n",b);          //オウム返し表示

     	inpchar= b[0];
		
	    switch ( inpchar ){
		
	        case	'r'   : { mtr_cntl = CW;    dat = ( b[1]-'0')*10;     dat += ( b[2]-'0'); break;}
	    	case    'l'   : { mtr_cntl = CCW;   dat = ( b[1]-'0')*10;     dat += ( b[2]-'0'); break;}
	    	case    's'   : { mtr_cntl = STOP;  dat=0; break;}
			case    'b'   : { mtr_cntl = BRK;   dat=0; break;}
		    default:    SCI3_PRINTF( "DIR NON!" );
		}

        duty = ( CONST * dat );   
        TW.GRB = duty;
      }

}


       

 

モータードライバICへつながる制御信号の P11、12 をPWM制御にします。

PWM波形はタイマーでもそのまま作れますが、タイマーWのピン出力のON、OFFによりPWMにする方法になっています。

 

方法は少し違いますが、

  • モーターPWM制御
  • モータードライバICを使う
  • パソコンでRCサーボを動かす     など参照

 

周期は約1kHzになっています
タイマーWの コンペアマッチAで タイマーカウンタクリア とピン出力ON
コンペアマッチB  ピン出力OFF

GRBの数値でPWM波形をIO出力で発生。入力1~15の段階でモーター回転速度を変えるようになっています。

 

パソコンから操作方法

パソコンからRCサーボ制御と同様に、ハイパーターミナルでボーレート38400でパソコンとつなぐ。

最初に接続しておいて、H8をリセットするとメッセージがPCに表示されると接続OK

 

PCからの入力は 3文字  ■□□  (当然、全部半角です)

■アルファベット1文字      r、l、s、b

 

□□ 01~15入力   1桁数値でも02のように0を入力する。

 s、b のときは1文字だけで、続く数値不要

 

r、l が回転方向 そのあとの数値は 0-15の範囲で入力。
停止のときは bかs入力

 

例)
右回転 速度9 : r09

ブレーキ    : 

ストップ    : 

左回転速度15 : l15

 

RCサーボのところと同様に、入力、出力の範囲チェックはしない。

 

* 回転方向を変える場合には、いったん bか sでモーター停止させてから逆方向の回転を入力する。
ドライバICとの接続ポートがP10からではなく、P11 12 なので ビットシフトでずらしています。

 

実行結果

タミヤギアボックスのシリーズを電源3Vで回してみました。

モーターの電源にもよりますが、速度が6以下のr06とかでは 弱すぎて回り出さない。
08以上ぐらいでないと停止からは回り始めない。
PCから速度や方向が変えられて実験にはわかりやすいです。

 

弱い回転数なら、速い回転から速度を下げるとぎりぎり回ったりするのがPCで変更できるのでわかりやすい。


負荷無しの空回りで回すと、停止はstopにしても、ブレーキにしても違いはあまりないですね。
ドライバICを使った回転方向と回転速度のコントロールが実験できます。

 

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