丰年好大雪 发表于 2025-10-20 13:32

开源64位继电器音量工程上传完毕,可以等待下载制作

本帖最后由 丰年好大雪 于 2025-10-20 13:37 编辑

地址: https://oshwhub.com/hyperma/64-gear-small-relay-volume-poten

https://image.lceda.cn/oshwhub/pullImage/09a38f570cb54d74a80a0251c3749419.jpg
因一些琐事一直在工作之余调试DAC模块,忘记了还有个64位继电器音量衰减器的工程,完善了电路图后制作了一版,一次成功。

https://image-pro.lceda.cn/pullimages/ced5aec3b63e4633bbca11e0a889db8d.webp

之前烧友提出的使用磁保持锁存型继电器,经过试验发现了很大的问题,由于无法确知此型继电器的通断,因此在意外断电或意外通断后,逻辑将陷入混乱,因此废弃不用了。

经过试验,完全可以仅使用5V 1A直流输入,驱动两个电位器板,控制4声道实现平衡音量没有任何问题,ULN2003不会发热。当使用5V电源时,可以用跳线将78L05左右两个针脚短接。

电阻搭配请到:
https://www.vaneijndhoven.net/jos/attenuator-calculator/index.html
自行计算。千万注意原图给出的逻辑是旁路掉,即最大音量,默认状态下全关,所有开关断电下应该向右接通

cq120104 发表于 2025-10-20 16:05

继电器线圈不并二极管?

jure 发表于 2025-10-20 16:31

cq120104 发表于 2025-10-20 16:05
继电器线圈不并二极管?

ULN2003内置了二极管,可以不并

ls0001 发表于 2025-10-21 22:51

于无法确知此型继电器的通断,因此在意外断电或意外通断后
如果恢复通电前不能默认不动作(保持上次通电前的状态,可能存在最初出厂状态未知,只通过一次电之后就好了吧),默认开机重新初始化为最小音量是否可行。

中山阿惕 发表于 2025-10-22 06:41

有解决011111到100000之间的可能的爆音?

aspor 发表于 2025-10-22 10:04

楼主你好, 对这个电位器很感兴趣。怎么联系你。

yanjun903 发表于 2025-10-22 20:21

感谢分享

丰年好大雪 发表于 2025-10-23 02:23

中山阿惕 发表于 2025-10-22 06:41
有解决011111到100000之间的可能的爆音?

曾经考虑过做一个毫秒级先断后通,但实践中发现由于HFD4系列继电器的通断时间是精确的10uS级,并未发现爆音问题,反而是无法避免的会有因ADC采样glitch“混叠”,而造成继电器“嘎嘎嘎……”震荡,这个完全没有办法。

丰年好大雪 发表于 2025-10-23 02:23

aspor 发表于 2025-10-22 10:04
楼主你好, 对这个电位器很感兴趣。怎么联系你。

你要干吗?商品化吗?程序都全,拿走随便改。

丰年好大雪 发表于 2025-10-23 02:26

ls0001 发表于 2025-10-21 22:51
如果恢复通电前不能默认不动作(保持上次通电前的状态,可能存在最初出厂状态未知,只通过一次电之后就好 ...

这个电路目前无法避免的问题,就是楼下说的,ADC采样从01111-10000之间的混叠,造成的电位器震荡,而在这个状态后,实际上单片机是无法获知每个继电器精确状态的。它不像单稳态,断电后必然是关断,因此必须针对每一个继电器,设计一个通断指示器,并回馈MCU,这样的话成本倒放一边,结构太复杂了。

中山阿惕 发表于 2025-10-23 07:14

丰年好大雪 发表于 2025-10-23 02:23
曾经考虑过做一个毫秒级先断后通,但实践中发现由于HFD4系列继电器的通断时间是精确的10uS级,并未发现爆 ...

怎么可能是US,HFD4是3mS动作。
这个测试要播放低频,比如大鼓,突然音量变化,会产生直流成分,形成爆音。

sunvio 发表于 2025-10-23 10:11

本帖最后由 sunvio 于 2025-10-23 10:12 编辑

太棒了,有个不成熟的建议不知道实现起来会不会很难,小弟对单片机不了解,比如增加一个遥控继电器,遥控按下后这个继电器导通代表开机,关机后仅有开关机有反应,比如操作音量无反应,比如增加个两三位的数码管指示当前音量

丰年好大雪 发表于 2025-10-23 15:07

本帖最后由 丰年好大雪 于 2025-10-23 15:10 编辑

sunvio 发表于 2025-10-23 10:11
太棒了,有个不成熟的建议不知道实现起来会不会很难,小弟对单片机不了解,比如增加一个遥控继电器,遥控按 ...

最早设计这个东西的想法,就是完全兼容控制逻辑简单、设计简易的27型电位器。

从技术设计上来说,如果需要引入遥控难度很小,只需要一个空引脚接到一个红外光敏二极管即可,板上预留了一个上/下拉引脚,或者如果不用I2C,就可以拥有3个空引脚,可以自行编程使用。

但从成品的外观设计、使用逻辑来说,遥控需要前面板单端开窗,或者与显示窗做在一起,而如果要使用显示屏,就可以放置音量显示了,音量显然也需要遥控器控制了。如果是那样,电位器控制音量就不合适了,或者需要使用ALPS带电机的电位器,成本一下子上去了。所以使用设计更简单的旋转编码器反而更适应这种设计。

简单面板->只有电源、输入/输出端口等LED状态显示->放不下音量显示->也放不下遥控->最好兼容传统电位器
复杂面板->开窗可放置OLED、LCD等显示屏->也放得下遥控接收管->旋转编码器控制音量

也因此,这个项目极其适合自行DIY简单的合并式功放、耳机放大器、唱头放大器等,可以实现低成本高速的模块化研发。希望可以解答你的问题。

丰年好大雪 发表于 2025-10-23 15:23

本帖最后由 丰年好大雪 于 2025-10-23 18:04 编辑

中山阿惕 发表于 2025-10-23 07:14
怎么可能是US,HFD4是3mS动作。
这个测试要播放低频,比如大鼓,突然音量变化,会产生直流成分,形成爆 ...

≤3ms,实测没有达到1ms的。如果担心会出问题,可以在程序函数里添加先清零再置位语句。

while(1)
        {
                ……
               
                if(Vol == Last_Vol)                                //如果音量值没变化
                {
                        Sum = 0;                                        //Sum清零
                }
                else
                {
                        SetPins(0x00);                //先音量清零
                        delay_ms(4);                                //等待4ms继电器动作完成
                        SetPins(Vol);                                //6bit值赋值引脚电平赋值函数
                        Last_Vol = Vol;                                //将值存入旧值变量
                        Sum = 0;                                        //Sum清零
                }
                delay_ms(5);                                        //因增加了4ms关断,故而减少函数整体时延,否则音量调整会整体迟钝
        }

decaJi 发表于 2025-10-26 10:11

继电器板R2只是并在输入端,并不与R1形成分压,R2的作用是什么?如果IN与OUT调换,R2才与R1分压。

decaJi 发表于 2025-10-26 10:28

中山阿惕 发表于 2025-10-22 06:41
有解决011111到100000之间的可能的爆音?

产生爆音是因为由011111到100000转换时,中间有短暂1111111,音量为最大,所以产生爆音。我解决方式是:断开要立马断开,闭合的延时3~5毫秒

丰年好大雪 发表于 2025-10-27 00:01

decaJi 发表于 2025-10-26 10:11
继电器板R2只是并在输入端,并不与R1形成分压,R2的作用是什么?如果IN与OUT调换,R2才与R1分压。

请注意HFD4继电器默认不吸合状态的接通引脚。

Rafier 发表于 2025-10-27 14:40

计算阵列阻值的时候,选择输出阻抗恒定吗?

丰年好大雪 发表于 2025-10-27 16:36

Rafier 发表于 2025-10-27 14:40
计算阵列阻值的时候,选择输出阻抗恒定吗?

是的,负载电阻会加载在最后边

Rafier 发表于 2025-10-27 18:47

decaJi 发表于 2025-10-26 10:28
产生爆音是因为由011111到100000转换时,中间有短暂1111111,音量为最大,所以产生爆音。我解决方式是: ...

续电器开合的控制函数改成这样?
void SetPins(u8 value)
{
        if(value & 0x01) {delay_ms(5) ; P32 = 1;}else{P32 = 0;}
        if(value & 0x02) {delay_ms(5) ; P33 = 1;}else{P33 = 0;}
        if(value & 0x04) {delay_ms(5) ; P34 = 1;}else{P34 = 0;}
        if(value & 0x08) {delay_ms(5) ; P35 = 1;}else{P35 = 0;}
        if(value & 0x10) {delay_ms(5) ; P36 = 1;}else{P36 = 0;}
        if(value & 0x20) {delay_ms(5) ; P37 = 1;}else{P37 = 0;}
}
页: [1] 2 3
查看完整版本: 开源64位继电器音量工程上传完毕,可以等待下载制作