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

ステッピングモータを高速で回してみた

前回は、ステッピングモータをバイポーラ・チョッパ駆動方式で回してみました。

ステッピングモータをチョッパ駆動で回してみる
とうとう買っちゃいましたよ、オシロスコープ。OWON の SDS1102 です。だんだんと電子工作の沼に沈み込む meyon さんであります (^_^;) 閑話休題。 前回は、ステッピングモータをバイポーラ駆動で回してみました。 今回は、こ...

これまでに、ユニポーラ定電圧駆動、バイポーラ定電圧駆動、バイポーラ・チョッパ駆動と試してみて、不完全だけれども、自分なりにステッピングモータの回し方、特徴なんかがわかってきた気がします。

で、今回は、ステッピングモータの加速ってことをやってみたいと考えています。つまりまぁ要するに、ステッピングモータを高速で回してみようぜ、ってこと。

とりあえず高速で回すと、脱調します

ステッピングモータを高速で回すには、スケッチのパルス周期 period の値を小さくすれば良いです。

しかし、ユニポーラ定電圧駆動方式を試してみたとき、パルス周期を 1ms まで短くすると、脱調して起動できませんでした。前回やってみたバイポーラ・チョッパ駆動方式では、パルス周期 2ms で起動できなくなります。

ちなみに「パルス周期」ですが。
ステッピングモータの回転速度は、1 秒間に与えるパルスの数 (PPS) で表します。48 ステップのモータなら 48PPS で毎秒 1 回転します。
なので、パルス周期 2ms は 500PPS 、48 ステップのモータで毎秒 10.4 回転になります。

さて、そこで高速で回すためには「プルイン・トルク領域で起動し、プルアウト・トルク領域まで加速する」という制御が必要なんだと、にわか勉強の meyon さんは考えていました。なんのこっちゃ?ですが、今回は、そいつを試してみようと。

モータ電流を計測してみたら…

図 (1) は、バイポーラ・チョッパ駆動方式で、パルス周期 を 4ms (250PPS) としたときのモータ電流波形です。

図 (1) パルス周期 4ms 時のモータ電流

上の波形は、H ブリッジ制御信号 A3 です。
制御信号は 4 フェーズの励磁シーケンス、例えば「1100」と出力しますので、オン時間 8ms 、オフ時間 8ms の波形になります。

下がモータ電流。
制御信号 A3 がオンしてから、モータ電流が漸増し、7ms 後にチョッパ制御が始まっています。つまり、モータ電流が十分に流れるまでに 7ms かかる、ということ。

このパルス周期を 3ms にすると、モータは起動しますが、チョッパ動作には至りません。さらにパルス周期を短く 2ms にすると、十分な電流が流れず、起動できなくなってしまいます。

こーゆーときって、オシロスコープとか、役に立つんですよねぇ (;´Д`)
つまりです、パルス周期 2ms では、トルク特性だなんだとゆー以前に、モータが起動できるだけの電流が流れていない、と。

モータに流す電流を大きくする

モータにもっと電流を流すには? そう、電圧を高くする、です。定格電圧 24V のモータなのに、ずっと 12V しか印加してませんでしたから。では、DC24V 電源を用意し ……

待て待て。バイポーラ駆動してるんで、モータのコイル抵抗が倍になってるんですけどぉ。
オームの法則 I = V / R によれば、電流を増やすには電圧を高くするか、抵抗を小さくすれば良いのです。

図 (2) コイルを半分にしてモータ電流を大きくする

図 (3) コイル抵抗 12Ω 、パルス周期 4ms 時のモータ電流

図 (2) のように、モータコイルのセンタータップを使って、コイル抵抗を半分の 12Ω にしてみましょう。

抵抗 24Ω 、パルス周期 4ms 時のモータ電流値は 0.09A でした。これを、抵抗 12Ω に結線変更すると、モータ電流は 0.21A に増えました。

図 (3) が、抵抗 12Ω 時のモータ電流波形です。
上は制御信号 A3 です。下がモータ電流信号のオペアンプ出力。

電流の立上りがすごく速くなりました。
制御信号 A3 のオンからチョッパ制御が始まるまでの時間は 2ms まで縮まっています。

パルス周期を小さくしてみましょう。
3ms でもしっかりチョッパ制御がかかるほどに電流が流れます。問題ありません。
2ms ではどうでしょう。チョッパ制御はかかります。電流はしっかり流れているようですが、起動できるのは数回に 1 回で、ほぼ失敗します。

どうやらここが、起動時のトルクの限界のようです。これが「プルイン・トルク」です。

「プルイン・トルク」と「プルアウト・トルク」

電源電圧 12V 、コイル抵抗 12Ω 、パルス周期 2ms (500PPS) では、ステッピングモータは起動に失敗します。
が、ときどき、うまく起動できることがあります。起動できたときは、その後は安定して回り続けます。それどころか、多少負荷をかけても脱調することはありません。
負荷をさらに大きくしていくと、あるところで脱調します。これが「プルアウト・トルク」です。

図 (4) は、ステッピングモータ PM42L-048 のトルク特性です。
右のグラフがバイポーラ・チョッパ駆動時のトルク特性で、オレンジの MS50 のラインが、今回の実験に使用しているステッピングモータに該当するのではないかと思われます。

https://product.minebeamitsumi.com/product/category/rotary/steppingmotor/pm/parts/PM42L048.html

たとえば、グラフのモータを、周波数 800PPS 、トルク 500×10-4Nm で回転させようとすると、プルイン・トルクを上回った領域にあるために起動できません。そこで、プルイン・トルクを超えない 200PPS で起動し、その後 800PPS まで加速するという制御を行なうことにします。

これが、ステッピングモータを高速で回す方法です。

ステッピングモータを加速する

では、実際にやってみましょう。

ステッピングモータを、電源電圧 12V 、コイル抵抗 12Ω 、パルス周期 1.4ms (714PPS) でバイポーラ・チョッパ駆動することにしましょう。
しかし、パルス周期 1.4ms では、プルイン・トルクを超えているために起動できませんでした。そこで、パルス周期 5ms (200PPS) で起動し、その後、1.4ms まで加速するようにします。

スケッチです。これまで使ってきたものを、少し変更しました。

  1. #define SWITCH_ON LOW
  2. #define SWITCH_OFF HIGH
  3. const byte FA_IN = 8;
  4. const byte RA_IN = 9;
  5. const byte FB_IN = 10;
  6. const byte RB_IN = 11;
  7. const byte forwardSwitchPin = 15;
  8. const byte reverseSwitchPin = 16;
  9. byte sequence[] = {B1001, B1010, B0110, B0101};
  10. byte numberOfPhase = sizeof(sequence) / sizeof(sequence[0]);
  11. void setup() {
  12.   pinMode(FA_IN, OUTPUT);
  13.   pinMode(RA_IN, OUTPUT);
  14.   pinMode(FB_IN, OUTPUT);
  15.   pinMode(RB_IN, OUTPUT);
  16. }
  17. void loop() {
  18.   static bool forward = false;
  19.   static bool reverse = false;
  20.   static int phase = 0;
  21.   static unsigned long previousTime = micros();
  22.   static unsigned long pullIn = 5000;
  23.   static unsigned long pullOut =1400;
  24.   static unsigned long times = 96;
  25.   static unsigned long period = 0;
  26.   static int i = times;
  27.   if((SWITCH_ON == digitalRead(forwardSwitchPin)) && !reverse) {
  28.     forward = true;
  29.   } else if((SWITCH_ON == digitalRead(reverseSwitchPin)) && !forward) {
  30.     reverse = true;
  31.   } else {
  32.     forward = false;
  33.     reverse = false;
  34.   }
  35.   if(forward && !reverse) {
  36.     period = pullOut + (((pullIn - pullOut) / times) * i);
  37.     if(period < micros() - previousTime) {
  38.       previousTime = micros();
  39.       phase++;
  40.       if((numberOfPhase - 1) < phase) phase = 0;
  41.       (0 < i) ? i-- : i = 0;
  42.     }
  43.     digitalWrite(FA_IN, sequence[phase]>>3&1 ? HIGH : LOW);
  44.     digitalWrite(RA_IN, sequence[phase]>>2&1 ? HIGH : LOW);
  45.     digitalWrite(FB_IN, sequence[phase]>>1&1 ? HIGH : LOW);
  46.     digitalWrite(RB_IN, sequence[phase]>>0&1 ? HIGH : LOW);
  47.   } else if(!forward && reverse) {
  48.         period = pullOut + (((pullIn - pullOut) / times) * i);
  49.         if(period < micros() - previousTime) {
  50.           previousTime = micros();
  51.           phase--;
  52.           if(0 > phase) phase = numberOfPhase - 1;
  53.           (0 < i) ? i-- : i = 0;
  54.     }
  55.     digitalWrite(FA_IN, sequence[phase]>>3&1 ? HIGH : LOW);
  56.     digitalWrite(RA_IN, sequence[phase]>>2&1 ? HIGH : LOW);
  57.     digitalWrite(FB_IN, sequence[phase]>>1&1 ? HIGH : LOW);
  58.     digitalWrite(RB_IN, sequence[phase]>>0&1 ? HIGH : LOW);
  59.   } else {
  60.     digitalWrite(FA_IN, LOW);
  61.     digitalWrite(RA_IN, LOW);
  62.     digitalWrite(FB_IN, LOW);
  63.     digitalWrite(RB_IN, LOW);
  64.     i = times;
  65.   }
  66. }

変更箇所。

まず、パルス周期の設定を ms から μs にするために、millis() を micros() に変更しています。

26~27 行目は、起動時と運転時のパルス周期で、それぞれ 5000μs 、1400μs としています。
28 行目は、パルス周期を変化させるステップ数です。96 を指定していますので、モータ起動から 2 回転で運転周期に到達します。

43 、57 行目。loop() を一周するたびに、周期 period を漸減していきます。
48 、62 行目。運転周期に達したら、その後はその周期を継続します。
77 行目。モータが停止したら、ステップ数をリセットします。

これで、ステッピングモータをパルス周期 1.4ms (714PPS) で回せるようになりました。
けっきょく 24V 電源は使いませんでしたが、電源を 24V にして電流値を増やしたら 1ms で回せるかもしれません。うーん、24V なぁ、需要ないなぁ (;´Д`)

モータシリーズは、終了です

チョッパ駆動を試してみて、感じたこと。

定電圧駆動では、モータがかなり発熱します。電圧を落とすと少し改善しますが、やっぱり熱くなります。しかも、電圧落とすとトルクが出なくなってしまいます。
チョッパ駆動 (定電流駆動) では、電圧が十分あれば電流が少なくてもトルクは出ます。電流減らすと、発熱もかなり抑えられます。これ、ステッピングモータ回すのに良い方法ですね。

では、サーボモータ、DCブラシモータ、ステッピングモータときたモータシリーズは、とりあえずこれで終わりにします。そのうち何か、楽しいものが作れたらいいね (^_^;)

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