mchoi518 发表于 2025-11-15 14:00

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

mchoi518 发表于 2025-11-30 12:02


【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

mchoi518 发表于 2025-12-24 20:19


【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 *****

mchoi518 发表于 2026-1-10 10:11

【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:34

本帖最后由 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终于见到三个零了


mchoi518 发表于 2026-6-27 16:36

【2026年6月27日,用4层板重新做了解码和I/V,LPF】

想再提高指标,重新画了4层板,解码和I/V LPF板合并成一个,运放opa1612和opa828用了更小封装

结果指标一般,只有频响有点提升,我估计是0.1uf和2.2nf 都用了C0G贴片的原因吧~








德哥2023 发表于 2025-11-15 14:33

pcm1794

价格太便宜了吧:lol

l12345678qaz 发表于 2025-11-15 15:12

多谢共享!

zxhdoop 发表于 2025-11-15 15:26

大制作赞一个,分体板能有效控制成本和提高成功率。PCM1794手册有写的,THD+N=0.0004%(-108dB)。

ls0001 发表于 2025-11-15 15:43

赞!这样的Diy看着才有劲。

网上风雨68 发表于 2025-11-15 18:34

谢谢分享

夜如风 发表于 2025-11-15 18:52

楼主玩得大气磅礴,充分把机箱塞满。感谢分享。

晨曦细雨s 发表于 2025-11-15 19:05

瞄瞄

wpkz 发表于 2025-11-15 19:42

厉害了

筑明 发表于 2025-11-15 19:55

想学习PCM1794

zhaojunsong9986 发表于 2025-11-15 20:25

筑总玩一下

nos001 发表于 2025-11-15 22:56

厉害,比商品机好多了,商品机用上分立IV和LPF得卖上万。

nos001 发表于 2025-11-15 23:00

嘉立创有开源的XU208的USB界面,搜XU208能搜到。

初哥初哥 发表于 2025-11-15 23:15

感谢分享:handshake

cqxl 发表于 2025-11-15 23:25

楼主前面几版用的SOEKRIS分立R2R解码,后面换成1794解码了,更换的原因是什么?:lol

qa6153 发表于 2025-11-16 09:00

学习一下

lancelothy 发表于 2025-11-16 09:14

德哥2023 发表于 2025-11-15 14:33
pcm1794

价格太便宜了吧

对,这是便宜货,20块钱的PCM1794,又不支持DSD,最高又只能上192K,但这是TI的旗舰DAC,也是我们论坛烧友最容易DIY出好声音的方案,并且可以调整音色的部份有更多空间。所以为什么DIY论坛这么多人喜欢玩,不是没有道理的。当然啦,兄弟你有过硬的技术,弄个8并联或者16并联的ES9039PRO,DIY出来分享下给大家就最好了。:$

capa 发表于 2025-11-16 10:11

大制作,功夫都花在设备上有时间听音吗?:lol

mchoi518 发表于 2025-11-16 11:31

德哥2023 发表于 2025-11-15 14:33
pcm1794

价格太便宜了吧

前年mouser买的闲置的2个,正好用上

mchoi518 发表于 2025-11-16 11:33

zxhdoop 发表于 2025-11-15 15:26
大制作赞一个,分体板能有效控制成本和提高成功率。PCM1794手册有写的,THD+N=0.0004%(-108dB)。

多谢大师鼓励~!

重新看了手册看到了,之前没注意哈哈,THD+N 108db真的不容易,估计都用贴片做到一个小板子上能实现,但是声音可能就不好听了
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: DIY功能完整的全平衡PCM1794解码器STM32单片机