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

製作編16

3つのボリュームの単体動作確認が終わったので、3つのボリュームの同時制御を行います。

同時制御について

ボリューム単体制御ができた時点で、シーケンシャルにボリュームを制御する事を考えてみました。その場合の欠点は以下のとおりです。

・ボリューム制御中の音の高域、低域のバランスが崩れる

・シーケンシャルで駆動するとボリューム調整時間が長くなる

・ボリューム制御中Muteをかけると、無音期間が長く違和感がある

という事で当初の方針どおり、3つのボリュームの同時制御を検討します。ソフト作成および修正で考慮した点は以下の通りです。

・各処理内でのwaitは無くし、効率的に同時処理を行う

・各k_stat内で3つのモーター処理を行う

・各k_stat内で3つのモーター処理が全て終了してから次のk_statへ進む

demo19をベースとして、上記を念頭に同時処理ソフトを作成します。

demo20

3つのボリュームに対する処理は、forループでLow-ch→Mid-ch→High-chと順に行います。例としてキーが確定し、目標ポジションが決定した後のcase 5について説明します。

この処理は、Low-ch決め打ちで「現在ポジションの読みとり」「制御方向の判定」「モーター制御」を繰り返し、制御の方向cont[0]=0(停止)を待ち、停止を確認したらタイマーをセットして次のk_statへ進む処理です。これを以下のとおりに書き換えます。

3つのボリュームに対して順に「現在ポジションの読みとり」「制御方向の判定」「モーター制御」の処理を繰り返します。すでに目標ポジションに到達したボリュームに対してもお構いなしに上記の処理を行い、後半部分では3つ全てのcont[i]=0を待ち、確認した時点でタイマーセットと次のk_statへ進みます。単体制御時に比べて、各モーターをケアする速度が1/3になるため、精度への影響が心配です。このような処理を合計3カ所(void setup();ボリューム初期化、case 5、case 6)に追加しました。無事コンパイルが完了し、ソフトをマイコン基板の転送しました。動作は最初は安定していましたが、あるポジションで収束しない状況が発生しました。試しに、モーター駆動PWM信号のデューティーを170から150に下げたところ、収束不良は改善しました。但し、収束に時間のかかる事が頻発したため、停止判定許容幅ok_zoneを5から10に変更したところ動作が安定しました。

このソフトを使ってアッテネーションの動作確認を行います。各ボリュームのチャンネル1のアッテネーション値を、ソフトで設定した全アッテネーションレベルで測定しました。測定にはマルチメーターの繋ぎ換えが必要な為、手間がかかりました。結果は以下のとおりです。

測定は途中まで順調でしたが、-7dBで収束不良が発生した為、測定を終了しました。シリアルモニタ画面のActual position値を見ると、駆動が十分できていない感じだったため、一度変更したデューティーを150から170に戻しました。当初の設定との違いは、ok_zoneが5から10に増やしている点です。気分を切り替えて、再度測定を行いました。結果は以下のとおりです。

ok_zoneを10に増やした事で、精度への影響を心配していましたが、実用域では偏差が概ね0.5dB以内に収まっていました。各アッテネーション値のポジション検討を行ったLow-1が一番偏差が少なくなっています。アッテネーション動作の検証は一旦ここで終了し、他の部分の設計および検証を行いたいとおもいます。

 

つづく(製作編17)