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

製作編13

引き続きボリュームのポジション移動の精度改善検討を行います。

demo13

demo12で停止判定条件の見直しをしましたが、結果をみると逆効果だったように思えたので、元に戻してみます。demo13の判定条件を図にしてみました。

図の左側がUp時の判定条件で、センターがDown時の判定条件です。図のとおりUp/Downのどちらも目標位置を通り過ぎた時点で反転のリトライ動作に入ります。右側は停止状態です。現実的にはないとおもいますが、停止状態で判定zoneを外れると外れた位置に応じてUp/Down動作に入ります。それではdemo13を使って前回同様に動作精度の確認を行います。Up→Down→Up→Downの動作を行い、ばらつき確認を行いました。結果は以下のとおりです。

結果を見るとdemo12と比べてあまり改善はありませんでした。やれやれ。

demo14

手がなくなってきたので、最後の手段として考えていた駆動ポートのPWM制御を試してみます。arduino UNOには合計6本のPWM駆動可能な出力ポートがあり、今回3つのモータの駆動をその6本に割り当てていました。PWM信号の周波数は490Hzで簡単に出力することができます。従来ソフトは制御ポートを駆動状態とするに以下のとおり記述していました。

digitalWrite(contP[val],HIGH);

valにはLow-ch, Mid-ch, High-chに相当する0~2が入ります。これを以下のとおりに書き換える事でPWM出力する事ができます。

analogWrite(contP[val], duty);

dutyには0~255を設定します。duty=127とすると約50%デューティーとなります。void control()の実装は以下のとおりです。

最初にduty=127で試してみました。Up動作は問題ありませんでしたが、最大値から折り返しポイントでJumpできずに収束しない状況となってしまいました。仕方がないのでデュティー約66%の170で試してみます。この設定時は問題なく全域でJumpする事ができました。動作時の駆動波形は以下のとおりです。

オンしている間に定期的に0Vのスパイクが見えますが、デューティー66%としている制御です。反転時のサージがやや大きいですが、ドライバ用トランジスタを破壊するレベルではないので気にしません。カーソル内の動作は最初に正転し、その後反転→正転→反転して収束しています。収束までの時間は約1.1秒です。早速精度確認を行います。方法は今までと同じです。

結果は大幅に改善していました。4回の偏差が0.5dBを越えるポイントは3カ所に減っています。正直なところ、こんなに改善するとは思っていませんでした。気になる点は経時変化でJumpできなくなり収束不可となる事です。こればかりは直ぐに判断できないので、とりあえずこのまま進める事にします。

目標精度

精度はかなり改善しましたが、どこまで精度アップさせるべきか検討してみます。目標精度の参考とするため、今回採用するアルプスの4連ボリュームの仕様を確認してみます。以下が仕様の抜粋です。

相互偏差とは、4連ボリュームの同位置におけるアッテネーション値の偏差を示しています。これを見ると3dB maxとかなり緩い仕様となっている事がわかりました。別途実精度は確認したいとおもいますが、demo14の結果をもって一旦精度アップ検討を保留とします。

 

つづく(製作編14)