微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何为 ADC 输出添加迟滞?

如何解决如何为 ADC 输出添加迟滞?

我目前正在使用 C 为大学项目编写微控制器(微芯片 PIC18F4520),将其变成一个非常基本的 MIDI 控制器。我的代码使用 4520 的 10 位 ADC(模数转换器)读取可变电阻器的位置,然后将该值调整为 8 位 MIDI 值。如果自上次扫描以来 MIDI 值发生了变化,那么它会将其作为 MIDI CC 消息从 USART 输出(对于不熟悉 MIDI 协议的任何人来说,这是 3 字节消息的第 3 个字节)。 但是,输出通常最终会在 2 个相邻值之间闪烁,因此我想添加一些滞后,以便该字节仅在比前一个 MIDI 值大或小 2 时才会发送到 USART。我的代码的基本要点是:

while(1){
/*Code here to perform ADC and condition this to a MIDI value - this dedinitely works*/

   if((newMIDIvalue > oldMIDIvalue+2)||(newMIDIvalue < oldMIDIvalue-2)){
   /*Code here to send MIDI CC message to the USART - this also definitely works*/
   }
   
   oldMIDIvalue = newMIDIvalue;
}

我没有发布完整的代码,因为它都是针对我正在使用的微控制器的,并且不会特别有用。所有特定于微控制器的代码都可以正常工作,只是我用来实现滞后的逻辑没有达到我想要的效果

解决方法

问题现已解决。将 oldMIDIvalue = newMIDIvalue; 放在 if 循环之外意味着旧的 MIDI 值在每个循环中都会更新,让用户没有时间在循环之间将电阻转动得足够远。将 oldMIDIvalue = newMIDIvalue; 放入 if 循环中,仅在 USART 发送输出后才更新 oldMIDIvalue,从而解决问题。

附言- 这是一个很难找到的问题,因为代码在调试过程中运行良好。如果在 if 循环中设置了断点,并且在代码在断点处暂停时打开电阻器,则没有问题。部分问题在于逻辑实际上并没有在纸面上存在缺陷,只是物理控制的现实造成了问题。希望这可以省去其他人的麻烦!

,

您可以尝试使用

if((newMIDIvalue > (oldMIDIvalue+hystereis))||(newMIDIvalue < (oldMIDIvalue-hysteresis))){
   /*Code here to send MIDI CC message to the USART - this also definitely works*/
   }
#define hysteresis   2
,

您当前的代码应该可以工作,您需要详细描述它是如何工作的。

如果你觉得你当前的静态滞后检测太简单了,你可以添加 一个简单的过滤器(添加一个带有前 N 个值的环形缓冲区,并与这些值的平均值进行比较)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。