DCモータの駆動

 

モータを駆動するには,大きな電流を流す必要があるので,PICに直接モータを接続することはできない.(接続しても電流が足らず,回らない).そこで,モータを駆動する専用のIC(モータドライバ図1)を利用し,モータを駆動する.PICからモータドライバに信号を出し,モータドライバはその信号に従ってモータを駆動する.

 

http://www.kyohritsu.com/CATALOG/SEMICON_LINEAR/PHOTO/ta8440h.gif

1.使用するモータドライバ(TA8440)(詳細は左のデータシート参照)

 

モータドライバへの信号は,BRAKE(ブレーキ)CW/CCW(正転/逆転)PWM3つの信号である.それぞれがPICC0C1C2に接続されている(4.)

 

各信号の働きは次の通り.

・モータドライバのBRAKE0を出力すると,モータが止まる.1を出力すると回る.

・モータドライバのCW/CCW0を出力するとモータが正転し,1を出力するとモータが逆転する.

PWM信号は疑似的にモータにかける電圧を調節する.

 

<<ここでPWMとは?>>

PWMPluse Width Modulationの略で,パルス幅変調を意味する.パルス信号のONOFFの幅を調節することで,疑似的に印加する電圧を調節する.

 

周期一定のパルス波形の10の時間を変化させ,パルスが1の時にだけモータに電圧を印加する.1の時間が長ければ(0の時間が短ければ),モータの回転数は大きく,1の時間が短ければ(0の時間がながければ),モータの回転数が小さくなる.この周期一定のパルス波形の周期に対する1の時間の割合をデューティー比と呼ぶ(2参照)

正論理の場合(1の場合にモータに電圧をかける),デューティー比が大きいほど(3参照)モータは早く回転する.負論理(0の場合にモータに電圧をかける)の場合は,デューティー比が0に近くなるほど,モータの回転数が大きくなる.論理の正負はモータドライバの仕様によって異なる.今回使用するモータドライバは,PWMに負論理を採用しているため,デューティー比が0に近くなるほど,モータの回転数が大きくなる.

2PWM信号とデューティー比

 

3.デューティー比の大小の例

 

したがって,これら3つのピン(BRAKECW/CCWPWM)の値(01)を変えることでモータの動きも変わる.

 

 

4.Servo Zero1の入出力ピンの使用状況

 

モータ駆動のためのプログラム

 

1.PWMの初期設定(プログラムの最初に一回だけ記述する)

   モータのスピードを調節するためのPWM信号を発生させる準備を行う.PWM信号はPICC2から出力され,モータドライバへ伝えられる.

 

   // PWMの設定 //

   setup_ccp1(CCP_PWM);

   setup_timer_2(T2_DIV_BY_16,0xB0,1);

   set_pwm1_duty(255);

 

  <<解説>>

  1行目PICCCPモジュールをPWMとして使用するための宣言(通常このまま記述.おまじないと考えればよい)

  2行目PWM信号を生成するためのタイマの設定(通常このまま記述.おまじないと考えればよい)

  3行目:デューティー値の設定.デューティー値を255段階で記述.0で最大回転数,255で最低回転数(停止).安全のため最初は255(停止)を設定

 

 2.モータ動作の初期設定(回転方向とブレーキの解除) (必要に応じてプログラムの中で記述)

 

   output_high(PIN_C1);  //モータの回転方向

   output_high(PIN_C0);  //ブレーキを解除

 

  <<解説>>

  1行目:回転方向を決定するため,C11(high)0(low)を出力する.C1にモータドライバのCW/CCWが接続されているため.

  2行目:ブレーキはモータドライバのBRAKEピンが0のときに有効になるので,C0(モータドライバのBRAKEピンに接続されている)1(high)に設定し,ブレーキを解除した.

 

 3.デューティーの変更(モータのスピードの変更) (必要に応じてプログラムの中で記述)

 

          set_pwm1_duty(128);

 

<<解説>>

  初期設定の3行目と同様.引数の値(カッコの中の値)を変更することで,モータの回転数を変更できる.0が最大で,255が停止.

直接数値を指定するのではなく,変数を用いることができる.

例えば,int型の整数dataに何かの値が入っていたとし,その値を利用し,デューティー値を設定する場合は,

set_pwm1_duty(data);

とすることができる.