脱調の原因を理解したところで、ステッピングモーターの回転スピードを上げる方法を解説していきます。
ポイントは「1)最高速度を設定する」「2)急激な速度変化を避ける」の2点です。このポイントを考慮して、マイクロマウスがステッピングモーターで迷路の1区間を走っているスピード変化を図にすると、画像1のような台形になります。このような駆動方式を「台形駆動」といいます。
ポイント1)に関しては、ソースコード内で最高スピードを設定すればいいだけなので、簡単に解決できます。一方、ポイント2)を実現する方法は幾つかあります。例えば、加速テーブルを用意して、少しずつパルス間隔を短くしていくのも1つです。本稿では、等加速度の方式を採用することにします。
1区画180mmを進んで停止する場合、モーターの動きは次の3ブロックに分かれます(画像1)。
このとき、aとcに掛ける時間(=モーターのステップ数)は同じになります。もし、マイクロマウスが1区画ごとに停止しながら迷路内を走るのであれば、減速を開始するタイミングは事前に決定できます。
しかし、実際の競技では、長い直線区間は一気に駆け抜けたいものです。また、カーブの連続では、最高速度に達しないうちに減速する場合もあります。つまり、走行中に減速を開始する位置を算出する必要があるのです。それを念頭において、1区画進んで停止するプログラムを考えていきましょう。
aブロック、cブロックのように、徐々にスピードを変化させるためには、タイマー割り込みを活用します。1msごとに加速値(G_AccelValue)の分だけパルス間隔を短くしていき、ステッピングモーターの回転を変化させていくわけです(画像2)。
CMT割り込み処理(int_cmt0)には、2つの機能があります。1つ目は、モーターコントローラーから、最高速度と加速値をもらい、現在速度を次第に上げていきます。それをMTUにセットするために、ctrl_mtuを呼び出します。2つ目は、最高速度になるまでのパルス数をカウント(G_accelCount)します。
モーターコントローラーのctrl_waitは、減速地点を判断するために、常にG_accelCountを監視しており、減速地点にきたらG_AccelValueをマイナス値にし、減速を開始します。
ctrl_mtuは、先ほどCMT割り込みから現在速度を指示されました。それをパルス周期に変換し、MTUにセットしようとします。MTUは、常にカウントしているため、途中でパルス周期を変更できません。そこで、バッファとなるTGRCに、次のパルス周期をセットしておきます。MTUは、コンペアマッチのタイミングで、バッファの値を新しいパルス周期として設定します。これを「MTUのバッファ動作」といいます。
……といった感じで、ステッピングモーターの回転スピードを上げるには、こういった処理が必要になるんだよ。
なるほど〜。バッファ動作で、“次のパルス周期を告知してる”って感じですね。
そうそう。
じゃあ、前回作ったプログラムに、台形駆動の処理を入れてスピードアップさせてみようか!!
はいっ!!
Copyright © ITmedia, Inc. All Rights Reserved.