ArduinoUNO+RepRapA4988でステッピングモータを台形加速させる
前回に引き続き今回もArduinoUNOとA4988 でステッピングモータを動かす。前回のスケッチは、loop関数をdelayで周期を規定してステッピングモータを動かした。
しかし、これではステッピングモータの回転数を変えたらloop関数の周期も変わってしまい、他の処理を入れたら上手く動作しなくなってしまう。例えばLEDを一定周期を点滅させることとステッピングモータの速度を変えることの両立が出来なくなる。 それでは困るので、今回はArduinoUNOのマイコンATmega328のタイマ割り込みを使用してステッピングモータの速度を変える。
使用するハードウェア
- バイポーラステッピングモータ(PKP246D15B2)
- RepRapA4988
- ArduinUNO
台形加速
ステッピングモータの速度を変えるときに注意することとして、停止状態からいきなり早い速度を指示しても回転しないということだ。ステッピングモータは”パルス周期”と”出力軸の回転周期”との差があると、ステッピングモータはトルクを発生させてパルス周期に追従しようとするが加速に必要なトルクが出せないときに”脱調”という出力軸が回転しない現象が起きる。
そのため、停止状態から速い速度でステッピングモータを回転させたいときは、時間をかけて加速する必要がある。この加速と減速を線形で行う”台形加速”が一般的に使用されている。
下に台形加速のイメージを示す。これは後述するArduinoスケッチで生成した速度指令値の時間変化で、線形で加速した後に定速になり、線形で減速している様子がわかる。
この台形加速をパルス出力するには下の方法が考えられる。
- PWM出力してPWM周期をDuty比を50%で固定して周期のみ変更
- loop関数の周期を早くして、その周期の倍数でパルス周期を設定する
- loop関数の周期をパルス周期に合わせて変化させる
- タイマー割り込みを使用して割り込み関数でGPIOを操作し、パルス周期に合わせて割り込み周期を変化させる
- タイマー割り込み周期の倍数でパルス周期を設定する
これらの内、ステッピングモータを1つだけしか動かさないなら”PWMかタイマ割り込みの周期変更”、複数あるなら”タイマー割り込み周期の倍数で設定”がよいだろう。loop関数で色々行うと、機能を追加・変更した場合支障をきたす可能性があるのでやりたくない。
今回は、タイマー割り込み関数の周期を変更することで実現する。
タイマー割り込み設定
タイマー割り込みの設定は下の4行で行われる。 これはArduino共通の変数ではなく、ArduinoUNOのマイコン(ATmega328P)のレジスタであり、他のボードでは別のレジスタ名の可能性がある。今回はTimer1を使う。Timer1は16bitタイマーなのでOCR1Aは65535まで設定できる。
TCCR1A = 0; // 通常モード TCCR1B = bit(WGM12) | bit(CS11); // CTC1設定 + クロック周期/8 TIMSK1 = bit (OCIE1A); // コンペアマッチAで割り込み OCR1A = 999; //コンペアマッチ定数Aの設定
そして、Timer1でコンペアマッチした際に呼び出される割り込み関数は下の関数だ。これも割り込みベクタであらかじめ規定されているので、他のボードだと違う名前の可能性がある。
ISR(TIMER1_COMPA_vect){ //タイマー割り込みでの処理内容 }
スケッチ
台形加速させたArduinoUNOのスケッチを下に示す。ATmega328Pの周辺機能を直接操作しているので、他のArduinoボードで動くかは不明。 また、Timer1のコンペアマッチレジスタに直接値を入れているので、速度指示はrpmなどの単位ではない。
参考にさせて頂いたサイト
Gammon Forum : Electronics : Microprocessors : Interrupts
実行結果
ステッピングモータを上のスケッチで台形加速させた結果を下に示す。正常に台形加速していることがわかる。
8周遅れのArduino(ArduinoUNOでステッピングモータを台形加速)