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
ブレーキ : b
ストップ : s
左回転速度15 : l15
RCサーボのところと同様に、入力、出力の範囲チェックはしない。
* 回転方向を変える場合には、いったん bか sでモーター停止させてから逆方向の回転を入力する。
ドライバICとの接続ポートがP10からではなく、P11 12 なので ビットシフトでずらしています。
実行結果
タミヤギアボックスのシリーズを電源3Vで回してみました。
モーターの電源にもよりますが、速度が6以下のr06とかでは 弱すぎて回り出さない。
08以上ぐらいでないと停止からは回り始めない。
PCから速度や方向が変えられて実験にはわかりやすいです。
弱い回転数なら、速い回転から速度を下げるとぎりぎり回ったりするのがPCで変更できるのでわかりやすい。
負荷無しの空回りで回すと、停止はstopにしても、ブレーキにしても違いはあまりないですね。
ドライバICを使った回転方向と回転速度のコントロールが実験できます。
- twtter
- google+
- hatena