パルスモーター(ステッピングモーター)の駆動

故障して廃棄したレーザープリンターを分解したら、
パルスモーター
(SANYO 103G775-1258)が出てきました。Webで調べると、1.8度ステップの
ユニポーラータイプのモーターです。このモータにつながったケーブルをたどると
モータ駆動用のICの載った基板にたどりついたので、まとめてそっと
取り出しました。
ICにはSMA7029Mという型番
が印刷されていたので、さらにWebでこのICについて調べると、うまい具合
にフルのマニュアルがみつかりました。
このマニュアルに示された標準回路と現物の基板とをにらめっこすると
この基板はほとんど標準どおりにできていることもわかりました。
またマニュアルによるとこのICは、オープンコレクタの信号で、
通常の2相励磁(1.8度ステップ)
とその半分の1−2相励磁(0.9度ステップ)の二つのモードが可能なこと、
パワーを切り替えられることなどがわかります。
というわけでこれを使って次のようなものを作りました。
- 通常は低速(10pps程度)で定常状態で動いている。
- コンピュータからのコマンドで指定したパルスだけ高速で回転する。
- 定常時はパワーダウンモード、高速時はハイパワーモードで回転する。
- 高速回転に移行する際には徐々に加速し、定常回転にもとるときは
また徐々に減速する。
- Arduinoのボード上のクオーツを頼りに回転数を正確に保つ。
回路はこんな感じ
左がArduino、その上がArduinoのTTL信号の中継端子とOpen collectorに変換する
トランジスタを載せたブレッドボード、真ん中上がモータコントローラのIC
右下がモータ。右端がモーター用のDC電源。ゴチャゴチャしてますが、
Arduinoからは信号5本(INa,INb,tda,tdb,パワーダウン信号)
うちINa、INbは直接ICに、tda,tdb,パワー信号はSC1815を通して
ICにつなぐだけ。モーターとIC間はもともと基板上にあった
コネクターを用い、DC電源は基板に直接接続しました。
注意点をいくつか。
- パルス間隔を正確に保つため、ボード起動時からの現在
までの経過時刻をマイクロ秒単位で得るmicros()関数を用いて
時間を管理しました。この関数で得た現在の時刻を元に
次のパルスを発生させるまでの残り時間を計算し、
delay()関数その間待ちますが、
delay()関数ではミリ秒単位でしか待ち時間を指定できないので、
delayMicroseconds()関数でマイクロ秒単位で待ちます。
ところがdelayMicroseconds()関数は数ミリ秒までしか正確に
作動しません。したがってまずdelay()関数で残り時間わずか
(1ミリ秒程度)になるまで待って、それからもう一度
delayMicroseconds()関数で目的の時間まで待ちます。ゴルフでたとえるなら
アイアンでよせてパターで入れるという感じ。
- Arduinoのシリアルモニタからコマンドを発行する代わりに
C言語などで書いたプログラムからコントロールすることもできます。
#include
#include ....
...
if(ard=open("/dev/ttyUSB0".O_RDWR)<0){
perror("/dev/ttyUSB0");
}
write(ard,"-30000",6);
....
i=read(ard,buf,sizeof(buf);
...
とか。
そのときは前のページのいろいろも参考に。
- 加減速を行うためにパルス間隔tは現在のパルス数xを変数として用いて
計算式から間隔tを決めます、すなわち、
t=max(a/x,a/(p-x),b)
という式を用いました。ここで、a,bは定数。pは到達点のパルス数。
tが大きいほどパルス
間隔が長くなり回転は遅くなります。加速し始めはmax()の中の第1項が最大
となり、これがtになります。1/xに比例するので、xが大きくなるにつれて
パルス間隔が小さくなります。
ある程度xが大きくなり、第1項が小さくなるとbが最大となりこのとき最高速に
達します。
さらに目的のパルス数pに近づくと第2項が最大になり、減速を始めます。
これで良いかどうかは負荷をかけてみないとわかりませんが。「だんだん加速
最高速、だんだん減速」という雰囲気は出てます。