電子ボリューム ( BH3532FS )
1. VR IC 1段による検討 (BH3532 こてしらべ)
2. VR IC 2段による検討 (減衰量の拡大)
3. ロータリーエンコーダの扱い (チャタリング対策例)
4. 動作例のビデオ
音量調整用に使う質の良いVR(可変抵抗器)の入手が難しくなってきた。
最近では電子VRを使った方がどうも手っ取り早いようである。
そこで手軽に使える電子VRのブロックを開発する。
電子VR用のICは種々あるが、今回は手元にストックのあったロームのBH3532FSを使った。
このICの特徴は、22KΩの抵抗を256分割しコマンドデータできりかえるというものであるが
単純なためか 電源on-off時のノイズなども少ないように感じたが、最小絞りが-48dBまで
なので、高ゲインのメインアンプでシステムを組む場合には不向きである。
BH3532のブロック図を示す。
主な仕様:
電子VR IC :ROHM BH3532FS
制御マイコン:AVR TINY2313-20
音量操作 :ロータリーエンコーダ
バランス操作:タクトスイッチ L/R レベルダウン
音量記憶:マイコンEEPROMに記憶(但し書き込み操作による)
レベル等表示:16*2 LCD表示可能(基本的にdebug用)
電源 : +5V
制御に使うマイクロコントローラは、AVR TINY2313 を使いロータリーエンコーダとタクトSWににより
音量調整と左右バランス調整をおこなう。
BH3532の減衰特性
いわゆる 可変抵抗でいう 「Bカーブ」 である。
<256stepの変化をリニアシミュレーションした結果>
<256stepの変化をLOGシミュレーション>
減衰特性をLOGシミュレーションした結果、100step以降の変化率が少ないのと
総ステップ256stepでは ロータリーエンコーダ操作性が悪いため 半分程度になるよう
ソフトで補正した。
マイコンのメモリー容量が2kbyteしかなく テーブルで補正値を持つとオーバーするケース
もあるため単純計算で補正している。 (LCD表示ルーチンがなければ容量はOKなのだが)
v=v+1+int(v/60) つまり 60毎にstep当たりの増分を増やしている。ステップ数は128程に
おさまり、カーブは下図の通りである。
<若干補正した後のカーブ>
実験の様子
BH3532のDINライン(ピンク)を マイコンが駆動しきれない。
ENライン(黄色)は問題なく駆動している。
基板をエッチングで手作りしたが 半田付け不良か パターンのエッチングミスかもしれない。
ということで、
よもやソフトのミスとは気づかず ICを変換基板に実装しワイヤーで外出しして実験を行った。
結果的にはBH3532のDIN駆動に使ったPORTの入出力方向を間違えていた為であり 基板の不良ではなかったのだが
再度SSOP ICを基板に半田付けし直すとパターン不良となる可能性があるためそのままソフトのデバグと測定を継続。
特性の測定データ
・挿入ロス :0.3dB (in駆動 600Ω、out受け 1MΩ)
・ノイズ
VOL位置max :0.030mV
VOL位置min :0.026mV
・VOLmin時の漏れ
2V入力時 :0.51mV (-71.2dB)
・歪み率
0.775V入力時 :0.0024%
2V入力時 :0.098%
(アナログ入出力端は保護ダイオードでクリッピングされており [1/2Vdd] を超えるとクリップする)
ソフト構成について
AVR TINY2313は、プログラムメモリが2KByteなので、Cで気を抜いて書くと すぐに一杯になって
下記メッセージを出してしまうので要注意である。
<<Getting isp parameter.. SD=0x04 .. OK Failed! >>
ソフトの大まかな構成としては下記の通り。
main( ) --+--- LCD disp( )
// use debug
+--- encorder_in(
) // get volume position
+--- BH353drv(
) // set BH3532 data
+--- eePROM
R/W( ) // get&put initial data
ボリューム位置の保存
ATMEL社のTINY2313スペックシートを確認すると、eePROMの書き換え保証回数は 「10万回しかない」
ボリュームdata保存のため操作するたびに値を eePROMに書き込んでいると簡単に保証回数を超えてしまう。
初期値を何らか 別の方法で保持する必要がある。
(BH3532は、minからmaxまでのステップが256であり 単純に駆動した場合 10万/256=390
つまりわずか 390回 最小/最大を繰り返すと保証範囲を超えるのである。 eePROMが
そんな回数でダメになるとは思えないのだが保証範囲内の対応が望ましいのは言うまでもない)
操作に使えるSWとしてバランス調整用のタクトSW2個があるので、このSWに以下の3つの機能を
持たせている。
(1)SWの単独操作では、ボリュームdataを L/Rそれぞれダウンさせることによりバランス調整を行う。
(2)SW同時押しされたときに、L/Rの値が異なる場合は バランスリセット(L=R)とする。
(3)SW同時押しされたときに、L/Rの値が同じであり 且つ1.5秒以上長押しされたときボリュームdataを
eePROMに書き込みボリュームdataを保存する。 保存されたデータはpowerオン時読み込まれる。
バランスの値は保存されない。
回路と基板の設計
実験基板をオーディオ装置につないで試聴した結果 「いけそうな気がする」 ので回路と基板を再設計。
アンプ等への実装を考えるとLCD表示では不都合なので、マイコンの余った(余した)ポート2つでLEDを
駆動しVRの変化に応じて点灯するように考慮した。(2点では少ないのだが無いよりマシ)
VR回路2段化の検討
実際に、PCM1794DACとLME49600ヘッドホンアンプにつないでヒアリングしたところ、最小音量領域の調整が足りない。
ヘッドホンは能率が良いため、-48dBでは音が大きいのである。
=>使用したヘッドホンは、SONYのMDR-F1。 感度は100dB/mWとあまり高い方ではないがインピーダンスが12Ωと低いため、
低インピーダンス駆動能力のあるアンプの場合は、電圧感度換算で8dB程度アップしMDR-CD3000(32Ω)より高感度となる。
そこで、実験基板がICをワーイヤー出ししてあることを良いことに2段構成でうまくいくのか追加実験をこころみた。
VR回路を単純なシリーズ動作にして、試聴して見たところ問題なく動くようで減衰量も十分な感じである。
まずは減衰量のシミュレーションである。 2段構成にする場合 VR間にbuff等を入れるなど回路を複雑にしたくないので単純に
VR回路をシリーズにつなぐことを前提とする。その場合、1段目の減衰カーブは2段目の全抵抗値(22KΩ)が負荷となるため
減衰カーブが変わる。
VR1とVR2のシミュレーション結果
2段の減衰量の組み合わせで、リニアなステップ設定が出来そうなので、それぞれの減衰量から
組み合わせで 2dBステップで-80dB程度の組み合わせが可能か、検討してみた。
最初は手計算で 丁度2dBステップになる組み合わせを探していたのだが、埒があかない。
C#でさくっと組み合わせを探すソフトを作ってシミュレーションした結果、結構良い組み合わせがあるようで
-60dBまでなら 2dBstepを±0.02dB 内で収まるような組み合わせが探し出せる。
これははっきり言って凄いことで単品の抵抗でATTを作ることを想定した場合、論理計算で出した半端な抵抗値を
1%以下の誤差で組み合わせすることに等しい。 つまり一般的には不可能ということである。
但し、BH3532FS内部の抵抗誤差を全く無視した話であり 「とらぬ狸」 ではある。
この結果は、「思っていた以上に良い結果」 であり ぜひとも実現したい。 と欲が出てくる。
あとは、制御マイコンのソフト変更であるが、2KB以内に容量を納めることができるかどうか・・・・・である。
ソースコードの見直しと変数の型見直したり(intをint8_t等) なんとか 90%を切るところまで圧縮した後、
上記のステップデータ(80byte)を配列にしてソフトに埋め込んだところ、やっぱりメモリーオーバー !?
まてよ・・・・・ データメモリーのオーバーなら プログラム参照(const)にすればいけるはず・・・
で、いけました。 無事、2048byte + 128byte に収まりました。
下の写真のように表示させています。 LchとRchのバランス調整も可能です。
しかし、改めてLCDの表示能力の高さを思い知りました。 7segLEDやLED単品で動作状態を表示させようとすると
LCDと同等の ポート6つ位では到底不可能で、メモリ容量厳しい中ではあるものの頑張って 「 LCD表示前提」 と
なりました。
-80dBまでLch/Rch 独立制御します。 但し、理論値
実力の程は・・・・・ こちら
回路と基板の再設計
VRが2段になると出力インピーダンスも高くなり、生出しするのはさすがに気が引けるのでオペアンプbuff(0dB)を追加。
基板全面書き直し
毎回 DグランドとAグランドの分離方法に頭を痛めます。
今回は、DグランドとAグランドをパターン上でつながず、Jamperでつなぐことにしました。
そうすれば塗り潰しブロックを分けるだけで、D-Aのグランドが分離できます。
しかし、両面基板使って ”Jamperか?!” と野次が出そう
塗り潰し実行画面。 ベタアースが分離しているのが分かります。
完成基板での実験風景写真
手前に見えるツマミがロータリーエンコーダ
パターン設計が一段落したので、2段化したVRの減衰量を実測しました。
-40dB以下になってくると理論値との差異が1dBを超えますが、ギャングエラー(左右差)は最大で 0.66dBと ±1.0dB以内に収まります。
最大減衰量(∞)は、-103.1dB/-102.3dB でした。
予想以上の、良い特性が出ています。
測定方法
・入力 1KHz 2V 一定
・出力 100KΩ負荷 Noiseメータ/JIS-Aカーブ補正
グラフ1. <設定step と VR減衰カーブ>
グラフ2. <理論値との差異>
今回使った、ロータリエンコーダー(秋月)には、回転時にクリックがありそのクリック位置でボリュームを 1stepずつ進めたいのですが
エンコーダの出力は、下図のようにクリックとクリックの間でも変化し且つチャタリングも発生します。従って、単純にエンコーダの
出力を数えると、ボーリュームコントロールとしての操作に違和感がある変化を生じます。(つまり誤動作が発生する)
最初は、クリックが無くなるように ロータリーエンコーダを改造して(簡単に改造できます)使ってみたのですが、Stepが細かすぎて
音量ボリュームとしての操作としては使いにくいので、クリック有りに 戻しています。
クリック無しとして変化を全て取り込んだ場合、回転角度 3.75°で 1stepの変化が得られますが細かすぎるようです。
コントローラ TINY2313の処理は、割込を使わず入力ポートレベルをソフト的に見ています。
ロータリエンコーダーのチャタリング波形例
一見、チャタリングのないきれいな波形のようにみえるのだが 高速で取り込むと、この例では100μS程のチャタリングが観測される。
<参考値>
ロータリエンコーダのチャタリングのスペック
・プルアップ10KΩ時に max5mS
・プルアップ 5KΩ時に max2mS です。
TINY2313の内部ポートプルアップ抵抗は、20KΩ〜50KΩです。
つまり単純にタイマーを使って遅延(5mS〜10ms))すると素早い回転時に変化が追いつかない状態が生じます。
プログラムの例です。 (搭載した実際のコーディングとは異なります)
//volume[0]はLch, volume[1]はRch の位置dataに相当
< GoTo TOP >
(c) 2009. Mi-Take/t.minobe