概要
前からステッピングモータはどんな構造になっていて、どうやって動かすのか実際に試してみたいと思っていた。差し当たって秋月のドライブキットと対応する小型のステッピングモータSPG20-332 (キット1200円、モータ250円)を購入して組み立て回してみることにした。
キットを組立る
添付の説明書に基づいて基盤に部品をハンダ付けした。特に問題点はなかったが、以下の点に注意が必要であった。
a) 実際に付属されていたダーリントントランジスタが説明書のそれと違った。念のため付属のトランジスタのピン割付をネット上で確認した。
b) 2相励起 (2-phase Excitation)、ユニポーラ駆動 (Unipolar Drive) でモータを回転させるように出来ている。
c) 別途購入したステッピングモータSPG20-332から出ている6本の線を基盤のどこに接続するか迷った。両方の説明書をよく見て以下の様に接続した。
モータ側コネクタのピン |
F1(白) |
F2(赤) |
F1C(黒) |
F2C(青) |
/F1(黄) |
/F2(緑) |
ドライブキット回路図 |
X |
Y |
+V |
+V |
/X |
/Y |
組立るを終えて、電源を入れ、SW1やSW2を押したら問題なく動作した。 以下のことが分かった。
a) なかなかよく出来ていて2個のスイッチで正転と逆転、さらに、VR1で連続的に速度も変えられる。ただ、VR1の全抵抗域でスムーズに速度は変化せす脱調(同期を失うこと)も起こる。特に高回転域で。
b) 指定された供給電圧は9−12V、しかし指定の最低供給電圧8Vでもモータの発熱が大きく誤配線ではと思ったが当たり前らしい。ネット上でも同じようなことを経験した人が居た。
d) モータへの供給電圧5Vでも動作するので差し当たってこの電圧で動作させることにした。
e) キット説明書のトランジスタの容量は8A位で、かなり大きいステッピングモータも駆動出来そう。
組み上がったドライブ基板とステッピングモータ
上記と同じような動作をするドライブ回路を自作する
上記ドライブキットではPIC16F54にプログラムが入っていて動作をコントロールしている。回路図を参考にさせて貰って、ブレッドボード上に回路を組みいろいろ実験してみることにした。
回路図を以下に示す。このマイクロコントローラPIC16F688を選んだ理由はピンの数が14本と手頃だったことと、前の電子工作47で使用した経験があるからである。また、モータのドライブにトランジスタアレーFT5754M(150V3A 4ch)を使った。ダンパーダイオードが既に組み込んであって外付けが必要なく回路がすっきりした。モータの速度を変えられるように抵抗10Kと可変抵抗VR=10Kで抵抗分圧回路を構成し0−2.5Vの電圧をRA0よりアナログ値として読み取れるようにしてある。ステッピングモータSPG20-332の場合、最大供給電圧は発熱の関係で8V位である。電源V (DC5-12V)は可変三端子レギュレータLM350T(3A)から供給した。この電源線に直列にテスタの端子を入れて電流を測ったところ1つのコイルに通電している時100mA、2つのコイルに通電している時160mAであった。回転時には大体100−160mAの電流が流れることになる。
部品を集めてつくったドライブ回路とスッテップモータを使って実験中
ステッピングモータが回る原理
今回実験に使ったステッピングモータSPG20-332は4相ユニポーラ(4-phase unipolar)型と言われるもので、ステータに巻いてある4つの独立したコイルにある順番に従って電流を流して励磁し、モータの中のロータ―を1ステップずつ回転させるものである。いろんなコイルの励磁方式があり今回は回転がなめらかであるとされる1−2相励磁方式を採用した。下表にコイルの励磁順を示す。つまり、Step0からStep7までの行程を繰り返すとモータが回転する。またStep7からStep0の順に繰り返すとモータは逆転する。さらに各Step間に遅れ時間を入れる必要があり、その値の大きさで回転速度が変わる。
|
X (RC0) |
Y (RC1) |
/X (RC2) |
/Y (RC3) |
Step0 |
H |
L |
L |
L |
Step1 |
H |
H |
L |
L |
Step2 |
L |
H |
L |
L |
Step3 |
L |
H |
H |
L |
Step4 |
L |
L |
H |
L |
Step5 |
L |
L |
H |
H |
Step6 |
L |
L |
L |
H |
Step7 |
H |
L |
L |
H |
H: Coil ON, L: Coil OFF
<<ギヤードステッピングモータSPG20-332の仕様>>
相数: 4
極数: 10
励磁方式: 4相ユニポーラ
ギヤ比: 1/24
基本ステップ角度: 0.75°
1回転ステップ数: 480
コイル抵抗: 68/180W
定格入力: 2W 以内
プログラム
(1) モータを1回転させ、そして逆転させて元にもどる
1回転ステップ数が480なので、1−2相励磁方式では各ステップ毎の回転数が半分になるのでStep0−Step7の8ステップも他の方式(1相や2相励磁方式)の4ステップと等しくなる。 480/4=120となり、Step0−Step7の行程を120回繰り返せばモータは1回転する。したがってStep0−Step7の1行程で3°回転する。1−2相励磁方式なのでStep0−Step7は実質4ステップとなり、実質の1ステップは3°/4=0.75°(基本ステップ角度)となる。1回転ステップ数480は360°/0.75°(基本ステップ角度)で求められる。
<プログラムの説明>
# 以下のプログラムでは、電源スイッチONで最初時計回り(CW)に1回転し、そして逆転(反時計回りCCW)して元に戻る。
# PORTC レジスタに上記表の値を次々に入れていく。
# For n=1 to 120 ... Next n で1回転する
# Pauseus 2500 は2500ms (=2.5ms) の間待てという意味。
# この動作にかかる時間は 2.5msx8x120=2400ms、 2400x2=4800ms=4.8秒、実際にストップウオッチで測ってみると5秒位。プログラム各行の実行時間と手押し遅れ加算されるためだろう。
<実験結果>
# 予想通り正確に動作した。Pauseus 2500(ms) (2500はS値=遅れ時間)では5.5V位で大変スムーズに回転する。
# モータ供給電圧8Vでは待機中を含めモータは手で触れていられなくなるくらい発熱する。4.9V以下では回転しない。16F688のVddが2.0V以下になって動作しなくなるからである。したがって、5、5V位の電圧を加えると良い。十分スムーズに回転し発熱も小さく、さらに動作にかかる時間も5秒と変わらない。{発熱の問題解決: PORTC=%00000000をプログラムの終わりに加えた 2010.11.5}
‘*********************************
'StepMotor1rev.bas - 2010.11.1
'16F688 with internal clock 4MHz (default)
'Controling a step motor (SPG20-332)
'2 switches added: SW1 and SW2
'1 rev-return demo-program
'********Pin connections************
'Pin 1: Vdd (5V)
'Pin 14: Vss (GND)
'Pin 2: PORTA.5: NC
'Pin 3: Not used
'Pin 4: PORTA.3: NC
'Pin 5: PORTC.5: NC
'Pin 6: PORTC.4: NC
'Pin 7: PORTC.3: output - connected to TrArrayP12
'Pin 8: PORTC.2: output - connected to TrArrayP8
'Pin 9: PORTC.1: output - connected to TrArrayP5
'Pin 10: PORTC.0: output - connected to TrArrayP1
'Pin 11: PORTA.2: NC
'Pin 12: PORTA.1: NC
'Pin 13: PORTA.0: NC
'For stepping motor, a voltage of 5-8V is separately supplied.
'****** Program ********
CMCON0=7 'turns off comparator function
TRISC=%11110000 'RC0-3 are outputs
n var word 'counter
n=0
PORTC=%00000000 'Clear PORTC 先ずPORTC レジスタを空にしておく
‘CW 時計回り
For n=1 to 120 ‘120 for 1 revolution 以下の8ステップを120回繰り返す
PORTC=%00001001 'Step7 コイルXとコイル/Yを励磁する
Pauseus 2500 '2.5 ms 次のステップの間に遅れ時間2.5msを入れる。これが回転速度を決める
PORTC=%00001000 'Step6 /Yだけを励磁する
Pauseus 2500
PORTC=%00001100 'Step5
Pauseus 2500
PORTC=%00000100 'Step4
Pauseus 2500
PORTC=%00000110 'Step3
Pauseus 2500
PORTC=%00000010 'Step2
Pauseus 2500
PORTC=%00000011 'Step1
Pauseus 2500
PORTC=%00000001 'Step0
Pauseus 2500
Next n
‘CCW 反時計回り
For n=1 to 120
PORTC=%00000001 'Step0
Pauseus 2500
PORTC=%00000011 'Step1
Pauseus 2500
PORTC=%00000010 'Step2
Pauseus 2500
PORTC=%00000110 'Step3
Pauseus 2500
PORTC=%00000100 'Step4
Pauseus 2500
PORTC=%00001100 'Step5
Pauseus 2500
PORTC=%00001000 'Step6
Pauseus 2500
PORTC=%00001001 'Step7
Pauseus 2500
Next n
PORTC=%00000000 ‘Newly added これで終了時にどのコイルにも電流が流れなくなるので停止時のモータの発熱が防げる(2010.11.5に発見)
End
'****** End of Program ********
'Note:
'melabs U2 Programmer's
configurations 16F688
'FOSC – INTOSCIO; WDTE - Enable; Power-up Timer - Disable
'MCLRpin – InputPin ; BODEN - Enable; Internal External Switch Over – Enable, Fail-Safe Clock Monitor – Enable, CD - Disable;Dtata EPPROM - Disable
(2)
モータを10回転させる
例えば上記のプログラムで時計回りの部分を次のように変える(太字で表示)。勿論実際のプログラムでは*****Program****と’CWの間の省略部分を加えないといけない。
‘*********************************
‘CW 時計回り
For m=1 to 10 ‘m needs to be predefined like “m var WORD” 10回転せよを意味し mは予め定義されないといけない
For n=1 to 120 ‘120 for 1 revolution 1回転させるため以下の8ステップを120回繰り返す
PORTC=%00001001 'Step7 コイルXとコイル/Yを励磁する
Pauseus 2500 '2.5 ms 次のステップの間に遅れ時間2.5msを入れる。これが回転速度を決める
PORTC=%00001000 'Step6 /Yだけを励磁する
Pauseus 2500
PORTC=%00001100 'Step5
Pauseus 2500
PORTC=%00000100 'Step4
Pauseus 2500
PORTC=%00000110 'Step3
Pauseus 2500
PORTC=%00000010 'Step2
Pauseus 2500
PORTC=%00000011 'Step1
Pauseus 2500
PORTC=%00000001 'Step0
Pauseus 2500
Next n
PORTC=%00000000 ‘Newly added これで終了時にどのコイルにも電流が流れなくなるので停止時のモータの発熱が防げる(2010.11.5に発見)
Next m
(3)
2個のスイッチSW1、SW2とVRを追加してモータを正転、逆転、さらに速度を変える
上記の回路図に従って、キットで購入したものと同じような動作をさせようとしたものである。
<プログラムの説明>
# 以下のプログラムでは、SW1を押すとモータは時計回り(CW)に回り、SW2を押すと反時計回り(CCW)に回る。さらにVRを回せば回転速度が10段階に変えられる。
# VRによる速度を変える機能には外付けの抵抗分圧回路からの電圧をAD変換して読込んでいるので設定が結構複雑になった。
# ADCサブルーチンの中の10個のS値は出来るだけ回転速度の変j化がスムーズになるように実験的に決めた。
# ADCサブルーチンの中で例えばIf (150=<Vin) And (Vin<200) Then S=2000 をIf (150=<Vin<200) Then S=2000とすると動作しない。括弧で分けないといけない。発見まで3日間もかかった。
# CWまたはCCWルーチンの8ステップを終了するのにIfで始まるKey-EntryのルーチンとADCサブルーチンを通過しなければならない。この間多分数十ms(?)の演算時間がかかると思われる。例えばADCのsampling時間だけでも50msが必要である。つまり8ステップ毎に数十msの回転が停止する現象が起きるはずである。各ステップ間の遅れ時間S、例えば2500msに比べれば比較的小さい。しかしS=1000msでは1/20位に達しかなりの割合になり気になる。割り込みを使ってこの問題を除けるという情報もあるがプログラム作成は難しそう。
<実験結果>
# VRの全抵抗域(0−10K)でモータが脱調なく動作させるには供給電圧8Vが必要であった。ただ待機中を含めモータは50°C位まで発熱する(発熱の問題解決: PORTC=%00000000をキールーチンの中に加え停止時どのコイルにも電流を流れなくした 2010.11.5)。
# VRで変えられる最大回転速度は約60回転/分(S=1000)で、最小回転速度は約8回転/分(S=8000)であった。低速域で一部ビーというノイズが発生した。
# 供給電圧を変えると上記のノイズが消えるが、他の抵抗域で発生したりする。回転速度と供給電圧の関係は微妙である。
‘*********************************
'StepMotor3.bas - 2010.10.27 Activation Exp. by SW1 and SW2 Worked! good
'16F688 with internal clock 4MHz (default)
'Controling a step motor (SPG20-332)
'2 switches added: SW1 and SW2
'SW1 is being pressed, the motor rotates clockwise while SW2 pressed, it rotates counter clockwise
'ADC is added to control the motor speed.
'********Pin connections************
'Pin 1: Vdd (5V)
'Pin 14: Vss (GND)
'Pin 2: PORTA.5: NC
'Pin 3: Not used
'Pin 4: PORTA.3: NC
'Pin 5: PORTC.5: input - connected to SW1
'Pin 6: PORTC.4: input - connected to SW2
'Pin 7: PORTC.3: output - connected to TrArrayP12
'Pin 8: PORTC.2: output - connected to TrArrayP8
'Pin 9: PORTC.1: output - connected to TrArrayP5
'Pin 10: PORTC.0: output - connected to TrArrayP1
'Pin 11: PORTA.2: NC
'Pin 12: PORTA.1: NC
'Pin 13: PORTA.0: input - analogue input of 0-2.50V from divider(10kR/10kVR)
'For stepping motor, a voltage of 5-8V is separately supplied.
'****** Program ********
Define ADC_BITS 10 '10-bit ADC used
Define ADC_CLOCK 3 'Internal clock used ?
Define ADC_SAMPLEUS 50 'Sample timing =50ms
ADCON0=%10000011
'=131 (decimal) 'bit7=1(right justified),bit6=0(volt refer-Vdd),
'bit5-4=0(unimplemented),bit3-2=00(channel0-An0),
'bit1=1(starts right away),bit0=1(on operation)
ANSEL=%00000001 'AN0 of A/D used
CMCON0=7 'turns off comparator function
TRISA=%00000001 '0-2.5V input from divider
TRISC=%11110000 'RC0-3 are outputs
Vin var word 'AD value
S var word 'Rotation speed Sは回転速度を決める遅れ時間 抵抗分圧回路から読込んだアナログ値がデジタル値に変換されてこの値に入る
SW2 var PORTC.4 'SW2 - Counter Clockwise
SW1 var PORTC.5 'SW1 - Clockwise
Vin=0
Steploop: ‘Wait key-entry SW1またはSW2のキー入力待ちループ
S=0
PORTC=%00000000 ‘Newly added これで終了時にどのコイルにも電流が流れなくなるので停止時のモータの発熱が防げる(2010.11.5に発見)
If SW1=0 then CW ‘Jump to CW CWへ飛べ
If SW2=0 then CCW ‘Jump to CCW CCWへ飛べ
Goto Steploop
'Steploop: '1-2 phase control Wait for key entry
PORTC=%00000000 'Clear PORTC
CW: ‘時計回りルーチン
Gosub ADC ‘Jump to Subroutine ADC サブルーチンADCへ飛べ
PORTC=%00001001 'Step7
Pauseus S ‘ADCで取ってきた値がこのSに入る
If SW1=1 then Steploop
PORTC=%00001000 'Step6
Pauseus S
If SW1=1 then Steploop
PORTC=%00001100 'Step5
Pauseus S
If SW1=1 then Steploop
PORTC=%00000100 'Step4
Pauseus S
If SW1=1 then Steploop
PORTC=%00000110 'Step3
Pauseus S
If SW1=1 then Steploop
PORTC=%00000010 'Step2
Pauseus S
If SW1=1 then Steploop
PORTC=%00000011 'Step1
Pauseus S
If SW1=1 then Steploop
PORTC=%00000001 'Step0
Pauseus S
If SW1=1 then Steploop
Goto Steploop
CCW: ‘時計回りルーチン
Gosub ADC ‘Jump to Subroutine ADC サブルーチンADCへ飛べ
PORTC=%00000001 'Step0
Pauseus S ‘ADCで取ってきた値がこのSに入る
If SW2=1 then Steploop
PORTC=%00000011 'Step1
Pauseus S
If SW2=1 then Steploop
PORTC=%00000010 'Step2
Pauseus S
If SW2=1 then Steploop
PORTC=%00000110 'Step3
Pauseus S
If SW2=1 then Steploop
PORTC=%00000100 'Step4
Pauseus S
If SW2=1 then Steploop
PORTC=%00001100 'Step5
Pauseus S
If SW2=1 then Steploop
PORTC=%00001000 'Step6
Pauseus S
If SW2=1 then Steploop
PORTC=%00001001 'Step7
Pauseus S
If SW2=1 then Steploop
Goto Steploop
ADC: Subroutine ADC サブルーチンADC
S=0
Vin=0
Adcin 0, Vin 'Read ADC ch-0 and save in Vin (range (0-2.50V/0-512): 5V-1024 抵抗分圧回路からアナログ値を読込む
‘Pauseus 50 ‘Wait 50ms 既にADC初期設定で定義されているのでこの行は必要ない
If (Vin<50) then S=1000 ‘得られたVin値の大きさによって以下の10段階に分け、対応するS値が上のPauseus Sで使われる
If (50=<Vin) and (Vin<100) then S=1250 ‘これらのS値はVRを変えた時回転速度変化が出来るだけスムーズになるように実験的に決めた
If (100=<Vin) and (Vin<150) then S=1500
If (150=<Vin) and (Vin<200) then S=2000 'This description using 'AND' was very important! この様に括弧で二つに分けないと動作しない。発見まで3日間もかかった!!!
If (200=<Vin) and (Vin<250) then S=3000
If (250=<Vin) and (Vin<300) then S=4000
If (300=<Vin) and (Vin<350) then S=5000
If (350=<Vin) and (Vin<400) then S=6000
If (400=<Vin) and (Vin<450) then S=7000
If (450=<Vin) then S=8000
Return
End
'****** End of Program ********
'Note:
'melabs U2 Programmer's
configurations 16F688
'FOSC – INTOSCIO; WDTE - Enable; Power-up Timer - Disable
'MCLRpin – InputPin ; BODEN - Enable; Internal External Switch Over – Enable, Fail-Safe Clock Monitor – Enable, CD - Disable;Dtata EPPROM - Disable
<<性能テスト: 1000回モータを回した後で元の位置に戻るか?>>
上記の(2)モータを10回転させると(3)2個のスイッチSW1、SW2とVRを追加してモータを正転、逆転、さらに速度を変えるのプログラムの一部を使って、モータを1000回回転させた後で元の位置に戻るかどうかテストした(モータ軸に時計の分針状の針金を接着して位置をチェック)。特に(3)の場合プログラムの中でADCサブルーチンを使っていて8ステップ毎にsampling時間に50msが要求されるので1000回も回した後ではズレが生じ回転開始位置に正確に戻らないのではと懸念された。結果は予想に反して極めて正確に元の位置に戻ることが分かった。ただ、ADCなど使わない場合にくらべ多少時間(多分50msx120x1000=6 sec+a)が余計にかかっていると思う。(実験に使ったプログラム:(2)ではStepMotor1rev2.bas、また(3)ではStepMotor3a.bas)
結論など
1) モータへの供給電圧Vとステップ間に入れる遅れ時間Sの間の関係はデリケートである。S=1000ms(最速)ではV=8.0V以上でないとスムーズに動作しない(以下だと脱調が起こる)。しかし、S=2500ms(中間速)ではV=5.5V以上でスムーズに動作する。この場合回転速度はV=5.5VでもV=8.0Vでも変わらない。
2) ステッピングモータの特性から予想された通り、プログラムで設定したステップ数だけ正確に回転して停止することがを確認出来た。ただし、プログラムの内容によって所要時間が変わるようだ。つまり、今回の(3)2個のスイッチSW1、SW2とVRを追加してモータを正転、逆転、さらに速度を変えるのようなプログラムでは、時間は多少かかるかもしれないが正確なステップ数を刻むということである。
3) 何に使うか? 今までDCモータを使いマイクロスイッチとソフトで停止位置に止めていたが、ステッピングモータで代替できるかも知れない。ボリュームを回す。ただ回路が結線の多さなどでちょっと複雑になるのが問題。
(追加情報 2010.11.5)
4) モータの発熱防止のためPORTC=%00000000 をプログラムの終わりやキールーチンの中に加え停止時どのコイルにも電流を流れなくした。偶然思いついた!
5) LEDを4個加え4つのコイルへの電流の供給を大雑把にモニタ出来るようにした。大変便利!
追加プログラム (2010.11.6) - 配列(Array)を使って簡潔化した
以下How many turns required?で回したい回転数をRevolution=50などと入力し実行すると50回転して停止する。Pulses=480/4、Pulses= Pulses*Revolutionは480が1回転当たりのステップ数、それをSteps0-Step7までが1−2相励磁方式では実質4ステップなので4で割り、答えに希望する回転数をかけて必要なステップ数(=Pulses数)を計算している。Pulses=(480*Revolution)/4と1行でも良さそうだが、この場合Revolution=100または500を入れても130秒位で回転が止まった。誤動作である。WORD型は16ビットで最大数が65,535という制限があるためのようだ。Revolution数の最大値は546(=65,535/120)となる。実際以下のプログラムでモータを500回転させると大体735秒かかる。
'StepMotorArray.bas - 2010.11.6 Works!
'****** Program ********
CMCON0=7 'Turns off comparator function
TRISC=%11110000 'RC0-3 are outputs
ANSEL=%00000000 ‘No ADC used
Steps var byte[8] ‘配列(Array)を宣言する
Revolution var word ‘Note: WORD's max 16-bit number = 65,535
Pulses var word ‘Number of pulses to be sent
n var byte ‘Counter
m var word
'How many turns required?
Revolution=500 'Rotate 500 times This number must be less than 546 (=65535/120) ここに希望する回転数を入れる。最大546
Steps[0]=%00000001
Steps[1]=%00000011
Steps[2]=%00000010
Steps[3]=%00000110
Steps[4]=%00000100
Steps[5]=%00001100
Steps[6]=%00001000
Steps[7]=%00001001
Pulses=480/4 ‘=120 steps WORDタイプの16bit 65、535制限のためこの様に2行に分ける必要あり
Pulses= Pulses*Revolution ‘Pulses must be less than 546 (=65535/120). because of WORD type
For m=1 to Pulses
For n=0 to 7
PORTC=Steps[n]
Pauseus 1500 '1.5ms
Next n
Next m
PORTC=%00000000 'Cut current supplies to coils コイルへの電流を切る(発熱防止)
Stop
End
‘****** End of Program ********
追加プログラム (2010.11.7) - 大型ステッピングモータを回してみる
この大型のステッピングモータ(下の写真左を参照)は10年以上も前に入手し、いつか動かすことがあるかも知れないと思って保存していたものである。モータの筺体に小生が昔貼り付けた手書きラベルには 「GPF 4915 1.8°/step」 と「F1−赤/白、F2−青/白、F3−赤、F4−青、+5V−黒、白」 とだけ書いてあり、それ以上の詳細な仕様は不明である。Web上でも見つからなかった。6本の線が出ているので4相のユニポーラ型で構造は上述の小型ステッピングモータSPG20-332と原則同じではと考えた。そして内蔵のコイルの抵抗を測ったら4個のコイルとも抵抗が4.8Wであった。電源が5Vの場合5/4.8=1A位の電流が流れるので1ー2相励磁方式の場合1ー2Aの電流(平均1.5A)が流れる計算になる。一方、1ステップ毎に1.8°回転するので200ステップ(=360°/1.8°)で1回転する。SPG20-332は1回転480ステップなので、同じ駆動回路につなげると前者は後者の480/200=2.4倍速く回転することになる。SPG20-332で使った回路に結線したらすぐ動作した。上記の配列を使ったプログラムStepMotorArray.basでRevolution(回転数)に500を入れて回転させたら12min13sec後に停止した。その間前者SPG20-332は500回、後者は1200回それぞれ回転して停止した(下の写真右を参照)。実験では遅れ時間1.5ms、電源5V強(ちょうど5Vでは回転を始めないことがある)から10V位まで試したところ6V以上でスムーズに回転した。6Vで大型と小型の2つのステッピングモータを回転させている時のシステム全体の電流を測定したところ0.69A位で予想した値1.5Aよりずっと低かった。理由は不明である。回転速度を決めるステップ間の遅れ時間をこれまでの1.5msから4.0msに変えると電源の供給電圧を上げることが出来なくなりほぼ6.40Vで固定。そして電流も0.95Aに上昇した。モータも軽いゴツゴツ音と振動を出して回転した。そして設定した回転数500x2.4=1200回に達しても停止せず正常に動作しなかった。以上から遅れ時間は1.5ms−2.0ms位がスムーズに回転させるに良いと思われる。
まとめ
1) この大型のステッピングモータも1−2相励磁方式でスムーズに回転させることが出来ることが分かった。2相励磁方式も試したがちょっとゴツゴツした回転であった、
2) 供給電圧や遅れ時間の設定が結構厳しい。一応、5−10V、遅れ時間1.5ms−2.0msが良いようだ。
3) 条件にもよるが電流は最大で1A位消費する。モータに負荷をかけると大きくなる。
4) ステッピングモータを使うときは予め実験して動作を確認することが絶対に必要。
、
直径55mmx高さ50mmx軸長15mm、重さ450g 大小2つのステッピングモータが回転中
追加情報 (2010.11.13)― 中型ステッピングモータを回してみる
秋葉原詣で実験するのに手頃な大きさの中古ステッピングモータを見つけ購入した(日米無線電機 \400)。6本の線が出ていたのでユニポーラ型と判断した。重量は120−130gほど。
仕様(本体に貼ってあるラベル):
1.
Type KP39FM2-020
2.
1.8DEG/STEP
3.
No.0829 Japan Servo Co.,Lted., Made in
Singapore, AE28973
Web上でKP39FM2-020などで検索してもデータ見つからず。一番知りたかったことは6本線を上述のPICを使ったステッピングモータ制御回路への結線法である。同じメーカのKH39FM2-801のデータが見つかった。結線法も載っていたのでこのモータで試してみたら首尾よく動作した(プログラムStepMotorArray.bas)。原則KP39FM2-020と同じと考えられるKH39FM2-80の結線図と線色などの関係を下表に示す。
Pin No. |
1 |
3 |
5 |
7 |
9 |
11 |
Phase |
A |
Acom |
/A |
B |
Bcom |
/B |
Wire color |
Black |
Red |
Brown |
Yellow |
Blue |
Orange |
SPG20-332の結線図との関係: A=X, Acom=電源(>+5V)、/A=/X、B=Y、Bcom=電源(>+5V)、/B=/Y
まとめ
1)
4相のユニポーラ型で、結線図はKH39FM2-80のそれと同じだった。PICを使ったステッピングモータ制御回路へ既に試験した他の2個のモータ同様に接続してそのまま動作した。
2)
6V位から安定して動作する。しかし、指で軸を抑えると比較的簡単に空転を起こす。電圧を上げて12V位にすると力強さが増し指で押さえてもなかなか空転しない。したがってこのモータの実用供給電圧は12V位と思われる。
3) 各コイルの抵抗は77Wで、したがって駆動時消費される電流は1つのコイルで0.156A(12V/77W)、2つのコイルではその2倍の300mAになる。平均して200mA強消費される。
追加情報 (2010.11.18)― 小型ステッピングモータを回してみる
部品箱を漁っていたら6本線の小型のステッピングモータが見つかった。
仕様(本体に貼ってあるラベルを含め):
1. SP2−418
2. Copal Co.,Ltd.
3. 0188271
4. 大きさ: F20XH25mm、重さ: 16−17g
これしか分からない。何しろ古いものなのでWeb上で検索してもDatasheetのようなものは見つからなかった。したがって、トライアル&エラーで上述のPICを使ったステッピングモータ制御回路への結線法を見出すために6本の線間の抵抗を測定して以下のような結果を見出した。
PICを使ったステッピングモータ制御回路への結線
Phase |
X |
Vdd |
/X |
Y |
Vdd |
/Y |
Wire color |
Yellow |
Green |
White |
Blue |
Green |
Red |
以下の様なプログラムでこのステッピングモータを回転させてみると、正確に1回転して停止する。Step0−Step7の8ステップは1−2励磁法では4ステップと同じなので、これを10回繰り返すと(For n=1 to 10)4X10=40ステップになる。つまりこのモータを1回転させるのに40ステップ必要になる。したがって1ステップ毎に回転する角度は360°/40=9°と計算される。
'****** Program StepMotor2rev.bas ********
CMCON0=7 'turns off comparator function
TRISC=%11110000 'RC0-3 are outputs
n var word 'counter
n=0
PORTC=%00000000 'Clear PORTC
For n=1 to 10 ‘Repeat 10 times これでモータはちょうど1回転する
PORTC=%00001001 'Step7
Pauseus 5000 '5 ms
PORTC=%00001000 'Step6
Pauseus 5000
PORTC=%00001100 'Step5
Pauseus 5000
PORTC=%00000100 'Step4
Pauseus 5000
PORTC=%00000110 'Step3
Pauseus 5000
PORTC=%00000010 'Step2
Pauseus 5000
PORTC=%00000011 'Step1
Pauseus 5000
PORTC=%00000001 'Step0
Pauseus 5000
next n
C=%00000000 'Clear PORTC Stop newly added - overheating (found 2010.11.5)
End
まとめ
1) 4相のユニポーラ型で、ステップ角は9°であった。つまり随分と荒っぽいステップで回転することが分かった。このモータの内部結線図は上述のSPG20−332、大型、中型モータのそれと原則同じであった。PICを使ったステッピングモータ制御回路へ接続したら特に問題もなく動作した。
2) 高速で回転する。しかし、小さいのであまりトルクはない。遅れ時間 Pauseus=900から5000msまで試した。
3) 上記のプログラムの場合5Vでは起動せず、6V位から安定して動作する。一応、12V位まで試した。高速回転する遅れ時間 Pauseus=900の場合、電圧を10V以上にしないと回転しない。
すなわち、遅れ時間で決まる回転速度と電源電圧の関係はかなり微妙である。一般に、回転速度が上がるにつれ、スムーズに回転するために要求される電圧も高くなる。
4) 4つのコイルの抵抗は61−64Wで、したがって駆動時消費される電流は1つのコイルで約100mA、2つのコイルではその2倍の200mAになる。平均して150mAほど消費される。
5) 既述の2個のスイッチSW1、SW2とVRを追加してモータを正転、逆転、さらに速度を変えるプログラム'StepMotor3.basが見事にこのステッピングモータでも動いた。ただ、VRを低速域を選んだ場合は電源電圧が低めで(ただし、>6V)、高速域の場合8−12V位でスムーズに回転する。