12chアッテネータ2検討(製作編8)

製作編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)