・DACを作ろうと思いまして

とりあえず制御プログラムは書いたよ!?(挨拶)


旭化成のAK449x系列復活の日も近いようなので、
そろそろDACもまじめにやろうかねー、と思ったり思わなかったりしている。

…のだけど、個人的にはESSが良いかもなぁ、と。


なんにしても、ハードウェアはどうにでもなる。
(それぞれの基板作ってICを片っ端から試していたらえらい金額になるけど。)

だけど、ハードウェアコントロールのDAC ICでDACを作っても面白くないし、
ハードウェアコントロールで好みのチャンネルマッピングできるものは限りなく少ない。

あと、最近のDACはせっかくデジタルフィルタが設定できたり、
ESSだとDPLLの幅を設定できるようになっているから、一応、動作中に設定できるようにしたい。
水晶が乗っている機器はできるだけ電源を切りたくないので、絶対に動作中がいい。
操作はボタンひとつとロータリエンコーダで(スイッチつきのロータリエンコーダにしたい)。
もちろん、設定値は次回起動時に読み込むようにする。


……という偏屈のためのプログラムを、自分で書いた。とりあえずESS用。
どうでもいいような部分も、細々と組み込んでみた。練習がてらね。
(設定画面に入ったときに、今の値が最初に表示されるようにするとか。)

使ったマイコンはATmega328(プログラムメモリ32kB、SRAM2kB)。
ピン数が必要だったのと、過去に買ってあったから。
SRAMが多くて助かる。


起動時の画面はインプットと音量。
ボタン短押しでデジタルフィルタとDPLLの幅表示。
もう一度押すと戻る。
  

ここだけは、どういう状態で電源を切って起動しなおしても
インプットと音量が表示されるようにしてある。
もし音量調整機能を使う場合、起動時に音量がわからないと危ないので。
上の写真だとボリュームがdisableされているけれど、これが有効の時はちゃんとボリュームレベルが出る。

 

ボリュームは、桁に応じてマイナスの位置がちゃんと変わるし、0.0dBの時はマイナスが消えるようにしてある。

  
 

ボタン長押しで設定モード。
今のところ、入力選択、デジタルフィルタ選択、DPLL幅選択、
ボリューム無効・有効、バックライト無効・有効の5つの項目がある。
でも、一部は項目を作っただけで何の設定も投げていない。
(設定の状態はEEPROMに書き込まれるけど、それによって何も設定されないという意味。)
まだDAC部分の基板を作っていないし、細かいピン配置も決まらないので。

  
  
 

あとは、設定変更時(即時)と、音量調整後1秒程度したら値をEEPROMに書き込むとか、
起動時にEEPROMから設定をロードするとかくらいの機能くらいしかない。
I2C通信は投げたデータを確認する機能がないので、
書き込んだ後に同じレジスタを読み込んで、データを比較する機能はつけた。
うまく通信できなかった時(書き込み内容と読み込み内容が異なる時)はエラーメッセージが出る。
あと、ボタン(スイッチ)とロータリエンコーダはプログラム側でチャタリング対策してあるので、
マイコン内部のプルアップ抵抗を有効にしてつなぐだけで動く。お手軽仕様。
※実際にダイレクトでついてる。
 ロータリエンコーダに至っては、Cピンを出力・Lにした端子につないでいる。

音量のEEPROM書き込みは、毎秒書き込むと頻度高すぎてEEPROMが痛むし、時間もかかるので、
音量調整した1秒後くらいで書き込んでいる。値に変化がなければ書き込まない。
ずっと書き込まれているのではないかと不安になる病気にかかっているので、
書き込み時は1秒程度、ボリュームの右端に「.」を表示するようにした。

 

EEPROMのデータをあらかじめ書き込んでおくと、初回起動時からデフォルトの設定で動く。
というか、書き込んでおかないとエラーになるようにしてある。(EEPROMの初期値0xFFなので。)
EEPROMのデータが何らかの原因で化けたときにもエラーが出るから、
そういうときの対策として、エラーメッセージが出たらEEPROMに初期値を書き込むようにしている。
こうしておけば、もしデータ化けしても再起動で復活できる。


この中で、ボリュームの無効・有効は、正直なくてもいいかな?と思っている。
ボリューム無効の時は、音量設定レジスタに0x00を書くだけなので。
つまり、ボリューム有効・減衰量0.0dBの時と、音量無効の時は、内部的に同じ。
それでもオーディオマニアは音量調整無効とか好きだから、とりあえず用意しておいた。
無効にしておけば、ロータリエンコーダを触ってしまって音量が変わるという心配もないし。




プログラム書いたら、ちょっと満足したけど!(オチ)

これは、ちゃんと作るとしても自分用。
もし外部に出すなら、一部の設定は固定する。
Highest BWで使われて音が悪いとか言われても困るし。
まあ、そういう活動に対して良くない印象になっているから、やらないかな。

―――

※追記 2022年05月※

とりあえず中国で安く売っているES9018K2M搭載ボードを改造して、レジスタを叩いてみた。
実験に使ったのはこれ。Aliで送料入れて2000円弱で売っていると思う。

 

なぜか左上に5V出力がついていて助かる。(ついていないのも売っている。)
ES9018K2Mのデジタル部は3.3Vだから、普通は5V使わないんだけどな…。
これ、構造と部品の都合で、12V程度の電源だと0dBは振れないから、あまりおすすめはしない。
回路追ったら、それなりに動くように考えられてるな…という感じはするけれど、
決して音質を意識した構造ではないように見える。
あとクロックが100MHz(と書いてある)のに、デジタルコア電源が外部電源になってない。


キャラクタLCDは5V品しか手もとになかったので、ちょっとデータシートの値から
外れるけれど、電源は5Vで、データは3.3Vで送っている。
マイコンは3.3V動作。9018K2Mのロジックが3.3Vなので。
この電源は基板上の3.3Vからとった。
(デジタル電源・クロック電源用に使われている部分。)

デジタル入力は特に記述がないので、3.3V(実際は2.9Vくらい)のSPDIFを用意した。
ずっと昔作った、PCM2704のデジタル出力をちょちょっといじっただけだけども。
0.5VのSPDIF(普通のSPDIF)だと足りないと思う。
※のちに、光デジタル入力に変更。

あとは、I2Cのプルアップ抵抗を1kΩに変更して、マイコンとつないだくらい。



信号入れて波形は出たので、オシロで見ながらデジタルフィルタを変えたりした。
レジスタに値を書き込んだ瞬間に、ミュートされるでもなくいきなり波形が変わる。
これは趣きがないので、適当にミュートを入れるといいかもしれない。



その他、割とどうでもいいこと

I2Cで通信させ続けてみたら一度だけ通信エラー出た。
色々とむき出しだから仕方ない。
どうしても駄目そうなら通信速度を少し落としてみようかと思う。
つけておいてよかった、送信データと読み込みデータの比較機能。

チップのリビジョンはVだった。(WとVしかない。)
新しいのか古いのかは知らない。

キャラクタLCDは通常表示、黄緑バックライトにしたものの、
バックライトを消すとほとんど何も見えない。
かといってこんなのPWM駆動するとノイズ源を増やすようなものなので、
もうつけっぱなしでいいような気がする。
LEDだから、つけている分にはほとんどノイズも出ない。
(無ではないけれど、無視できると思う。)

ESSのI2Cアドレスは、腑に落ちないというか、納得いかない。
アドレスなのだから、R/Wビットを足してアドレス自体が変わったら駄目じゃない?
だから7bitだと思ったわけだけども、8bit表示だった。
7bit表記か8bit表記かはデバイスによって違うから、結構混乱する。

基板描こうかねー。


―――

後日、位相の設定もつけた。(Non-Invert・Invert)
プログラムメモリも余っているし、何かのレジスタと一緒になっているから、値を変更するのも容易だし。

トップ画面は1枚目が入力/ボリューム、2枚目がデジタルフィルタとDPLL幅、
3枚目が位相とチップのリビジョン表示とした。ボタンを押すと順繰りに表示。

位相設定用のレジスタは、ESSのDACでもない場合がある。
というより、たぶんない品種のほうが多いので、
この機能がつけられるチップは限られる。
旭化成のDACは、だいたいついているみたいだけど。



さらに、チャンネル入れ替え機能(左右入れ替え・両方とも左・両方とも右)を追加。

トップ画面は1枚目が入力/ボリューム、2枚目がデジタルフィルタとDPLL幅、
3枚目が位相とチャンネル入れ替えとした。
入りきらなくなったチップのリビジョンは、チップIDとリビジョン表示に
パワーアップさせたうえで、設定に入れておいた。
といっても、ほかのチップには対応させていないから、
実質チップID確認用の機能になっている。

 

あと、スイッチ押しながら起動することで初期値で起動できるようにした。
以前はプログラム書き込み時かエラーが出た時しか初期化できなかったので、
通常使用時に初期化する術がなかった。

―――

ボリューム有効・無効を切り替えたときにプチッと聞こえることがあって
気になったので、切り替え時に音量を滑らかに変更する機能も追加した。
(有効・無効の切り替え=小さい音量からいきなり最大音量に変更するとき。)
今回は制御ソフト側で実装。こうしておけば、ソフトステップのないICでも対応できる。

そろそろ、つけたい機能がなくなってきた。

―――

頻繁に表示が変わる可能性のある設定状態はともかく、通常時は画面をプログラムの毎ループごとに
書き換える必要はないので、1度書き換えたら値が変更されるまで書き換えないように修正。
通常動作時の、マイコン・表示器まわりから発されるノイズがちょっとだけ減ると思う。

―――

バックライト有効のとき、電源投入でバックライトがパッとつくのが気になるので、
ふわっと点灯するようにソフトウェアPWMを実装。
完全な自己満足。

―――


2022年4月。


トップページへ

© 2022 Nono

inserted by FC2 system