ドライバICでステッピングモーター制御

ステッピングモーター用ドライバICの使い方


DCモータ用のドライバICを使ったので、続いてステッピングモーター用のドライバICの使用方法
パルスの入力や正逆転、励磁駆動の種類や切り替えにいての説明とマイコンからの使用方法


ステッピングモーターにドライバICを使う

DCモータードライバICがあるようにステッピングモーターにも便利なドライバICがあります。

 

TA8415PというステッピングモータドライバICを使ってステッピングモーターを制御してみます。
これを使うとDCモータードライバICのように、より簡単にSPモーターの制御ができます。

 

使用するステッピングモーターのドライバICは TA8415P

3相、4相ステッピングモーターの両方に使用できて、設定により1相、2相、1-2相駆動の制御ができます。
しかし、このドライバIC、、駆動電流が400mAと少し低く、ちょっと大きなSPモーターには別に駆動用のモータードライブ回路が必要になったりします。全部一体になったSPモーターのドバイバICもあるので、そういうのも便利です。

 

SPモーターは各相に次々電圧を加えて回しましたが、このドライバICを使うと パルスと回転方向の入力だけでよく、複雑なところが省けますが、パルスは作って送り込む必要があります。

 

送り込んだパルスをSPモーター用にICがパルスを振り分けてくれるのですが、1,2相駆動もスイッチでだけ切り替えることが出来るので、面倒な部分はこ のICが担当し、コントロールは送り込むパルスと、回転方向の1,0のビットでして、それだけですむのでやはりお手軽にSPモーターが使えます。

 

その送り込むパルスの幅や数、速さで SPモーターのスピードや角度を制御します。
時計回り(CW)、反時計回り(CCW)の信号は1,0だけです。

 

 

 

ステッピングモータを動かす(タイマーW) でやったように、H8でSPモーターの回転制御をする場合は4本の入力線への入力を、ドライブ回路を通し、4本の入力をコントロールすることが必要でした。

 

ドライバICでは制御する速度、角度などは送り込むパルスを調節することで行うので
やっぱりパルスは作らないといけないのですが、パルスに1ピン、回転方向(CW/CCW)に1ピンと、2ピンだけでSPモーターの制御が出来るのでピンをSPモーターの駆動に取られないところも利点です。

 

また、設定ビットにより1相、2相駆動にも自在に切り替えができるので面倒なことはパルスのコントロールだけです。
タイマーWを使ってパルスを発生させて、回転、回転速度、回転角のコントロールをします。

 

回路図

モータードライブ回路にSPモータードライバICをつなげた回路です。

H8からは クロック入力、回転方向 をドライバICへ送るだけです。
クロックはFTIOB (P82) から出力します。 ドライバicの   クロック入力-FTIOB (P82)


回転方向の入力はH8から操作しないので、直接、抵抗でプルダウンしておきます。

 

ドライバIC TA8415P

 

TA8415P真理値表

ピン2,3,4の Ea、Eb、3/4 の設定です。(データシートから)

1,2相駆動、3相SPモーター用の切り替え設定。
4相SPモーターで通常使用するのは 1励磁駆動、2励磁駆動ですが、
1-2励磁駆動なども、すべてこの切り替えスイッチの設定だけで出来ます。
* 3相、4相を切り替えるときは一度リセットする必要があります。

 

 

TA8415Pパルスチャート

入力クロックと出力パルス(データシートから)

 

1相、2相駆動での 入力したパルスと 出力パルス の時計回り(CW)のときのチャートです。

 

クロックのON部分だけでなく、OFF部分も含めた周期で 各相を励磁する

 

このチャートを見る限り、送り込むパルスのデューティ比は関係ないことになります。

チャートはONが下になっているので注意しましょう。

 

 

 

プログラム

 

H8_15DrvIC_SPmtr


//パルス出力ピン  FTIOB (P82)

#include<3664.h>

int SPcnt=0;


void main(void)
{

  DI;
  TW.TMRW.BYTE=0x01;      // FTIOB端子をPWM出力に設定 
  TW.TCRW.BYTE=0xB2;      // マッチAでカウンタクリア、内部クロックの1/8( 2MHz ) FTIOBの初期値は1

  TW.TCNT=0x0000;         // TCNの初期化 
//  TW.GRA=20000;            // 10mS (100Hz)
//  TW.GRB=10000;            // 5mS 

    TW.GRA=10000;            // 5mS (200Hz)
    TW.GRB=5000;            // 2.5mS 
    
  TW.TMRW.BIT.CTS=1;      // TCNTカウンタスタート 
  EI;
  
  
  
  while(1){

    if(TW.TSRW.BIT.IMFB){
    
        SPcnt++;
        if(SPcnt>48){TW.TIERW.BIT.IMIEB=1;}  //パルス発生ストップ--割り込み要求イネーブル 
                                            //                    - または TW.TMRW.BIT.CTS=0
        TW.TSRW.BIT.IMFB=0;
    }
  }
  
}


       

 

ラジコンサーボで使ったタイマーWのパルス発生設定です。

 

TW.GRA=20000; でパルス周期を調整します。(このドライバICはデータシートから、送り込むパルスのデューティ比は関係ないようです、50%にしてあります)
これにより回転速度が調節できます。

 

while(1){ 内 を空にしてしまうと設定したパルスが延々と出続けます。

 

while(1){
      if(TW.TSRW.BIT.IMFB){
           SPcnt++;
           if(SPcnt>48){TW.TIERW.BIT.IMIEB=1;} //パルス発生ストップ--割り込み要求イネーブル
                              //  - または TW.TMRW.BIT.CTS=1   
           TW.TSRW.BIT.IMFB=0;
      }
}

 

コンペアマッチBのたびにIMFB が1になるのでこれを利用しパルスをカウントします。1になるとifに入り込んで処理をします。

while(1){ 内で コンペアマッチBのたびに SPcnt++ でパルスの数を カウントして、

一回転48ステップのSPモーターなので、このように if(SPcnt>48) で1回転するとパルス発生を停止してSPモーターを止めます。

このようにパルスの数をカウントし、パルスを止めることでSPモーターの角度制御ができます。

 

実行結果

TW.GRA=20000; の数値を変えることで、回転速度を自在に変えられます。
スムーズに回転しますね。

while(1)内を空にして、while(1){ } とすると 無限回転になります。

また回転中でも ピン2,3,4の Ea、Eb、3/4 の設定を変えることで1相、2相駆動が自在に変えられSPモーターの回転の変化がよくわかります。

 

台形加速も
if(SPcnt>48){ } 内で TW.GRA=20000; の数値で回転速度を変えればいいので簡単に加速、減速制御もできます。

 

加減速制御

台形の加速、減速での制御もやってみます。
最初はゆっくり加速、速度が乗ると定常回転、減速に入り停止、この一連の加減速にした方が動きはスムーズになります。

 

一般にいう台形の加減速制御ですが、
最初の200ステップをゆっくり加速し、 そこから200ステップ等速、 最後の200ステップは減速 という台形加速も試してみます。

 

台形加速グラフ

 

速度になるGRAをカウント毎に 加速→減算、 減速→加算 していきます。

 

H8_15DrvIC_SPmtr2


/*  PWM信号でサーボを動かす 
//パルス出力ピン  FTIOB (P82)
   加速、減速制御

*/
#include<3664.h>
#include"myfunc.h"

int SPcnt=0;

void main(void)
{
  DI;
  TW.TMRW.BYTE=0x01;      // FTIOB端子をPWM出力に設定 
  TW.TCRW.BYTE=0xB2;      // マッチAでカウンタクリア、内部クロックの1/8( 2MHz ) FTIOBの初期値は1

  TW.TCNT=0x0000;         // TCNの初期化 
  TW.GRA=20000;            // 10mS (100Hz)
  TW.GRB=TW.GRA/2;            // 5mS 

//    TW.GRA=10000;            // 5mS (200Hz)
//    TW.GRB=5000;            // 2.5mS 

   LCD_init( 16 ); 
      
  TW.TMRW.BIT.CTS=1;      // TCNTカウンタスタート 



  EI;
  
  //段階的に速くしてみる
  
  while(1){

    while(TW.TSRW.BIT.IMFB){

          LCD_locate(1,2);         //デバッグ表示
          LCD_dataout(SPcnt); 
 
        SPcnt++;
        if(SPcnt<200){  TW.GRA-=40;  TW.GRB=TW.GRA/2;
        
             LCD_locate(2,2);   //デバッグ表示 加速
            LCD_char('A'); 
        }
        else if(SPcnt>400){
            TW.GRA+=40;  TW.GRB=TW.GRA/2;  // 10mS (100Hz)
            
            LCD_locate(2,2);    //デバッグ表示 減速
            LCD_char('D');
            if (SPcnt>600){TW.TMRW.BIT.CTS=0;}          //パルス発生ストップ--割り込み要求イネーブル 
        }                                              //                   -または TW.TIERW.BIT.IMIEB=1
       else{TW.GRA=10000;
            TW.GRB=TW.GRA/2;
            
            LCD_locate(2,2);    //デバッグ表示 等速
            LCD_char('S');
      }
        
        TW.TSRW.BIT.IMFB=0;                          //戻して再開
    }
  }
  
}


       

 

GRAの初期値を2000にしておきます。

 

設定解説

 

  • スタートの加速部分 (デバッグ表示で LCDに A 表示
    ・if(SPcnt<200) でパルスを1つカウントするたび 200まで毎回40ずつ減算し速度を上げます。
  • 最後の減速部分 (LCDに D 表示) 
    ・else if(SPcnt>400) でパルスを1つカウントするたび 600まで毎回40ずつ加算し速度を落とします。600で
    TW.TMRW.BIT.CTS=0; でタイマーWを止めパルス発生を止めます。
  • それ以外(等速部分) (LCDに S 表示) 
    ・else{ TW.GRA=10000; とし、回転速度を一定に。ゆっくりとスタートし、低速回転、最後に減速しながら止まります。それぞれの期間を十分長くしてあるので、その様子が回転観察できます。

 

1相駆動で試してみましたが、ウィーンと加速しながら、スムーズに定常回転し、ゆっくり止まる、見ているだけでスムーズです

 

 

 

 

 

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