アフィリエイト広告
アフィリエイト広告

ステッピングモータを回してみる、再び

以前、ジャンク箱にあったステッピングモータを回すというシリーズを、ここここここここここでやりました。このときは最終的に、バイポーラ駆動で、チョッパ制御 (のような方式 ^_^;) で回しました。

こいつを、もう一度回してみようと思います。

今回は、制御が簡単な、バイポーラ駆動でいきます。
で、前回同様、チョッパ制御します。モータに流れる電流を検出して、電流値が大きくなったら切るという、たぶん、かなりの力技。PWM 制御したらどうかなぁとか、さまざま考えはあるんですが、前回の実績があるので、それをそのまま利用しちゃいます。

回路図

ステッピングモータは 24V 仕様なのですが、電流流れすぎて燃えちゃうので、12V で駆動しています。これでも全電圧で電流流すと、燃えます (;´Д`)

MOSFET はゲート IC の出力でも直接駆動できるんですけど、今回はプッシュプルのゲート駆動回路をつけてみました。本来はこうあるべきなんだろうなぁ、ってことで。
モータ電流は、MOSFET のソース側に抵抗をつけて検出してます。バイポーラ駆動の場合と基本的に考え方は同じなんですが、やっぱりなにか少し違うような気も、しないではないです。
電流検出抵抗の両端電圧が 0.12V になるように、コンパレータの基準電圧をボリュームで調整しています。モーター電流は 0.25A ってことになりますね。トルクは大きくありませんが、ちょっとしたものを回すには十分じゃないでしょうか。もっとトルクが必要ならば、電流値を増やします。が、モータや MOSFET の発熱に注意です。

スケッチ

詳細は過去ブログ記事を参照下さい。以下、備忘録的解説です。

  1. const byte A_1 = 9;
  2. const byte A_3 = 10;
  3. const byte B_1 = 11;
  4. const byte B_3 = 12;
  5. byte sequence[] = {B0101, B0110, B1010, B1001};
  6. byte numberOfPhase = sizeof(sequence) / sizeof(sequence[0]);

出力する I/O ピンの名称を定義します。
sequence[] は、2-2 相励磁方式での各コイルの励磁パターンを示します。

  1. void setup() {
  2.   pinMode(A_1, OUTPUT);
  3.   pinMode(A_3, OUTPUT);
  4.   pinMode(B_1, OUTPUT);
  5.   pinMode(B_3, OUTPUT);
  6. }

各 I/O ピンのモード設定です。

  1. void feed(byte s) {
  2.   static byte phase = 0;
  3.   static int period = 50;
  4.   for(byte i = 0; i < s; i++) {
  5.     digitalWrite(A_1, sequence[phase]>>3&1 ? HIGH : LOW);
  6.     digitalWrite(A_3, sequence[phase]>>2&1 ? HIGH : LOW);
  7.     digitalWrite(B_1, sequence[phase]>>1&1 ? HIGH : LOW);
  8.     digitalWrite(B_3, sequence[phase]>>0&1 ? HIGH : LOW);
  9.     phase++;
  10.     if((numberOfPhase - 1) < phase) phase = 0;
  11.     delay(period);
  12.   }
  13.   digitalWrite(A_1, LOW);
  14.   digitalWrite(A_3, LOW);
  15.   digitalWrite(B_1, LOW);
  16.   digitalWrite(B_3, LOW);
  17. }

ステッピングモータを、引数のステップ数だけ回転させる関数です。回転方向は、モータ側から見て時計方向のみにしています。逆転させるときは、phase を逆に進めればよいです。

18 行は、回転速度を規定します。delay() させているので、回転中は他の操作を受け付けません。
20 〜 30 行で、引数分のステップ数を回転させています。
32 〜 35 行で、モータへの給電を停止します。停止中は電圧をかけていませんので、外力がかかると回転してしまいます。給電しておけばモータはロックされますが、燃えます。

  1. void loop() {
  2.   const byte step = 12;
  3.   feed(step);
  4.   delay(5000);
  5. }

あとはお好きにどうぞ。
ここでは、12 ステップ回転させ、5 秒間待って、また回す、を繰り返しているだけです。この程度の動作だと、発熱はほとんど気にならないです。

さて、これでステッピングモータを好きなステップ数だけ回転させることができるようになりました。つぎは、こいつで回すモノを作ってみることにします。

タイトルとURLをコピーしました