開発環境

基盤

  • SPPBoard(dsPIC30F3014使用)

コンパイラ

  • C30

はじめに

PWMの入門としてDCモータを制御するためのサンプルプログラムをSPPBoardで作成しました。

ロボット製作ではPWMを扱う機会がとても多いと思います。

ここでは、ロボット製作の初心者を対象にPWMの概念から丁寧に解説していきたいと思います。


サンプルプログラムの概要説明

OutPutCompareモジュールを使用し、モータの速度制御を行うプログラムです。

速度変化はデューティ比を100%, 75%, 50% ,25%, 0%と順番に変化させる。

その際に一定周期で正回転、逆回転を切り替えます。


OutPutCompareモジュールとは

概念

OutPutCompareモジュールを簡単に言い表すなら高速でON/OFFを繰り返すことができる機能です。

一定時間内におけるON/OFFの比率(デューティ比)を調整することにより速度を制御することができます。

動作

ON/OFFの周期はタイマに依存します。

タイマによるカウントを100msecに設定し、デューティ比が50%の場合

Signal

カウント周期はそのままでデューティ比だけを変更した場合を考えてみると以下の用になります。

デューティ比25%

Signal

デューティ比100%

Signal

このようにデューティ比を変化させることで速度を制御することができます。


制御に必要な回路の知識

ロジック回路の使用

Signal

SPPBoardではOutPutCompareモジュールの出力に74HCT132Eを組み合わせています。

Signal

1Aと2AがPICのOC2(D1)ピンを共有している点に注目してください。

OC2とはOutPutCompare2の略です。

つまり、OC2からPWM出力を行っている際に74HCT132Eの1Aと2Aが同時に 1 -> 0を一定周期で繰り返すということがわかります。

モータドライバの使用

次はモータドライバについて解説します。

MotorDriver

SPPBoardにはTA7291Pを使っています。

念のためモータドライバの原理についても解説しましょう。

Hブリッジ回路

Mはモータを表しています。

ストップ

MotorDriver

モータが回転 MotorDriver

先ほどと逆回転

MotorDriver

ブレーキ

MotorDriver

(注)すべてのモータドライバが上記の仕様とは限りません。

種類によってはブレーキモードが存在しないもの等もあります。

今回使用するTA7291Pはどうなっているのか仕様書から確認してみましょう。

モータドライバの仕様書から読み取る

端子の確認

pin

ファンクションの確認

func

ファンクションを見ればモータドライバにどのような入力が必要なのかが一目でわかります。

ブレーキモード
 - IN1 5V
 - IN2 5V

正回転
 - IN1 5V
 - IN2 0V

逆回転
 - IN1 0V
 - IN2 5V

モータドライバへの接続

モータドライバとロジック回路の接続

connect

TA7291P          74HCT132E
 IN1     <-->     2Y
 IN2     <-->     1Y

モータドライバとロジック回路の関係性

(注) ()はそれ以外の組み合わせが存在する事を示しています。

rel

dsPICとロジック回路の関係性

前述したとおり、OutPutCompare2を使用した際、1Aと2Aが1 -> 0を繰り返します。

rel2

このことからモータの回転を制御するために調節すればいいのは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

この時モータは正回転する

Motor_cw

一応ファンクションを確認

Motor_cw_func

ではOC2出力が0の時モータは、ちゃんと停止しているのでしょうか。

Motor_stop

モータがブレーキモードになっていることがわかると思います。

一応ファンクションを確認

Motor_stop_func

PWM_1B = 0
PWM_2B = 1

この時モータは逆回転する。

Motor_ccw

一応ファンクションを確認

Motor_ccw_func

モータの速度制御

  • SetDCOC2PWM(3125 * Duty_set[i])
    デューティ比を100% ~ 0%まで段階的に変更する

これによりモータがブレーキモードになる比率を変更でき、 結果として速度を変化させることができます。


初心者向けの解説なので冗長な説明が多かったと思いますが

以上でDCモータの制御に関する解説を終わります。



blog comments powered by Disqus

Published

19 August 2013

Category

SPPBoard

Tags

Profile

千葉工大産のロボットナビゲーションエンジニア

ros-jpの勉強会の主催やロボカップ世界大会優勝チームのリーダをやってました。


 
badge_description about badge's

 

Follow me on Github

Follow me on Qiita

総訪問者数

アクセスカウンター