前回は、ステッピングモータをバイポーラ・チョッパ駆動方式で回してみました。
これまでに、ユニポーラ定電圧駆動、バイポーラ定電圧駆動、バイポーラ・チョッパ駆動と試してみて、不完全だけれども、自分なりにステッピングモータの回し方、特徴なんかがわかってきた気がします。
で、今回は、ステッピングモータの加速ってことをやってみたいと考えています。つまりまぁ要するに、ステッピングモータを高速で回してみようぜ、ってこと。
とりあえず高速で回すと、脱調します
ステッピングモータを高速で回すには、スケッチのパルス周期 period の値を小さくすれば良いです。
しかし、ユニポーラ定電圧駆動方式を試してみたとき、パルス周期を 1ms まで短くすると、脱調して起動できませんでした。前回やってみたバイポーラ・チョッパ駆動方式では、パルス周期 2ms で起動できなくなります。
ちなみに「パルス周期」ですが。
ステッピングモータの回転速度は、1 秒間に与えるパルスの数 (PPS) で表します。48 ステップのモータなら 48PPS で毎秒 1 回転します。
なので、パルス周期 2ms は 500PPS 、48 ステップのモータで毎秒 10.4 回転になります。
さて、そこで高速で回すためには「プルイン・トルク領域で起動し、プルアウト・トルク領域まで加速する」という制御が必要なんだと、にわか勉強の meyon さんは考えていました。なんのこっちゃ?ですが、今回は、そいつを試してみようと。
モータ電流を計測してみたら…
図 (1) は、バイポーラ・チョッパ駆動方式で、パルス周期 を 4ms (250PPS) としたときのモータ電流波形です。
上の波形は、H ブリッジ制御信号 A3 です。
制御信号は 4 フェーズの励磁シーケンス、例えば「1100」と出力しますので、オン時間 8ms 、オフ時間 8ms の波形になります。
下がモータ電流。
制御信号 A3 がオンしてから、モータ電流が漸増し、7ms 後にチョッパ制御が始まっています。つまり、モータ電流が十分に流れるまでに 7ms かかる、ということ。
このパルス周期を 3ms にすると、モータは起動しますが、チョッパ動作には至りません。さらにパルス周期を短く 2ms にすると、十分な電流が流れず、起動できなくなってしまいます。
こーゆーときって、オシロスコープとか、役に立つんですよねぇ (;´Д`)
つまりです、パルス周期 2ms では、トルク特性だなんだとゆー以前に、モータが起動できるだけの電流が流れていない、と。
モータに流す電流を大きくする
モータにもっと電流を流すには? そう、電圧を高くする、です。定格電圧 24V のモータなのに、ずっと 12V しか印加してませんでしたから。では、DC24V 電源を用意し ……
待て待て。バイポーラ駆動してるんで、モータのコイル抵抗が倍になってるんですけどぉ。
オームの法則 I = V / R によれば、電流を増やすには電圧を高くするか、抵抗を小さくすれば良いのです。
図 (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 のラインが、今回の実験に使用しているステッピングモータに該当するのではないかと思われます。
たとえば、グラフのモータを、周波数 800PPS 、トルク 500×10-4Nm で回転させようとすると、プルイン・トルクを上回った領域にあるために起動できません。そこで、プルイン・トルクを超えない 200PPS で起動し、その後 800PPS まで加速するという制御を行なうことにします。
これが、ステッピングモータを高速で回す方法です。
ステッピングモータを加速する
では、実際にやってみましょう。
ステッピングモータを、電源電圧 12V 、コイル抵抗 12Ω 、パルス周期 1.4ms (714PPS) でバイポーラ・チョッパ駆動することにしましょう。
しかし、パルス周期 1.4ms では、プルイン・トルクを超えているために起動できませんでした。そこで、パルス周期 5ms (200PPS) で起動し、その後、1.4ms まで加速するようにします。
スケッチです。これまで使ってきたものを、少し変更しました。
- #define SWITCH_ON LOW
- #define SWITCH_OFF HIGH
- const byte FA_IN = 8;
- const byte RA_IN = 9;
- const byte FB_IN = 10;
- const byte RB_IN = 11;
- const byte forwardSwitchPin = 15;
- const byte reverseSwitchPin = 16;
- byte sequence[] = {B1001, B1010, B0110, B0101};
- byte numberOfPhase = sizeof(sequence) / sizeof(sequence[0]);
- void setup() {
- pinMode(FA_IN, OUTPUT);
- pinMode(RA_IN, OUTPUT);
- pinMode(FB_IN, OUTPUT);
- pinMode(RB_IN, OUTPUT);
- }
- void loop() {
- static bool forward = false;
- static bool reverse = false;
- static int phase = 0;
- static unsigned long previousTime = micros();
- static unsigned long pullIn = 5000;
- static unsigned long pullOut =1400;
- static unsigned long times = 96;
- static unsigned long period = 0;
- static int i = times;
- if((SWITCH_ON == digitalRead(forwardSwitchPin)) && !reverse) {
- forward = true;
- } else if((SWITCH_ON == digitalRead(reverseSwitchPin)) && !forward) {
- reverse = true;
- } else {
- forward = false;
- reverse = false;
- }
- if(forward && !reverse) {
- period = pullOut + (((pullIn - pullOut) / times) * i);
- if(period < micros() - previousTime) {
- previousTime = micros();
- phase++;
- if((numberOfPhase - 1) < phase) phase = 0;
- (0 < i) ? i-- : i = 0;
- }
- digitalWrite(FA_IN, sequence[phase]>>3&1 ? HIGH : LOW);
- digitalWrite(RA_IN, sequence[phase]>>2&1 ? HIGH : LOW);
- digitalWrite(FB_IN, sequence[phase]>>1&1 ? HIGH : LOW);
- digitalWrite(RB_IN, sequence[phase]>>0&1 ? HIGH : LOW);
- } else if(!forward && reverse) {
- period = pullOut + (((pullIn - pullOut) / times) * i);
- if(period < micros() - previousTime) {
- previousTime = micros();
- phase--;
- if(0 > phase) phase = numberOfPhase - 1;
- (0 < i) ? i-- : i = 0;
- }
- digitalWrite(FA_IN, sequence[phase]>>3&1 ? HIGH : LOW);
- digitalWrite(RA_IN, sequence[phase]>>2&1 ? HIGH : LOW);
- digitalWrite(FB_IN, sequence[phase]>>1&1 ? HIGH : LOW);
- digitalWrite(RB_IN, sequence[phase]>>0&1 ? HIGH : LOW);
- } else {
- digitalWrite(FA_IN, LOW);
- digitalWrite(RA_IN, LOW);
- digitalWrite(FB_IN, LOW);
- digitalWrite(RB_IN, LOW);
- i = times;
- }
- }
変更箇所。
まず、パルス周期の設定を 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ブラシモータ、ステッピングモータときたモータシリーズは、とりあえずこれで終わりにします。そのうち何か、楽しいものが作れたらいいね (^_^;)