モータードライバICの使い方

マイコンをモータードライバICと接続し、モーター制御

 

マイコンのプログラムでもモータは制御できますが、ドライバICを使えば過簡単です。
モータードライバICを使ってモーターを制御する方法
モータードライバICの種類や扱い、注意


モータードライバICを使う 

DCモーターの回転方向など制御する方法と原理は、
TekRobo工作室 図解でわかりやすい
DCモーター駆動回路  にありますので、そちらを最初に参考にしてください

 

このようにトランジスタ4個を使えば、DCモーターの回転方向の制御ができます。
トランジスタ2個ずつで流れの向きを変える方法です。Hブリッジとも呼ばれます。

 

もちろん、このままトランジスタやFET4個使用しても可能ですが、 保護回路も内臓されこの回路が1つになったモータードライバICというのを使うのが簡単です。

手軽に下記のようなものが入手しやすく、よく使われます

 

TA7291p

ドライバIC  特長 動作電圧
TA7257P 大電流用
平均1.5A  ピーク4.5A
モータ電圧20V
電源6-18V
TA7291P 小電流用
平均1.0A  ピーク2.0A
モータ電圧20V
電源4.5-20V
TA7291S 小電流用
平均0.4A  ピーク1.0A
モータ電圧20V
電源4.5-20V

 

一番なじみ深いのがマブチモーターなど、プラモなどでよく使うDCモーターで工作程度の小さなモーターの制御には、TA5791Pが値段も安く多用されます。

 

ここでは、TA7291Sを使用しました。
Sは扱える電流が小さいので、これから用意するなら、大は小を兼ねるTA7291Pの方にしましょう。

 

モータードライバICを使うと、

DCモーターの 正転、逆転、ブレーキ、ストップ、電圧の制御 などができます。

 

TA7257 大電流用

1.5Aの運転電流が流せるので大きなモーター用です。
大きなモーターを使用する場合、高電圧になるので逆起電力が大きいときは内部の保護ダイオードだけではもたないこともあるので、自分で外部に保護ダイオードが必要となる場合もあります。 PWM制御には向いてない。

 

TA7291P、S

小さなモーター用です。

回転方向制御のほか、電圧制御、PWM制御も可能です。

姉妹品が S でもっと小電流用です。

姉妹品ですがPとSは接続端子が異なるので注意が必要。

 

トランジスタを4個使う、トランジスタブリッジなどと呼ばれるモータードライブ回路にくらべ、モーターICを使うと発熱が多かったり、PWM制御は感度がわるかったりと不便はあります。だから高周波のPWM制御にはむかないようです。

 

ピン TA7291 接続
P S
VCC 7 2 ドライバICの電源
VS 8 6 モーター用電源
VREF 4 8 モーターの電源コントロール用
GND 1 5
IN1 5 9 マイコンにつなぐ信号1
IN2 6 1 マイコンにつなぐ信号2
OUT1 2 7 モーターにつなぐ
OUT2 10 3 モーターにつなぐ
       


ピン番号は型番文字の書いてある側と向き合って、
左から 1、2、3・・・・ となります。



 

〔VCC  VS〕

ドライバICも動作するのに電源が必要なので、VCCに5Vをつなぎます。
VSにモーター用の電源をつなぎます。

 

〔IN1 IN2 、 OUT1 OUT2〕

マイコンから2本のピンをIN1,IN2につなぎます。
この2本のIOで方向回転などをコントロールします。

IN1  IN2  OUT1 OUT2 機能
0 0 ストップ
1 0 H L CW
0 1 L H CCW
1 1 L L ブレーキ 

 

OUT1、OUT2の端子にモーターをつなぎます。

マイコンからの信号が

マイコン  ドライバIC
1 → IN1   で 時計回り(CW:クロックワイズ)  
0 → IN2
 とすると
0 → IN1   で 反時計回り(CCW:カウンタークロックワイズ)
1 → IN2 

にコントロールできます。 これ以外に、ストップとブレーキがあります。

 

〔VREF〕

VREFはモーターへの電圧を調整するときに使います。
このピンへの入力電圧を変えると、モーターに加わる電圧が調節できます。
データーシートによると、 モーターへの電圧Vout は
Vout=VREF+0.7V


これを可変抵抗にするなどして調節するとモーターへの電圧を抵抗の加減で調節することができます
電圧を内部で落とし、モーターには落とした出力を加えるとこができます。
常に  Vout>VREF で使用する必要あり

落としたぶんが熱になるためICがそのぶん発熱します。
この機能を使用しないときは、このピンはモーター電源につなげておきます。

*モーターの回転をいきなり逆転させるとよくないので、(特に高い電圧でモーターを動かす ほど)逆転させる前に入力にストップをいれたあと逆転させるほうがよい。(一定時間おいて逆転のICもあるか思いますがこのデータシートには記載はなし)

モーターを回す場合は、スイッチOFFのときは、モーター側からOFFしその後マイコンをOFFするほうがよいでしょう。

 

このように回転方向の制御、電圧の制御などができるのでやはりドライバICは便利です。

3Vを直接モーターにつないで回してみて確認を。
そして、下記回路でもモーター電源を3Vにして回してみてください。
少し違いに気づくかと思います。
同じ3VなのにドライバICを使ったほうがすこし回転が弱い
これはドライバICを通すことで電圧を喰われ、内部で電圧がモーターに行くまでに下がるからです。
一応、こんなことも体験しておきましょう。便利なモノなので短所もあります。

 

回路図

 

ここで使用したのはマブチモーターRE140を使用します。電圧3Vまでのプラモ用です。
データを見ると 
限界電圧 3V
消費電流 560mA
となっています。

 

回すモーターによってドライバICを選びましょう。
モーター電源は3Vにしました。
ドライバICの電源はH8の電源からとってもかまわないのですが、モーター電源は必ず別電源(乾電池など)を使用します。

 

モータ-の正転、逆転に IOのPB7 のディップスイッチを入力スイッチとして、PB4、PB5 を使用し、ブレーキとスットップの入力にします。

 

回路図ではチャタリング防止回路になっています。スイッチ押下げで → 1 のスイッチです。
ドライバICはTA7291PとSでは、ピンが違うので接続が異なります。データシートを見てください。

 

プログラム

 

H8_13mterDrv1


#include <3664.h>

#define     CW   1
#define     CCW  0

int in12(void){
    
    if(IO.PDRB.BIT.B4) {return(0);}
    else if(IO.PDRB.BIT.B5) { return(1); }
    else {    return(3);   }
    
}

void tn_moter(tn)
     unsigned char *tn;
{
    if(IO.PDRB.BIT.B7 != *tn){
             //逆転になる場合 一度モーターストップ(保護用)         
             IO.PDR1.BIT.B1=0;	// IN1=0  → OUT1=∞
             IO.PDR1.BIT.B2=0;   // IN2=1    OUT1=∞
    } 

    if(IO.PDRB.BIT.B7 == CW ){
    
      //モーター正回転 
        *tn=CW;                         
  		IO.PDR1.BIT.B1=0;	// IN1=0  → OUT1=H
        IO.PDR1.BIT.B2=1;   // IN2=1    OUT1=L
        
         //LED出力
         IO.PDR1.BIT.B4=0;
         IO.PDR1.BIT.B5=1;           
    }
    else {   
       //モーター逆回転   
        *tn=CCW;                                  
    	IO.PDR1.BIT.B1=1;	// IN1=0  → OUT1=H
        IO.PDR1.BIT.B2=0;   // IN2=1    OUT1=L
        
         //LED出力        
        IO.PDR1.BIT.B4=1;
        IO.PDR1.BIT.B5=0;    
    }
}


int main()
{

	IO.PCR1=0xFF;       /* 全て1にセットし、出力に設定 1111 1111 */
	unsigned char tn=CW;   //CW or CCW   

 	while (1) {
    
    switch(  in12()  ){
        case 0:        //SW1_ON-ストップ 
           IO.PDR1.BIT.B1=0;	          // IN1=0  → OUT1=∞
           IO.PDR1.BIT.B2=0;              // IN2=0    OUT1=∞
                  //LED出力        
            IO.PDR1.BIT.B4=0;
            IO.PDR1.BIT.B5=0;       

            break;
            
        case 1:      //SW2_ON-ブレーキ
      
            IO.PDR1.BIT.B1=1;       	  // IN1=1  → OUT1=1
            IO.PDR1.BIT.B2=1;             // IN2=1    OUT1=1
           //LED出力        
            IO.PDR1.BIT.B4=1;
            IO.PDR1.BIT.B5=1;                

            break;   

        default:
            tn_moter(&tn);
    }       
   }
}
    


       

 

3つの入力スイッチを使います。モータ-の正転、逆転に IOの PB4 のディップスイッチを 入力スイッチとして、

 

PB4 : ストップ
PB5 : ブレーキ     
PB7 : モータ-の正転、逆転

関数 int in12(void){ で
入力されたスイッチの検出をして、各スイッチに応じた値を返します。


PB4 : ストップ  0
PB5 : ブレーキ  1   
その他         3     

その数値を
関数 switch( in12() ){   で読み取り、入力されたスイッチに応じて分岐し、各処理をします。


0 : ストップ
1 : ブレーキ

 

その他 default : モーター回転
モーター回転では、関数 tn_moter(tn) に。


回転方向として 変数 *tn に回転方向を記憶します。その記憶値をアドレスを渡しにしています。
保護のため、モーター回転が逆転となる場合は、すぐに逆転の信号を出さずに 一度ストップ の信号を出した後、モーター逆転の信号を出します。

 

同時にLEDに出力し、押したボタンで点灯するLEDが変わります。

 

実行結果

プログラムを実行するとモーターが回転し、
PB7 のスイッチで モータ-の正転、逆転が切り替わります。
正転 LED1 
逆転 LED2

 

回転方向はどちらの時でも、PB4 で ストップ 同時に LED1,2 両方消灯
PB5 で ブレーキ 同時に LED1,2 両方点灯   になり、モーターが止まります。

 

 

 

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