ステッピングモーターをIO出力で制御

ステッピングモーターを回転させる制御を もっともシンプルなIO出力で回します。


ステッピングモーター回転の制御を、h8 タイマーWのもつ機能を様々に使って実行


IO出力でステッピングモーター回転

IOピンの出力で回す方法もやってみます。

タイマー割り込みで、定期的に関数呼び出しをして、その中でIOポート出力の切り替えでSPモーターの各ラインに送り込んでみます。

タイマーは定期的に実行されれば、どれでもいいのですが、ここではタイマーWを使いました。
割り込み関数を定期呼び出しする目的だけで使用し、その他コンペアマッチの出力などは使いません。

IOポート出力の説明は IOでLEDを光らせる にあります。

 

プログラム-3

プログラム3 (IO出力でステッピングモーターを回す)

HP_SPmoterIO



#include <3664.h>

/*
定期的に呼ばれるタイマ割り込みで IOポートで出力にだす。
2-2励磁
*/

int cnt=0;

void int_timerw (void){

  cnt++;
  if(cnt>4) cnt=0;
  
 switch(cnt){

        case 0:  IO.PDR8.BYTE=0X12;  /* 0001 0010  */ 
                  break; 
        case 1:  IO.PDR8.BYTE=0X06;  /* 0000 0110  */
                  break;
        case 2:  IO.PDR8.BYTE=0X0C;  /* 0000 1100  */ 
                  break;
        case 3:  IO.PDR8.BYTE=0X18;  /* 0001 1000  */ 
                  break;

    }

   TW.TSRW.BIT.IMFA = 0; // 検知フラグを戻して再開 
}



void main()
{
  IO.PCR8=0x1E; /*0001 1110*/
                          /*BIT1  P81 /FTIO A  */
                          /*BIT2  P82 /FTIO B  */
                          /*BIT3  P83 /FTIO C  */
                          
                          /*BIT4  P84 /FTIO D  */                             
 DI;
 TW.TCRW.BYTE=0xB0; /*1011 0000*/

   TW.GRA = 5000;

  TW.TIERW.BIT.IMIEA=1; //タイマー割り込み あり 
  TW.TMRW.BIT.CTS=1;       // ITU0 TCNTカウント開始 

 EI;


   while (1) ;
  
}

       

 

割り込み関数内で、PDR8での設定で下記ポートから出力します。
(切り替え設定用レジスタのPMRはポート8にはなく、タイマーWでの出力設定がある場合はそれが優先されます)

(FIIOA ピン→P81 になっているのでそのまま接続は変更しなくても大丈夫)
プログラム1で使用したタイマーWの各出力ピンは下記のようにポート8と兼用になっています。

 

BIT1 P81 /FTIO A
BIT2 P82 /FTIO B
BIT3 P83 /FTIO C
BIT4 P84 /FTIO D

タイマーWは定期的に割り込み関数を実行するだけの設定です。
ポート8のBIT1(P81)  - BIT4(P84) で出力します。

TW.TCRW.BYTE=0xB0; /*1011 0000*/
GRAで割り込み時間を設定し、マッチAでカウンタクリアの設定。 

TW.TIERW.BIT.IMIEA=1; //タイマー割り込み あり
マッチAで割り込み設定にします。

プログラム2と少し変えて、ビットアクセスしている部分もあります。
TW.TMRW.BYTE=0x80  (1000 0000) .CTS=1 カウンタースタートでカウント開始する

TW.TMRW.BIT.CTS=1; // ITU0 TCNTカウント開始

回路は全て今までと同じです。

これまでのチャート図を見て

 

定期的な割り込みを
  GRA=5000 ごとに 実行します。(図の 縦線の 実線と点線 両方で

 CNTで割り込み関数が実行するたびカウントしていって 
 CNT=0 CNT=2 CNT=4 CNT=3
 で呼び出されるたび出力を切り替えます。
 CNT=4になると、また CNT=0 で繰り返し。

 CNTで出力を切り替え、このような出力にします。

端子 P84
(FTIO D)
(GRD)
P83
(FTIO C)
(GRC)
P82
(FTIO B)
(GRB)
P81
(FTIO A)
(GRA)
CNT=0 1 0 0 1
CNT=1 0 0 1 1
CNT=2 0 1 1 0
CNT=3 1 1 0 0

 

この方法が一番簡単ですね。タイマーも定期呼び出しだけで、いろいろ励磁方法、逆転などを変更するのも手早そうです。

 

まとめメモ

 

タイマーW では 設定するレジスタは5つ。


TMRW、TCRW、TIERW、TSRW、TIOR0、TIOR1


レジスタ

TMRW → カウンタの動作、停止が必要なときまたはPWMなど以外は設定は通常必要ない

  • カウンタの動作-停止
  • PWMモード選択、
  • GRC,GRDをGRA,GRBのバッファに使用する設定
    *特殊な設定で、コンペアマッチAのたびに
    GRA→ GRCに転送保存する

 

TCRW

クロック動作設定

  • カウンタクリア条件設定
  • 端子FTIOA~Dの初期値設定
TIERW

割り込み設定

 

TSRW

(状態レジスタで プログラム上から状態を見るためにアクセスします)
コンペアマッチ、オーバーフローなどの状態フラグ

TIOR0、TIOR1
  • GRA~Dアウトプットかインプット、
  • 端子FTIOA~Dの機能を選択

 

トグル出力とは

コンペアマッチのたびに 1 または 0 を出力すると決めるのではなく、今までと反対の出力にする方法
コンペアマッチのたびに 1→0、 0→1 とする方法

 

(タイマWの割り込み)
TCNTのオーバーフロー 、GRAーDの コンペアマッチまたはオーバーフロー
で割り込みがかけられ割り込み関数を起動できる。

しかし、GRAーDどの割り込みでも 割り込み関数は同じで、別々の割り込み関数は起動しない。
それぞれで処理を変えたい場合は GRAーDのコンペアマッチまたはオーバーフローで GRA-D →1となるのでこれを監視して処理を切り替える 

 

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