ステッピングモータ制御
考え方など基本は同じですので、まず Tekurobo工作室
114.ステッピングモータを動かす を見てください
DCモーターを回すことができたので、今度はいよいよステッピングモーターを回すことにします
プラモデルなど慣れ親しんだDCモーターと違い、SPモーターは角度を制御することが出来ます。
これが、最初は醍醐味! 命令して ”プルッ” と決めた角度に回せると快感です。
モノを動かす好みにもいろいろがあり、光モノ好き、動作好き、なんて傾向があります。
動作させるのを快感に思う人なら、初めて決め角にSPモーターが”プルン”と動かせたら、
「いっぱしの制御を成しとけた!」 なんて快感に浸れるのでは? と思います。
回転角度制御はロボット制御に欠かせない知識のひとつです。そんな歩をH8とSPモーターでやってみます。
今度使用するのは3664Fにとってタイマー最高峰のタイマーWを使います!
●ステッピングモーターから
ここまで最初から見てこられた人はもうお気づきでしょうが、Tekurobo工作室とくらべ、
この弟子HPのやることはかなり簡易的です 実験回路とかも簡単で。
使用するステッピングモーターはミツミ M42SP-7という型番のもの。データシートもありました。

ちょとメーカー品という訳は プリンターを分解したら出てきたモノです。
●SPモーターの仕様
ちょっと寄り道して仕様を見てみる DC12V用
(回すプログラムの実験なので、あまり中身は必要ないです。初めての方はいずれ、実用するときに使用SPモーターのトルクなど仕様も調べる必要もでます。そのときに詳しく考えればいいのでサラット読みとばして下さい)
ついでに単位変換は 1N・m = 100N・cm → 1N・m = 10.20kgf・cm (約10倍)
1mN・m=0.010197 Kgf・cm (0.01kgf・cm) → 100mN・m=1kgf・cm
この中で知りたい主な項目
- プルイントルク (起動トルク)
-
ステッピングモーターが起動できる負荷トルクを、各駆動パルス周波数毎に測定したもの。負荷を与えて、起動し得る負荷トルクで、これが知りたいトルクになるでしょう。
このプルイントルク 約 196gf・cm となります。 - プルアウトトルクとは
- 脱調せずに回る負荷トルクのことだそうです。いったん周り始めるとちょっと強いかな。
- ホールディング トルク(保持トルク)
-
これはそのままですね、SPモーターの利点の一つ、強い静止トルクをだせるそれです。
いずれも与える周波数によって変わってきます。
与える周波数 と トルクの関係
この表から
パルスレートを上げてSPモーターを高速で回すほど、どんどんトルクが小さくなっていますね。
この関係も実験後回してみて、その結果と較べてみることにします。
手で動かしてみる
Tekurobo工作室で回路を作ってボタン手動で動かしていますが、簡易的傾向の弟子HPではホントに手で回します
「ステッピングモーターは電圧をかけただけでは回らない、制御が必要」
と言われ最初は難しいもモノと気後れしがち。
しかし所詮、コイルの反発で回転力を得るもの。子供の頃、プラモのDCモーターの配線を指で電池に挟みつけるようにして回したように、ステッピングモーターも手と電池で回します。
9V角電池を使い、その+線を 電源+にプラスをつなぎ、-線をXにつなぐと、”プルッ” とほんの少し動いた。
仕様書によるとこれが1ステップ分=7.5度のハズ。
そして、電源+につないだ電池のプラスの方はそのままに、マイナス側をあちこち刺し込んでいくと、刺し込む位置によって、回ってまた反対に戻ったりする。
あれこれ繰り返すと写真のような並びのようです。
電源+、 X x_ Y y_
X-Y-x_-y_ の順に次々つないでいくと同じ方向に回転するようだ。
プラス線はそのまま電源+、マイナスの線を手に、この順番に素早く、
X-Y-x_-y_-X- と次々抜いては刺していくと、
”おっ、いいぞ、同じ方向に回転する!”
同じ方向にプルプル回転するコトがわかった。 (これが1-1相励磁です)
この抜き刺し移動をもっと速くしていくと、滑らかに回転するが、人間ワザではムリなので、これをマイコンにさせるわけです。
もう何も恐れることはないかな。
設定
それでは こんどはマイコンで動かす準備です。とりあえずは回転させてみます。
3664Fタイマー機能最高峰のタイマーWをいよいよ使います。(出し惜しみするようでしたが、3664Fではこれが最終兵器、さすがに、いっぱい機能がありす、タイマーを使い惜しみするのも小H8 タイニーの楽しみの1つ)
それではまた概要から。
タイマーW
特 長
- 4本のパルス入出力
- コンペアマッチ4本
- タイマーへの入出力(インプット、アウトプットキャプチャ)
- PWM (最大3相がタイマー設定だけで作れる)
- 5種類の割り込みができる
特長をみてもなんだかよくわかりませんが、使ってよさを知ることに。
しかし、今回はコンペアマッチが4本に増えても出力することぐらいしかつかいませんかねぇ。
他のタイマーWの良さはまた サーボ制御 などで、パルス長さ測定などで試してみることに。
さてSPモーター駆動ですが、今回は2相駆動で。
SPモーター駆動用のパルスチャートです。
2相駆動がトルクも太く、一番一般的な方法らしいです。常にどこか2つのコイルが通電されている方法です。
簡単に、4つの入力線にどのように通電するかの状態です。
縦の線を見てください。例えば左から2番目の縦線で切られたところをみると、XとYが1(凸)になり通電。縦線3番目にくると Xを0にして、Yは1のまま、x_ を1にします。
このように2つのコイルに常に通電していく方法です。
タイマーWの設定
これをタイマーWで、今度はトグル出力を使ってみます。
Xとx_のパルスが全くHigh、Low逆になっているので、ここではトグル出力を使ってみます。
タイマーをパルス図の詳しい関係はPWM制御(タイマーV)を見てください。考え方は同じです。
同じように説明すると、
タイマーの設定方法はたとえると
- 秒針が TCNT で、これがチクタクと時を刻みます。
- 目覚ましの針がGRA、GRB、GRC,GRD と4つの目覚ましを設定できます。
覚えるべき言葉は コンペアマッチ
これは設定した目覚ましの針(GRA-GRB)と秒針TCNTが一致したときのコト
時計やストップウオッチならここでベルが鳴るんですが、H8ではこのコンペアマッチのときどうするか選べます。
コンペアマッチのときどうするかは タイマー(秒針)を0に戻したり、ピンから電圧を出力したり止めたり、割り込み関数を呼び出したりと。
そしてTMRW.CTS に 1 、0 を入力することによって 秒針(TCNT)を止めたり、また動かしたりできます。
TCRW.CCLR に1 、0 を入力することによって コンペアマッチAのとき秒針を0に戻す の設定ができます。
ここではコンペアマッチのとき、ピンから電圧を出力させます。
どのピンから出力させるかというと
GRA~D それぞれの コンペアマッチのとき
GRA → FTIOA
GRB → FTIOB
GRC → FTIOC
GRD → FTIOD のピンから電圧が出ます。
H8付属の回路図のピン番号とこのピン名称をみて対応させてください。
(タイマー、パルスは全てこのタイプの図で特性を表し、記述することになるので避けては通れません)
GRA、GRC
GRB、GRD
は2つ同時にコンペアマッチし、そしてピンへ電圧出力します。
2つ共に同じ出力の形になると思えますが、ここでトグル出力を使います。
そして、GRAのコンペアマッチで時を刻むTCNTを0にリセットして、最初から振り出しにします。
トグル出力とは
コンペアマッチのたびに 1 または 0 を出力すると決めるのではなく、今までと反対の出力にする方法
コンペアマッチのたびに 1なら→0、 0なら→1 とする方法です。
現状と反対の出力になるので、コンペアマッチのたびに 出力を出す、出力休み、と切り替わるのでこのようなパルス発生に最適。
図をよく見ると、GRA、とGRCは出力がひっくり返したように逆なので、初期値が反対で、トグル出力にすると全く反対の出力にできます。
パルス発生の実際は上の図で1になっている間(凸のとき)、自動的に端子から5vが出力される設定にします。TIOR0、TIOR1
タイマーWでは設定するレジスタは5つ。タイマーVの設定をするとだいたい原理は似ているので問題はないでしょう。再度設定して慣れてください。コンペアマッチが増えたのでレジスタも増えます。
レジスタの説明 TMRW、TCRW、TIERW、TSRW、TIOR0、TIOR1 レジスタ 設定する機能 TMRW カウンタの動作-停止
PWMモード選択 (←PWMモード出力するとき)
(特殊な設定↓)
GRC,GRDをGRA,GRBのバッファに使用する設定
*特殊な設定で、コンペアマッチAのたびにRA→ GRCに転送保存するTCRW カウンタクリア条件設定、クロック設定、端子FTIOA~Dの初期値設定 TIERW 割り込み設定 TSRW (状態レジスタで プログラム上から状態を見るためにアクセスします)
コンペアマッチ、オーバーフローなどの検知フラグTIOR0、TIOR1 GRA~Dアウトプットかインプット、
端子FTIOA~Dの機能を選択GRA~GRD コンペアマッチの数値
一部だけレジスタ設定説明
TIOR0
Bit 7 6 5 4 3 2 1 0 GRB GRA 名称 - IOB3 IOB1 IOB0 - IOA2 IOA1 IOA0 端子FTIOAからの入力設定か端子FTIOAへの出力設定かを選択 コンペアマッチでの動作設定
(TIOR0、TIOR1 は間で区切られて2種類を設定するレジスタです。1レジスタで2つ分設定します)
IOA1 IOA0 コンペアマッチの時の動作 設定値 0 0 なら端子へ出力しない 0 1 なら端子へ0出力 1 0 なら端子へ1出力 1 1 なら端子へトグル出力
IOA2 機能 説明 設定値 0 アウトプットコンペアレジスタとして設定 これでコンペアマッチAでピンに出力の設定になります 1 インプットキャプチャレジスタとして設定 これにすると、内部のコンペアマッチでなく、外部から
端子FTIOAに入力が来たとき、コンペアマッチと同じような
合図を外部から与えたい時のため
実際の設定
TW..TIOR0.BYTE=0x33 (0011 0011)
IOA0 1 GRAのコンペアマッチでFTIOA端子へトグル出力
IOA1 1
IOA2 0 アウトプットコンペアレジスタとして機能
/
IOB0 1 GRBのコンペアマッチでFTIOB端子へトグル出力
IOB1 1
IOB2 0 アウトプットコンペアレジスタとして機能
/
トグル出力の設定にしておくと、
カウンタがコンペアマッチになると、トグル出力なので今までの出力と反対になります。
FTIOA: 1 → 0
FTIOC: 0 → 1
これで全く逆の出力が得られます。
C、Dも同様にして
TW.TIOR1.BYTE=0x33 (0011 0011)
TW.TCRW.BYTE=0xB9 (1011 0101)
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
設定値 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 1 |
名称 | CCLR | CKS2 | CKS1 | CKS0 | TOD | TOC | TOB | TOA |
設定説明 | マッチAで カウンタクリア |
φ/8 | D初期値1 | C初期値0 | B初期値0 | A初期値1 | ||
設定値 | 1 | 0 1 1 | 1 | 0 | 0 | 1 |
カウンタクリア条件設定
コンペアマッチAでカウンタをクリアに設定
クロック動作設定
クロックとして、φ/8 →内部クロックの1/8 ( 16M/8 = 2MHz )に設定
周波数
GRA=11000 に設定すると
半周期分が 2000000(2M) / 11000(GRA) =181
周期は図の -1周期- の部分なので この2倍で 362の周波数になります。
(* PWMでモーター制御(タイマーV) の周期も参照のこと)
端子FTIOA~Dの初期値設定
- TCRW.TOA =1 (最初のコンペアマッチAが発生するまでFTIOAの出力値を 1 にする)
- TCRW.TOC =0 (最初のコンペアマッチBが発生するまでFTIOBの出力値を 0 にする)
- TCRW.TOB =0
- TCRW.TOD =1
GRA、GRC=11000
GRB、GRD=5500
これでグラフのような波形のパルスが出ます。
TW.TIERW は(デフォルト)割り込みはしないので、今回、初期値にたより設定はしない
最後に TW.TMRW.BYTE=0x80 (1000 0000) .CTS=1
カウンタースタートでカウント開始する
実験回路図
回路図が複雑になってしまいましたがドライブ回路にパワートランジスタアレイを使っています。 (モーター駆動できるパワートランジスタが内部に4個入ったもの)
これまでの回路に追加したので、外部に330Ωの抵抗が余分についています。(パワートランジスタアレイは内部に抵抗がはいっているので、この330Ωの抵抗は実際は必要ありません)
このパワートランジスタアレイは中に保護回路も内臓ですが、フライホイールダイオードは外部に追加してあります。
プログラム-1
HP_SPmoter
#include<3664.h>
void main(void)
{
DI;
TW.TCRW.BYTE=0xB9; // クロックとして、内部クロックの1/8( 2MHz ),マッチAでタイマクリアあり
// FTIOAの初期値は1
// FTIOBの初期値は0
// FTIOCの初期値は0
// FTIODの初期値は1
TW.TCNT=0x0000; // TCNの初期化
TW.TIOR0.BYTE=0x33; //マッチA,BでFTIOへトグル出力
TW.TIOR1.BYTE=0x33; //マッチC,DでFTIOへトグル出力
int Ha=10000;
int Hb=5000;
TW.GRA=Ha;
TW.GRB=Hb;
TW.GRC=Ha;
TW.GRD=Hb;
TW.TMRW.BYTE=0x80; /* 1000 0000 カウントスタート*/
EI;
while(1) ;
}
タイマーWの設定だけです。
周期はha=11000 で362になっています。
パルス図のように hbはhaの半分にします。
実行結果
ha=11000でスムーズにSPモーターが回りました。もう少し大きく10000にするとゴリゴリという感じで振動が増えてSPモーターがまわります。低速にしても振動が増えたりとスムーズに回るところの周波数がある様子です。
SPモーターをきれいに回すにはいろいろ工夫が必要でしょう。
haを変えて、周期は約300~400でためしましたが、ha=9000あたり以上に早くすると脱調して回らなくなりました。
周期を早くするにつれトルクが減るようで、早くするほど指で回転を止めやすくなりました。
ドライブ回路によっても変わってくると思います。
今回はとりあえず、回転させただけなので次回は角度制御も少しやってみます。
- twtter
- google+
- hatena