気分転換に作成したものを、公開します。
普段PDMアンプの試作品ばかり作っていると、煮詰まってきます。 気分転換に別のDACを作ってみました。
オーディオ制作の気分転換にオーディオを制作しているところが病んでいますが、趣味人なんてそんなものです。
PCM2704みたいに気軽に使えて、もう少し音の良いオーディオがほしかったので作りました。
使った基板は、以下です。
バスパワーで動作します。 ビデオ会議の時ヘッドフォンを駆動するのに重宝しています。
真面目に聴き込むと、高音に少々歪感があります。 PDMでバスパワーのヘッドフォンアンプを作ったので、PCM5102アンプは引退しました。
昔DIYINHKから買ったAD1856基板が余っていたので、XMOSとつないでみました。
使った基板は、以下です。
DIYINHKの基板は、生産が終わってしまってもう手に入りません。 無改造でもXMOSに直結できますが、そのときはサンプリング周波数96kHz以下しか再生できません。 384kHzまで対応したかったので、Tang Nanoを使いました。
山本式電流帰還ヘッドフォンアンプのおかげでいい音がします。 PDMアンプに匹敵するくらい。
低音は迫力あるのですが、高音の伸びでは負けてますね。 ES9018SとかPDMアンプに負けます。
PDMアンプをデモンストレーションするとき、オーディオを聞き慣れない人から「比較対象が欲しい」と言われます。 そこで、AmazonでPCM2704基板を買って、ストックしておいた秋月電子のBTLワンチップアンプキットと組み合わせてみました。 見事に電圧駆動の音がします。
OPアンプ6回路とTDA2822を2個使って、単一電源のステレオ山本式電流帰還アンプが作れないか、試してみました。 結論から言うと失敗です。 動作はするのですが、TDA2822の出すノイズが大きすぎます。
不要品を選別していたら、2015年頃に試作していたアンプの成れの果てが出てきました。 エレキ工房No.5のキットと同様にNXPのマイコンでUSB入力を受けて、⊿Σ信号でヘッドフォンやスピーカーを駆動したものです。 スピーカー駆動回路は、外してあります。
技術的には、以前SHARPが作っていて、今リリック社が作っている1bitアンプと同じものです。 D級アンプと同様に出力にLC回路によるローパスフィルターがあります。 出音は、D級アンプとPDMアンプの中間でした。
A/D コンバーターの出力を、S/PDIFに出力しようと考えました。 Raspberry Pi用のS/PDIF出力基板を買えば、I2SをS/PDIFに変換できると思ったのですが、失敗でした。
買ったのはHiFiBerry digiコンパチ基板です。 この基板にはWM8804が乗っていますが、I2Cで制御しなければ動きません。
また、I2Sのマスターモードで動作します。 A/DコンバーターをI2Sのスレーブモードで動作させるにはI2S以外にシステムクロックが必要なのですが、コネクタに出ていません。
WM8804をスレーブモードで動作させるためには、未確認ですがクリスタルを外して外からシステムクロックを入れないといけないようです。
また、同じ基板を2枚買ったのですが、片方はコネクタ内部に接触不良があり、I2S信号がコネクタの半田部分まで届いていません。
マイコンATtiny13Aを使ってみました。
ATtiny13Aは便利なチップです。 8ピンでROMもRAMも小容量だから大したことはできません。 でもLSIに電源投入から遅れてリセットパルスを送るようなとき、今までNE555を使っていたところでATtinyが使えます。 NE555だと時定数を決める外付け部品が必要ですが、ATtinyはクロック内蔵で電源さえ与えれば動作します。 安いです。 電源は5Vでも3.3Vでも動作します。
Webmasterの手元には10年以上前に購入したAVR ISP mkIIの本物があります。 ATtinyに書き込むためのアダプタ基板を作ってみました。
今更ですが、秋葉原でOPA2134が高くなっているのに気づきました。 以前は秋月電子で400円で買えたのに、千石電商で1680円します。 2019年にTIが日本国内の2次代理店を切り捨てたのですね。 困ったものです。 仕方がないので、代わりにMUSES8920を使ってみます。
DIYINHKでキットを買おうとしたら、カード決済できません。 カード決済代行のSTRIPE社がVISAのブラックリストに乗っているのでしょうか。
エレキ工房No.5の記事で使用したLPC4330 Xplorer基板は、Amanero Combo384が出てくるまでwebmasterの自作機器で活躍していました。 当時の自作 USB DAC が動かなくなっています。 どうも、LPC4330 Xplorer基板に乗っている3.3V LDO が次々と故障しているようです。
2014年にDIYINHKのES9018k2m基板とLPC4330XplorerでUSB DACを作りました。 最近になってLPC4330Xplorerが故障したので、代わりにXMOSとRaspberry Pi picoを使って作り直しました。
DIYINHKのES9018k2m基板を追加購入して、Raspberry PiのI2Sにつなぎました。
Raspberry PiとES9018k2m基板の間にFPGAがいるのは、⊿ΣのI2S伝送をしているからです。 I2SのMSBをLチャネルのデータにして、LチャネルとRチャネルを交互に1ビットづつ送ります。 FPGAでES9018k2mが受け取れるDSDフォーマットに整形しています。
これでUSB DACを買わなくてもRaspberry PIからPCMと⊿Σ両方を送ることができます。 切り替えはGPIOを1本使います。 Hifiberry-dacのデバイスドライバでPCMは354.8kHzfsまで、⊿Σは11.2MHzfsまで送れることを確認しました。
ALSAの癖で、PCMデータの前後にはPCMのゼロデータが付加されます。 そのせいで⊿ΣモードとPCMモードを切り替える瞬間にポップノイズが入りますが、気にしません。
FPGAの Verilog HDLファイルは大した内容ではないので、公開します。
module main_logic (
input wire i2s_data,
input wire i2s_lrck,
input wire i2s_clock,
input wire ds_on,
output wire out_i2s_data,
output wire out_i2s_lrck,
output wire out_i2s_clock,
output wire out_led_r,
output wire out_led_g,
output wire out_led_b
);
reg is_left;
reg lrck_remember;
reg ds_remember;
reg ds_left;
reg ds_right;
reg ds_clock;
assign out_i2s_data = (i2s_data & ~ds_on) | (ds_right & ds_on);
assign out_i2s_lrck = (i2s_lrck & ~ds_on) | (ds_left & ds_on);
assign out_i2s_clock = (i2s_clock & ~ds_on) | (ds_clock & ds_on);
// LEDs are active low
assign out_led_g = ~ds_on;
assign out_led_r = 1;
assign out_led_b = ds_on;
always @(posedge i2s_clock) begin
lrck_remember <= i2s_lrck;
if (lrck_remember != i2s_lrck) begin
is_left <= 1;
end else begin
is_left <= is_left ^ 1;
end
if (is_left) begin
ds_remember <= i2s_data;
ds_clock <= 1;
end else begin
ds_left <= ds_remember;
ds_right <= i2s_data;
ds_clock <= 0;
end
end
endmodule
今度は完成品の話です。
Webmasterは、各種OS向け音声再生アプリを配布しています。 今までDoPの動作確認には、エレキ工房No.5で作ったUSB DAC/ADCを使ってきました。 このキットで使用しているUSBマイコン基板が、経年劣化で動かなくなりました。
代わりにDoPを受け付けるDACを探して、このKEB02iPを見つけました。 今どきの中華USB DACはインターフェースにAmaneroかXMOSを使っています。 AmaneroもXMOSも、webmasterのLinux向け再生アプリではDSDをnative転送してしまいます。 どちらでもないインターフェースを使った安いDACを探していて、ハードオフで見つけました。
早速再生アプリをチェックして、アプリにDoP再生時のバグを見つけました。 デバッグしてからLinuxで再生したら、11.2MHzfsのDoPが再生できました。
Windowsでの再生は調子悪いです。
11.2MHzfsのDoP再生は可能なのですが、44.1kHzのPCM再生でも音が途切れます。
おそらく、アシンクロナスのフロー制御に問題があるのでしょう。
音が途切れる原因がわかりました。 ボリュームを絞ると、ときどき音が途切れます。 おそらく、ヘッドフォン駆動回路が単一DC電源で、出力にDCオフセットがあるのでしょう。 DCオフセットをキャンセルするDCデカップリングのコンデンサーが入っていて、再生条件によってチャージが0になってしまうのだと思います。
LinuxでもWindowsでもボリュームを絞ったら、音が途切れました。
8bit ⊿Σ Discrete DACを試作しました。
仕様を書きます。
XMOSの出力するPCMとDSDからアナログライン出力を作ります。 PCM入力のときは、64倍オーバーサンプリングして階段状のデータとして8bit⊿Σ変調して出力します。 DSD入力のときは、そのまま8bit全部が同じ信号出力になります。
8bit出力は、おなじみのラダー抵抗を経てOPアンプに入ります。 ラダー抵抗は、FPGA基板の下に秋月電子通商で購入した誤差0.1%の抵抗を配置しています。 OPアンプは2回路あって、1段目はラダー抵抗出力のボルテージフォロワーです。 2段目でDCオフセットをとりながら、バタワース特性の弱いLPFを通します。
お気楽オーディオキット資料館にも、マルチビット Discrete DACを製作した記事があります。 そこで読んだ情報にこういうものがありました。
8bitのDiscrete DACを作ると、普通はゼロレベルの出力が0x80で、-1の出力が0x7fになります。 0と-1で出力8bit全部が反転するので、ここで出力電圧のギャップになりやすいです。
このギャップの対策を組み込みました。 8bitの出力が0x80になるときを『出力0.5』とし、0x7fになるときを『出力−0.5』とします。 FPGAの中で⊿Σ変調しているので、入力がずっとゼロだと出力は0x80と0x7fが交互に出ます。 ギャップが無くなるわけではありませんが、影響が減ったと思います。
詳細は こちらで。
ここではR-2Rラダー抵抗を使いました。 実はMHz帯の周波数で動作する12bitDACとしてAD668が存在します。 R-2Rの代わりにAD668を使うこともできるのですが、DigiKeyで購入して片チャンネルで9000円もするので、躊躇しています。
初出 2021年10月17日
追記 2024年3月22日