DIY功能完整的全平衡PCM1794解码器STM32单片机
本帖最后由 mchoi518 于 2025-11-16 12:09 编辑从21年开始正式混hifidiy论坛,学习了很多知识,感谢hifidiy平台和这些年帮助过我的所有大师!
1. 回顾我的媒体播放器DIY历程
自2021年买了个4307的惊雷前级机箱,一直用它diy,
2021版2.1媒体播放器,当时还不会画PCB。都是tb上买的成品板子
2022版2.1媒体播放器自己画了个主板,看着舒服多了
2023版2.2媒体播放器,用上了minidsp flex。学习了STM8S单片机,低通解码是自己做的
2025版,这次做的2.0全平衡解码器
亮度等级1~8调节
2. 机箱内部布局设计
上个月制作了sansui x1111功放之后想重新折腾2.0系统了,目前还不会用CAD,,ppt画的~
孔的位置精度很重要,没有台钻最好不要自己搞,费时费力不说PCB和机箱孔还对不上,, 花点钱CNC加工就好,当然图一定要准确~
3. 解码器功能和代码
单片机用上STM32,实现较完整的功能。
单片机功能设计
STM32代码,标准库,模块化。
主程序、系统配置文件、数码管、编码器、红外遥控、掉电存储、继电器控制等驱动源文件下载:
目前编码器旋转、按键都有防抖,遥控器音量+-长按有加速功能等。
pcm1794不需要软控,硬件I2C代码有,功能暂时没用
请注意:本程序版权归hifidiy用户mchoi518所有,不得用于商业用途,违者必究!
**** Hidden Message *****
我之前也发过软控帖子,好多人下载连句谢谢都没有,没办法,只能隐藏内容了~
4. 电路制作
电路同样模块化,方便后期重做板子调声音
4.1 数字输入和主控板
单片机时钟放在pcb下面,dir9001进行spdif到i2s转换。
开始给解码器设计了POWER_ON/OFF功能,后来去掉了,因为主插排做成了开关机遥控,这样播放器解码功放都能统一开关机,每个设备只要通电开机就可以了。
原理图
**** Hidden Message *****
4.2 前面板
这个机箱前面板开孔就是给数码管用的,OLED没有尺寸合适的。所以用了2个TM1650驱动两个3位数码管。两个编码器间距220mm
原理图
**** Hidden Message *****
4.3 输出主板
5v电源用了lm1085-5.0稳压管,+-15v用了功放上用过的分立稳压电源,用multisim仿真过,大管CE压差只要3v以上,输出纹波1uv以下。AC15v整流后有21V左右。
与机箱(市电地)连接的100Ω+0.1uf 两边都没有焊接,因为有左右2个主板,都连接机箱后左右串扰,如果只连接一个又感觉不舒服~
原理图
**** Hidden Message *****
4.4 解码板PCM1794
用si8620数字隔离
原理图
**** Hidden Message *****
4.5 I/V LPF
电阻没用vishay 0204,我觉得平衡版里面+-信号阻值一致更重要,使用了低温飘0.01%精度的
原理图
**** Hidden Message *****
4.6 继电器音量调节
同样电阻使用了低温飘0.01%精度的
原理图
**** Hidden Message *****
4.7 输出缓冲
目前暂时没做,只预留了位置。因为后级功放x1111仿真结果,前端继电器音调直接输出就可以,不需要阻抗匹配。
5. RMAA测试
声卡用了minidsp flex,rca输入端官方指标115db。 上个月测试功放时把板子都烧了,邮寄回香港,说只能换新板,花了$355,心疼啊,,,
使用XLR的+和GND测试。
测试环境:
测试结果:
24bit 48khz成绩
2023年我做的pcm1794测试结果如下:
https://www.minidsp.com/community/attachments/file_bfb2f7f-jpg.5841/
对比之前的,动态变小了,thd有改善。后期再做个输出缓冲估计动态能上来点。
补充内容 (2025-11-30 12:06):
20251130做了一些改进,请看下面69#楼
补充内容 (2025-12-24 20:21):
20251224又有一些小的问题和改进,请看下面#94楼
补充内容 (2026-1-10 10:15):
20260110数字地线处理,请看#108楼
补充内容 (2026-6-13 10:42):
2026年6月13日,LPF运放换成了OPA828之后THD有明显提升,请看#172楼
补充内容 (2026-6-27 16:39):
2026年6月27日,用4层板重新做了解码和I/V,LPF
【2025年11月30日,有一些小的问题和改进共享】
输出缓冲也装上,机箱内满满登登的看着舒服多了:lol
1. 添加了输出缓冲,尝试了LME49990和金嗓子前级电路,RMAA测试结果自制金嗓子分立电路比运放指标高
LME49990缓冲
金嗓子前级电路缓冲
**** Hidden Message *****
2. 继电器音量噪音问题,有两个解决方法
1)简单直接的方法就是把控制电路数字地线,与模拟电路地线短接,最好大电解下面。 但是这样做指标会降低不少,但是基本可以去掉噪音。
2)音量调节后面增加缓冲,这样可以基本没噪音,测试指标也没问题。
3. 继电器音量调节后面,必须加RC滤波,因为继电器音量调节电路还是很容易引入数字电路的高频噪声。 后级功放输出嬬贝尔电路对地电阻烧了才想起来,前面没加RC滤波,功放输入端也没加RC滤波~ 最好都加上。
4. PCM1794静音功能忘了设计,切换同轴和光纤无信号时有白噪音。应该用DIR9001的ERROR端口高低电平控制PCM1794静音端口,这个比较麻烦后期重做板子再改吧。
5. 软件没发现bug,丝滑流畅。 唯一后期改的是音量从0~127改成0~100了,因为前面0~60基本没声音~~下面是改善后的代码
修改relay_control.c文件中的下面函数:
void SetVolumeRelays(uint16_t volume) {
uint16_t relay_value;
// 将 0~100 的输入映射到继电器控制值
if(volume == 0) {
relay_value = 0;
} else if(volume >= 1 && volume <= 27) {
relay_value = volume * 2;
} else { // volume >= 28 && volume <= 100
relay_value = volume + 27;
}
// 确保值在有效范围内 (0~127)
if(relay_value > 127) {
relay_value = 127;
}
// 清除所有继电器状态
GPIO_ResetBits(VOL_PORT, VOL1_PIN | VOL2_PIN | VOL3_PIN | VOL4_PIN);
GPIO_ResetBits(VOL_HIGH_PORT, VOL5_PIN | VOL6_PIN | VOL7_PIN);
delay_ms(5);
// 设置低4位 (PB12-PB15)
if(relay_value & 0x01) GPIO_SetBits(VOL_PORT, VOL1_PIN);
else GPIO_ResetBits(VOL_PORT, VOL1_PIN);
if(relay_value & 0x02) GPIO_SetBits(VOL_PORT, VOL2_PIN);
else GPIO_ResetBits(VOL_PORT, VOL2_PIN);
if(relay_value & 0x04) GPIO_SetBits(VOL_PORT, VOL3_PIN);
else GPIO_ResetBits(VOL_PORT, VOL3_PIN);
if(relay_value & 0x08) GPIO_SetBits(VOL_PORT, VOL4_PIN);
else GPIO_ResetBits(VOL_PORT, VOL4_PIN);
// 设置高3位 (PA8-PA10)
if(relay_value & 0x10) GPIO_SetBits(VOL_HIGH_PORT, VOL5_PIN);
else GPIO_ResetBits(VOL_HIGH_PORT, VOL5_PIN);
if(relay_value & 0x20) GPIO_SetBits(VOL_HIGH_PORT, VOL6_PIN);
else GPIO_ResetBits(VOL_HIGH_PORT, VOL6_PIN);
if(relay_value & 0x40) GPIO_SetBits(VOL_HIGH_PORT, VOL7_PIN);
else GPIO_ResetBits(VOL_HIGH_PORT, VOL7_PIN);
}
别忘了修改system_config.h中最大音量配置:
#define MIN_VOLUME 0
#define MAX_VOLUME 100
【2025年12月24日,又有一些小的问题和改进共享】
1. 主控+输入板地线问题,
为了没有地线环路把PCB最上端地线断开了,却忽略了spdif数字信号从上面走spdif地线只能从变压器下面绕,形成信号环路,这个比简单地线环路更容易受干扰,输出辐射也更大~~
上面地线短接了
2. 换成了HDAM-SA3输出缓冲电路,这个才是我一直在找的缓冲电路,简单且指标好
http://bbs.hifidiy.net/data/attachment/forum/202512/13/144352fwb4pkz0wgppp2wb.jpg
http://bbs.hifidiy.net/data/attachment/forum/202512/13/144353mtb91b4118b41ztb.jpg
3. 软件加入了数码管屏幕休眠功能,大家可以下载下面的main.c一个文件就可以,加了两个函数和一些变量。
其中的这个变量是休眠时间设置。
#define DISPLAY_SLEEP_TIMEOUT 60000// 毫秒
**** Hidden Message *****
【2026年1月10日,地线问题改进共享】
装机后一直有一个问题困扰,就是偶尔会有数字电路干扰问题,就是插拔usb有噪声或触碰电路板时 MCU误操作,导致音量和输入选择自己跳变。
后来偶然刷到抖音上讲述高频差分信号原理,终于理解了数字信号地线的重要性~
我遇到的问题就是数字地线干扰问题,解决方法有几种:
1. 同轴SPDIF用差分,但是dir9001没有差分输入
2. 数字电路板及地线面积要小,目前中间的输入和电源板做成一个大板是个重大失误,这个需要重做板子太麻烦了
3. 与市电地连接,目前用的这个方式,观察了1个月稳如老狗~ 再无跳变的问题了~
数字地与市电地连接,用了68Ω+100nf+2nf+100pf,用多个电容效果应该更好,这个我是参考了马兰士na8005电路图
市电地与机壳连接,模拟电路地没跟机壳连接。
目前剩下的唯一毛病就是同轴spdif没信号时有噪声,通过上面地线处理后这个噪声小了点,但是还有,只能通过dir9001的ERROR管脚接到解码芯片上静音处理,这个懒着做了。 目前前面dsp出来信号接到光线上了,只用光纤~ 本帖最后由 mchoi518 于 2026-6-13 10:59 编辑
【2026年6月13日,LPF运放换成了OPA828】
把LPF位置的SS2590运放换成了OPA828,指标有明显改善。
换OPA828主要是喜欢它是JFET输入,另外LPF位置后面负载是20kΩ的继电器音调,所以SS2590的大电流根本用不上。
目前是 PCM1794 --> OPA1611 I/V --> OPA828 LPF --> 继电器音调 --> HDAM-SA3缓冲输出
OPA828立创商城买的,现在TI标志变了
I/V LPF电路没变,就是换了个运放
RMAA测试有提升,thd终于见到三个零了
【2026年6月27日,用4层板重新做了解码和I/V,LPF】
想再提高指标,重新画了4层板,解码和I/V LPF板合并成一个,运放opa1612和opa828用了更小封装
结果指标一般,只有频响有点提升,我估计是0.1uf和2.2nf 都用了C0G贴片的原因吧~
pcm1794
价格太便宜了吧:lol 多谢共享! 大制作赞一个,分体板能有效控制成本和提高成功率。PCM1794手册有写的,THD+N=0.0004%(-108dB)。 赞!这样的Diy看着才有劲。 谢谢分享 楼主玩得大气磅礴,充分把机箱塞满。感谢分享。 瞄瞄 厉害了 想学习PCM1794 筑总玩一下 厉害,比商品机好多了,商品机用上分立IV和LPF得卖上万。 嘉立创有开源的XU208的USB界面,搜XU208能搜到。 感谢分享:handshake 楼主前面几版用的SOEKRIS分立R2R解码,后面换成1794解码了,更换的原因是什么?:lol 学习一下 德哥2023 发表于 2025-11-15 14:33
pcm1794
价格太便宜了吧
对,这是便宜货,20块钱的PCM1794,又不支持DSD,最高又只能上192K,但这是TI的旗舰DAC,也是我们论坛烧友最容易DIY出好声音的方案,并且可以调整音色的部份有更多空间。所以为什么DIY论坛这么多人喜欢玩,不是没有道理的。当然啦,兄弟你有过硬的技术,弄个8并联或者16并联的ES9039PRO,DIY出来分享下给大家就最好了。:$ 大制作,功夫都花在设备上有时间听音吗?:lol 德哥2023 发表于 2025-11-15 14:33
pcm1794
价格太便宜了吧
前年mouser买的闲置的2个,正好用上 zxhdoop 发表于 2025-11-15 15:26
大制作赞一个,分体板能有效控制成本和提高成功率。PCM1794手册有写的,THD+N=0.0004%(-108dB)。
多谢大师鼓励~!
重新看了手册看到了,之前没注意哈哈,THD+N 108db真的不容易,估计都用贴片做到一个小板子上能实现,但是声音可能就不好听了