ArduinoとA4988ドライバでステッピングモーターの速度制御をしていたのですが、ちょっと勘違いしていたことがありました。
ちゃんと見れば当然な内容なのですが、まぁ思い込みというかちゃんと見てかったせいもあるのですが、回転速度を制御するするときに間違いをしていました。今回はその内容を紹介します。
A4988の使い方は割と単純で、パルスを1回送信すれば、ステッピングモーターが1Step進むというすごく単純なものです。(A4988の使い方はこちら)
ですので例えば「1.8deg/Step」のモーターであれば200回のパルスをArduinoなどのマイコンから送信してあげれば1回転します(フルステップの場合)。
さらに1秒間で200回パルス送信すれば、「1回転/s」という回転速度になり、個人的にはすごく単純で分かり易いドライバーだと思ってます。
▼例えば▼
void loop() { digitalWrite(13, HIGH); delay(1); digitalWrite(13, LOW); delay(1); }
1msごとに13pinをON/OFFしているだけのLチカのような単純なスケッチ(ソース)ですが、この13pinからの出力でA4988経由でモーターが回転します。
回転速度を計算してみます。
- 1.8deg/stepのモーターの場合、1回転は200STEP。
- 先ほどのソースの場合、1msごとにON/OFFをするので2msで1回のパルス送信。
- そのため1秒で500回のパルス送信。
- 1回転は200STEPだから1秒で2.5回転
- 60秒で、、、150rpmの回転速度となります。
(分かり難くてすみません・・・。)上記ソースだといろいろ処理時間が加わるので正確には計算通りにはなりません。イメージでとらえて下さい。
こんな感じで速度が計算できます。ですのでdelay()でパルスの間隔制御すれば、モーターの回転速度もそれに応じて制御できると簡単に考えてました。
いや実際そうなんですけど、その速度変化で思い込みをしてまして・・・、パルス間隔をリニアに変化させればそれに応じて回転速度もリニアに変化すると思い込んでました。
ですが、パルス間隔(周期)と回転速度は反比例するんですよね。比例するのは周波数と回転速度です。当たり前なんですが勘違いしてました。
▼パルス間隔(周期)と回転速度▼
▼パルス周波数と回転速度▼
実際にはdelay()ではなくて、Timer割込みを使って正確にパルス周期をコントロールしていたのですが、この勘違いで制御してて、、中間あたりの解像度が低いせいなのか、実際に感じるモーターの速度変化となんか違うなぁとか思ってしばらくハマってました・・。
コメント