製作編11
キーによる微少駆動処理が完成したので、キー操作で各アッテネーター値の目標抵抗値となるポジションを見つけます。
ATT仕様検討
現行のアッテネーターユニットは-35dB~-6dBを6~3dBステップで刻んでいます。今回は微妙な調整もできるように基本1dBステップで設定可能とします。無意味にステップを増やしても無駄なので0~-25dBまでを1dBステップで、-25~-35dB間を2dBステップとします。後で不都合があれば見直しをします。このアッテネーション値を実現させるためのポジションデータを確認します。
ポジションデータ取得
Low-ch用ボリュームを使って上記のアッテネーション値を実現するための抵抗値を計算してみました。Low-ch用ボリュームの全抵抗値は2010Ωなので、ATT値は以下となります。
ATT値(dB)= 20 x log(抵抗値/2010)
この式を使って観測用のシートを作成しました。
demo6のソフトを使って目標抵抗値を実現するためのポジション値を見つけていきます。オリジナルのdemo6のキーによるUp/Down量は200でしたが、さらに微妙な調整ができるように100にしました。このソフトのキー操作で目標抵抗値となるようにポジションを調整します。近い値となった時の抵抗値とポジション値を記入していきます。全アッテネータ値に関して上記の対応を行いました。結果は以下のとおりです。
結果は目標アッテネータ値に対して近い値となっているので大きな問題は無い様にみえますが、この値に追い込む際のキー操作は大変でした。目標位置に対する誤差が大きく、何度も行き来を繰り返して近い位置のデータを記入しました。移動処理の精度を上げる対策が必要です。
demo8
アッテネーションターゲットをソフトの反映前に、移動精度のアップ対策します。対策内容はdemo8で動作判定用関数jg_cont()にリトライ処理を追加しました。具体的には、cont[x]に設定されている動作状態(正転、逆転、停止)に応じて、判定条件を変えています。具体的には以下のとおりです。
正転時
実ポジションが、目標ポジションを越えていたら逆転設定(リトライ)
逆転時
実ポジションが、目標ポジション以下の場合正転設定(リトライ)
停止時
実ポジションが+/-ok_zone(停止最大許容ポジション)内の場合停止
それ以外の場合は位置に応じて回転設定(リトライ)
動作時の画面は以下のとおりです。
右は実行時のシリアルモニタ画面です。何回かRetry表示が確認できます。例えば画面下は、目標ポジション2450mVの動作時にRetryが6回表示されて、2443mVに着地しえちます。
demo9
demo8までは、k_stat=5で、モーター移動の停止待ちをwhileループで実行していました。同時に3つのモーター制御する場合に問題となるので、ソフトが複雑になる前に対策しておきます。変更は、k_stat=5で動作状態cont[x]==0となった際のみk_statをインクリメントして次の処理に進めます。実行画面は以下のとおりです。
シリアルモニタ上の表示はdemo8と何ら変わりません。
demo10
demo6を使って設定した各ATT値の目標ポジションをソフトに反映しました。目標ポジションは、配列att_par[31]として設定しました。各att_parを読み出す為にatt_numを設定し、下記の処理でval_postt[x]に目標ポジションの設定ができます。
att_num = 0;
val_postt[0] = att_par[att_num];
att_par[x]の値は固定値で書き換えがないので、const設定としてRAMの消費量を押さえています。実行画面は以下のとおりです。
ここで設定した各ATT値は、ソフトの中では使用していません。次のソフトへの準備の位置づけです。次回は実際のアッテネーション動作の確認をします。
つづく(製作編12)