連載
» 2013年05月07日 10時00分 公開

マイクロマウスで始める組み込み開発入門(13):台形駆動で脱調を克服! ステッピングモーターをスピードアップ (2/3)

[三月兎,MONOist]

 脱調の原因を理解したところで、ステッピングモーターの回転スピードを上げる方法を解説していきます。

 ポイントは「1)最高速度を設定する」「2)急激な速度変化を避ける」の2点です。このポイントを考慮して、マイクロマウスがステッピングモーターで迷路の1区間を走っているスピード変化を図にすると、画像1のような台形になります。このような駆動方式を「台形駆動」といいます。

 ポイント1)に関しては、ソースコード内で最高スピードを設定すればいいだけなので、簡単に解決できます。一方、ポイント2)を実現する方法は幾つかあります。例えば、加速テーブルを用意して、少しずつパルス間隔を短くしていくのも1つです。本稿では、等加速度の方式を採用することにします。

 1区画180mmを進んで停止する場合、モーターの動きは次の3ブロックに分かれます(画像1)。


台形駆動のイメージ図 画像1 「台形駆動」のイメージ図。現在速度の描く軌跡が台形になっている。図中の()内は、プログラムに使用している変数名。aで徐々に速度を上げて、bで最高速度を保ち、cで徐々に速度を落としている【※画像クリックで拡大表示】

 このとき、acに掛ける時間(=モーターのステップ数)は同じになります。もし、マイクロマウスが1区画ごとに停止しながら迷路内を走るのであれば、減速を開始するタイミングは事前に決定できます。

 しかし、実際の競技では、長い直線区間は一気に駆け抜けたいものです。また、カーブの連続では、最高速度に達しないうちに減速する場合もあります。つまり、走行中に減速を開始する位置を算出する必要があるのです。それを念頭において、1区画進んで停止するプログラムを考えていきましょう。

 aブロック、cブロックのように、徐々にスピードを変化させるためには、タイマー割り込みを活用します。1msごとに加速値(G_AccelValue)の分だけパルス間隔を短くしていき、ステッピングモーターの回転を変化させていくわけです(画像2)。

CMTが追加 画像2 前回の「画像4 モーター制御プログラムの概念図」にCMTが追加される【※画像クリックで拡大表示】

 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のバッファ動作」といいます。

MTUのバッファ動作イメージ図 画像3 「MTUのバッファ動作」のイメージ図。前回記述したMTUの初期化内(ソースコード3)バッファ動作を設定しています【※画像クリックで拡大表示】

プログラムの追加

北上

……といった感じで、ステッピングモーターの回転スピードを上げるには、こういった処理が必要になるんだよ。


えみ

なるほど〜。バッファ動作で、“次のパルス周期を告知してる”って感じですね。


北上

そうそう。

じゃあ、前回作ったプログラムに、台形駆動の処理を入れてスピードアップさせてみようか!!


えみ

はいっ!!



Copyright © ITmedia, Inc. All Rights Reserved.