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となるのでこれを監視して処理を切り替える
- twtter
- google+
- hatena