- 积分
- 511
- 在线时间
- 217 小时
- 最后登录
- 2024-6-26
- 阅读权限
- 50
- 精华
- 0
- UID
- 787724
- 帖子
- 448
- 精华
- 0
- 经验
- 511 点
- 金钱
- 419 ¥
- 注册时间
- 2015-3-20
|
楼主 |
发表于 2024-3-1 15:40
|
显示全部楼层
本帖最后由 丰年好大雪 于 2024-3-1 15:48 编辑
这个就是瞬间的混叠,和R2R那个毛病完全一样。解决方案是在代码里加延时,论坛上很多人并没有实践的想法,所以很难发现这个需要具体调参的问题。
比如:
这个就是瞬间的混叠,和R2R那个毛病完全一样。解决方案是在代码里加延时。
比如:
I2C_Write(TCA9554_ADDR1,0x01,VALUE_1); //先把继电器都给跳喽
delay_ms(10); //没啥用,就是延时一下
switch(VALUE_1) //将真值变量送入switch语句转换成LED字符显示,我这里用了笨办法预设值查表,没有用更高级的枚举类型加指针,就是为了让初学者能看明白
这个地方。
先把继电器都给跳了就是先把音量衰减到最大,然后再接通,这就是许多模拟的手动波段开关强调自己是“先通后断”或者“先断后通”的原因,你可以通过调节这个delay_ms后边括号里的数字,来控制这个音量衰减的时间,只要做得恰好,听不出瞬间断了一下。实测100us没问题,欧姆龙、国产宏发的HF4小型信号继电器的跳开时间都是15us上下,比较精确,可以慢慢调试着弄。
如果再“高级”一点,可以在switch(VALUE_1)之前,做一个2-3级的“假平滑”,就是把VALUE_1的数字先暂时存到一个变量里,比如叫A,然后对这个A进行“移位操作”,比如先左移一位,这样,二进制1000代表8,移位一次后变成了10,然后把这个10送进switch(VALUE_1)先做一下“不到位的衰减”,然后再移一位,再衰减,直移到MSB为1停止,再把真正的VALUE_1送进去衰减。这样音量会在几个ms内实现类似平滑的效果,而且由于特有的二进制移位计算,这个曲线是类似对数曲线一样的东西……。
不过上述的玩法有点复杂,我没舍得在音频上使用,而是在用Arduino设计新的项目时作为抗混叠用了。 |
|