DCモータのPWM制御 dsPIC入門講座02
開発環境
基盤
- SPPBoard(dsPIC30F3014使用)
コンパイラ
- C30
はじめに
PWMの入門としてDCモータを制御するためのサンプルプログラムをSPPBoardで作成しました。
ロボット製作ではPWMを扱う機会がとても多いと思います。
ここでは、ロボット製作の初心者を対象にPWMの概念から丁寧に解説していきたいと思います。
サンプルプログラムの概要説明
OutPutCompareモジュールを使用し、モータの速度制御を行うプログラムです。
速度変化はデューティ比を100%, 75%, 50% ,25%, 0%と順番に変化させる。
その際に一定周期で正回転、逆回転を切り替えます。
OutPutCompareモジュールとは
概念
OutPutCompareモジュールを簡単に言い表すなら高速でON/OFFを繰り返すことができる機能です。
一定時間内におけるON/OFFの比率(デューティ比)を調整することにより速度を制御することができます。
動作
ON/OFFの周期はタイマに依存します。
タイマによるカウントを100msecに設定し、デューティ比が50%の場合
カウント周期はそのままでデューティ比だけを変更した場合を考えてみると以下の用になります。
デューティ比25%
デューティ比100%
このようにデューティ比を変化させることで速度を制御することができます。
制御に必要な回路の知識
ロジック回路の使用
SPPBoardではOutPutCompareモジュールの出力に74HCT132Eを組み合わせています。
1Aと2AがPICのOC2(D1)ピンを共有している点に注目してください。
OC2とはOutPutCompare2の略です。
つまり、OC2からPWM出力を行っている際に74HCT132Eの1Aと2Aが同時に 1 -> 0を一定周期で繰り返すということがわかります。
モータドライバの使用
次はモータドライバについて解説します。
SPPBoardにはTA7291Pを使っています。
念のためモータドライバの原理についても解説しましょう。
Hブリッジ回路
Mはモータを表しています。
ストップ
モータが回転
先ほどと逆回転
ブレーキ
(注)すべてのモータドライバが上記の仕様とは限りません。
種類によってはブレーキモードが存在しないもの等もあります。
今回使用するTA7291Pはどうなっているのか仕様書から確認してみましょう。
モータドライバの仕様書から読み取る
端子の確認
ファンクションの確認
ファンクションを見ればモータドライバにどのような入力が必要なのかが一目でわかります。
ブレーキモード
- IN1 5V
- IN2 5V
正回転
- IN1 5V
- IN2 0V
逆回転
- IN1 0V
- IN2 5V
モータドライバへの接続
モータドライバとロジック回路の接続
TA7291P 74HCT132E
IN1 <--> 2Y
IN2 <--> 1Y
モータドライバとロジック回路の関係性
(注) ()はそれ以外の組み合わせが存在する事を示しています。
dsPICとロジック回路の関係性
前述したとおり、OutPutCompare2を使用した際、1Aと2Aが1 -> 0を繰り返します。
このことからモータの回転を制御するために調節すればいいのは1Bと2Bだと分かります。
以上で回路に関する説明は終わりです。
サンプルプログラム
まずはピンの別名を定義
#define PWM_1A_AND_2A LATDbits.LATD1
#define PWM_1B LATFbits.LATF0
#define PWM_2B LATFbits.LATF1
enum MotionType{NORMAL, REVERSE};
今回はOutPutCompare2を使用しますのでPWM_1A_AND_2Aを直接変更することはありません。
コンフィギュレーション設定はいつもどおりなので省略
main文の中
short MotionType
int i;
float Duty_set[] = {1.0, 0.75, 0.5, 0.25, 0.0};
TRISD = 0x0000;
TRISF = 0x0000;
OpenOC2(OC_IDLE_CON & OC_TIMER2_SRC & OC_PWM_FAULT_PIN_DISABLE, 0, 0);
OpenTimer2(T2_ON & T2_GATE_OFF & T2_PS_1_64 & T2_SOURCE_INT, 3125-1);
MotionType = NORMAL;
PWM_1B = 1;
PWM_2B = 0;
while(1){
for(i=0; i<5; i++){
SetDCOC2PWM(3125*Duty_set[i]);
wait_msec(1000);
}
if(MotionType == NORMAL){
///逆回転にセット
PWM_1B = 0;
PWM_2B = 1;
MotionType = REVERSE;
}else{
///正回転にセット
PWM_1B = 1;
PWM_2B = 0;
MotionType = NORMAL;
}
}
- OpenOC2(...)
OC_IDLE_CON : アイドルループ内動作継続
OC_TIMER2_SRC : タイマ2を選択
OC_PWM_FAULT_PIN_DISABLE : 出力モードをPWMに設定
第2引数 : OCxRSレジスタに設定する値
第3引数 : OCxRレジスタに設定する値
OpenOC関数の詳しい解説
OutPutCompareモジュールはタイマ2かタイマ3のカウンタとOCxRレジスタかOCxRSレジスタの値を常時比較していて、一致したとき、何らかの出力をOCx端子にするというものです。
OCx出力とはOutPutCompare出力の略で今回ではdsPICのOC2端子からの出力されるものを指します。
1) 今回はOCxRレジスタ、OCxRSレジスタともに0に設定しました。
2) そしてカウンタはタイマ2を使用します。
3) PWMモードを指定しているので、OCxRレジスタが比較対象(今回OCxRSレジスタの値は意味なし)となり、一致によりOCxレジスタはLowに制御されます。 逆にタイマが0クリアされるときは、OCxレジスタがHighに制御されます。
- OpenTimer2(...)
4/80MHzx64x3125=10msec
OC2出力周期(ON/OFF周期)が0.01秒に決定
モータの回転方向とブレーキ制御
PWM_1B = 1
PWM_2B = 0
この時モータは正回転する
一応ファンクションを確認
ではOC2出力が0の時モータは、ちゃんと停止しているのでしょうか。
モータがブレーキモードになっていることがわかると思います。
一応ファンクションを確認
PWM_1B = 0
PWM_2B = 1
この時モータは逆回転する。
一応ファンクションを確認
モータの速度制御
- SetDCOC2PWM(3125 * Duty_set[i])
デューティ比を100% ~ 0%まで段階的に変更する
これによりモータがブレーキモードになる比率を変更でき、 結果として速度を変化させることができます。
初心者向けの解説なので冗長な説明が多かったと思いますが
以上でDCモータの制御に関する解説を終わります。
blog comments powered by Disqus
Published
Category
SPPBoardTags
Profile
千葉工大産のロボットナビゲーションエンジニア
ros-jpの勉強会の主催やロボカップ世界大会優勝チームのリーダをやってました。
badge_description about badge's
総訪問者数
ツイート