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#楼

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

德哥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
查看完整版本: DIY功能完整的全平衡PCM1794解码器STM32单片机