製作編8
引き続きソフトウェア開発を進めます。
demo2
demo2では、2つの目標位置を交互に設定し、検出した実位置情報から反転動作に入るタイミング決定します。反転動作に入るときの位置電圧値をシリアル出力します。
シリアルモニタ上のSTOP=に続く数値が反転時の電圧です。これをみる限り惰性による停止位置のずれは確認できません。よく考えてみたら、目標位置検出後にすぐに反転動作に入っているため、ズレが発生しないと理解しました。
demo2a
惰性によるズレを確認するために、目標位置検出後にstop状態を2秒追加してみました。実行時のオシロスコープの波形は以下のとおりです。
波形上では惰性による位置ズレは確認できませんが、この電圧レンジでは位置ズレの確認は無理があると思います。実行時のシリアルモニタの表示は以下のとおりです。
stop表示後に表示2個分、惰性で行き過ぎた数値が表示されています。尚このソフトでは、0.5秒毎に位置電圧表示をさせています。この結果を見ると20mV前後惰性により行き過ぎが発生しているようです。回転角度に換算すると1.2°になります。念のため、残り2つのモーターでも同様の確認を行ってみました。
上がMid-ch用ボリュームで下がHigh-ch用ボリュームの実行結果です。Mid-ch用の惰性による回転量がやや大きく、最大で25mV程度ずれていました。回転角度換算で1.5°になります。このズレ量がどの程度の影響を与えるかわかりませんが、一旦この状態で検討を進める事にします。
demo2b
次は、関数の利用効率を上げる(ソフトサイズを小さくする)ために、3つのボリュームのパラメータを配列化してみます。例えば、demo2aまで制御ステータス用の変数をint cont_lowとしていたものをint cont[3]として宣言し、cont[0]をLow-ch用にcont[1]をMid-ch用、cont[2]をHigh-ch用にしました。このソフトで配列化したパラメータは以下のとおりです。
unsigned long val_pos[3]:actual position
unsigned long val_postt[3]:target position
int cont[3]:status
byte contP[3]:port number for positive move
byte contM[3]:port bumber for reverse move
関数も上記配列変数に対応させました。対象の関数は以下のとおりです。
・void Pos_Read(byte val)
位置電圧値を読みとりval_pos[val]へ格納します
・void jg_cont(byte val)
actual positionとtarget position値から駆動情報cont[val]を決定し格納します。
・void control(byte val)
駆動情報cont[val]に従ってモーター制御用ポートを設定します。
この変更前後のコンパイル画面は以下のとおりです。
パラメータの配列化によってフラッシュメモリ(メインメモリ)の使用量が若干減っています。SRAMの使用量はやや増えています。とは言ってもまだまだ十分に機能追加ができる状態です。次回はモーター間の動作のばらつきを確認し、その補正について検討します。
つづく(制作編9)