2019年10月1日火曜日

ネットワークオーディオプレーヤーの製作 (2) 中華ES9038Q2M基板の改造・マイコン制御

ネットワークオーディオプレーヤーの製作シリーズ第2回はDAC部についてです。
(第1回はこちら→ネットワークオーディオプレーヤーの製作 (1) 概要
下図の赤枠の部分です。


DAC基板には、最近流行っている中華ES9038Q2M基板を改造したものを使います。以前ヘッドホンアンプに組み込んだものを取り出して再利用することにしました(ヘッドホンアンプ用には別の基板を新たに導入)。

この基板の詳細・改造経緯については過去記事に詳しく書いたのでご覧ください→ES9038Q2M DAC内蔵ヘッドホンアンプの製作 (1) DAC基板の改造

このDAC基板をそのまま流用することもできるのですが、実は基板上でDAC ICをI2C制御しているマイコン(ATtiny24A)の動作にいくつか不満がありました。その不満というのが以下の3点です。

  • PLLバンド幅の調整ができない
音質への影響が大きい部分(ES9016で経験済み)なので、自分でいじりたいです。

  • マイコン内蔵ADCを使った音量制御の方法が気に入らない
元の基板ではADCの入力電圧が小さいほど音量が大きくなるという制御。何か危なっかしいので逆にしたいです…

  • I2C通信が常時行われている(っぽい)
設定を変更したときだけ通信すればいいのでは?オーディオ機器なのでできるだけノイズの要因は減らしたいものです。


というわけで元の基板に付いているマイコンは取り外してしまい、自前のマイコンを使ってDAC ICを制御することにしました。
(参考記事: 表面実装部品取り外し専用のコテ先を自作


上の画像の左下がマイコン跡地です。

そして、代わりに作ったマイコン基板がこちら。秋月C基板です。



ピンヘッダで設定できる項目を増やすべく、元のマイコンよりピン数の多いATmega328Pを使用しました。
ちなみに私はマイコンにわか勢で、基本的にマイコンそのものやプログラミングにはあまり興味はなく、道具として使うだけです。ということで、楽にプログラミングしたいのでマイコンにArduinoのブートローダ(8MHz, 3.3V版)を書き込み、基板にUSB-シリアル変換モジュールを外付けできるようにしました(プログラムの書き込みやデバッグ時のみ使用)。つまり、この基板は実質的にArduino Proです。

さて肝心の中身ですが、上記の通りI2C通信です。ES9038Q2MはI2C用に100以上のレジスタを持っており、最初に見たときこれは大変だと思ったものですが、データシートを熟読すると実際にマイコンから変更すべき部分はごくわずかであることが分かりました。
マイコンからいじっているレジスタは以下の通り、たった9つです。
Register 1: Input selection
Register 2: Mixing, Serial Data and Automute Configration
Register 7: Filter Bandwidth and System Mute
Register 8: GPIO Configuration
Register 11: SPDIF Select
Register 12: ASRC/DPLL Bandwidth
Register 14: Soft Start Configuration
Register 15: Volume Control
Register 27: General Configuration

以下のような機能を実装しました。

  • ピンヘッダによる入力、フィルタ、PLLバンド幅の切り替え
マイコン内蔵抵抗でプルアップしたピンをジャンパーピンでGNDに落とすかオープンにしておくかによって設定を変更する方式です。入力はI2S(ラズパイ)・光・同軸の3通り、フィルタは7通り、PLLバンド幅は15通りの設定が可能です。

  • ADCによる音量調整
マイコン内蔵の10bit ADCに入力する電圧を可変抵抗器により変化させることで音量調整を行います。
ES9038Q2Mは0dBから-127.5dBまで0.5dBごとに255段階の音量調整ができるようになっていますが、実際に120dB以上も音量を絞ることは考えにくいです。そこで、
・ボリュームを絞り切ったとき(ADC出力=0または1)では-127.5dB
・ADC出力≧2では-63dBから0dBまで0.5dBごとの制御
としました。
また、プログラムに入れたLPFもどきの処理と基板上のCR LPFのおかげで、ノイズなどにより設定値がコロコロ変わることもありません。
可変抵抗には大型の密閉タイプ(東京コスモス RV24YN 10kΩ)を使い、信頼性を高めています。また、1MΩでADC入力をプルダウンしているので、ブラシの接触不良などの不具合で可変抵抗がADC入力から切り離されても音量設定が大暴れすることは無くミュートがかかるだけで安全です。


I2C通信はDAC起動時と設定に変更があったときのみ行われるようにしました。

これで、上に挙げた3つの不満点は解消されたことになります。
DACとマイコン部の回路図は下の通りです。


まあ、本記事はソフトの話がメインだったので回路図には大したおもしろみはありませんが…(そう言うなら書いたコードを出せ、というご指摘はもっともですが諸事情によりご容赦ください)

最後に、恥ずかしながら私がはまった落とし穴を共有しておきます。
まず、ESSのデータシートに載っているデバイスのI2Cアドレスは8bitであり、ArduinoのWireライブラリを使う際は末尾のR/Wを取って7bitに変換する必要があるので要注意です。
次に、Register 14について。ここはデフォルト設定だとDACの出力端子がGNDに落とされ何も信号が出てこないので、最初に変更しておく必要があります。最初このレジスタを見落としており、なぜ音が出ないのかとしばらく困っていました。しかもこの部分は旧版のデータシートではReservedになっているので、古いデータシートを信じていると絶対にこのICを動かすことはできません(ファームウェアの更新があった?)。

次回はDAC出力のI/V変換から出力まで。

0 件のコメント:

コメントを投稿