如何为我的 ADC 输出添加迟滞?
Posted
技术标签:
【中文标题】如何为我的 ADC 输出添加迟滞?【英文标题】:How can I add hysteresis to my ADC output? 【发布时间】:2021-07-26 17:43:46 【问题描述】:我目前正在使用 C 为大学项目的微控制器(微芯片 PIC18F4520)编程,将其变成一个非常基本的 MIDI 控制器。我的代码使用 4520 的 10 位 ADC(模数转换器)来读取可变电阻器的位置,然后将该值降至 8 位 MIDI 值。如果自上次扫描以来 MIDI 值发生了变化,则它从 USART 将其作为 MIDI CC 消息输出(对于不熟悉 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;
我没有发布完整的代码,因为它都是针对我正在使用的微控制器的,并且不会特别有用。所有特定于微控制器的代码都可以正常工作,只是我用来实现滞后的逻辑没有达到我想要的效果。
【问题讨论】:
请澄清“没有做我想做的事”是什么意思。你想要什么,而不是什么? @Eben 我没有在我的 MIDI 监视器上看到来自 USART 的任何输出。我现在已经修好了;问题是oldMIDIvalue = newMIDIvalue;
在if
循环之外,并且更新速度比我转动电阻的速度要快。将它移动到循环内解决了这个问题。抱歉我一开始没说清楚
太棒了!现在你应该考虑用正确的解决方案来回答你自己的问题。一段时间后,您也可以标记它。据我了解,埃本的回答不是。这将有助于未来有类似问题的访问者。
谢谢,答案已发布。几天后我会尽量记住接受它,但如果你能在此期间投票将它推到列表中,我将不胜感激
【参考方案1】:
问题现已解决。将oldMIDIvalue = newMIDIvalue;
放在 if 循环之外意味着 oldMIDI 值在每个循环中都会更新,使用户没有时间在循环之间将电阻转得足够远。仅在从 USART 发送输出后,将 oldMIDIvalue = newMIDIvalue;
放在 if 循环中更新 oldMIDI 值,从而解决问题。
附: - 这是一个很难找到的问题,因为代码在调试过程中运行良好。如果在 if 循环中设置了断点,并且在代码在断点处暂停时转动了电阻,则没有问题。部分问题在于逻辑实际上在纸面上并没有缺陷,而只是物理控制的现实造成了问题。希望这可以省去其他人的麻烦!
【讨论】:
【参考方案2】:您当前的代码应该可以工作,您需要详细说明它是如何工作的。
如果你觉得你目前的静态滞后检测过于简单,你可以添加 一个简单的过滤器(添加一个带有前 N 个值的环形缓冲区,并与这些值的平均值进行比较)。
【讨论】:
对不起,我应该更清楚。我将更新原始问题以避免混淆 查看我对原始问题的评论;问题已解决。【参考方案3】:你可以试试
if((newMIDIvalue > (oldMIDIvalue+hystereis))||(newMIDIvalue < (oldMIDIvalue-hysteresis)))
/*Code here to send MIDI CC message to the USART - this also definitely works*/
#define hysteresis 2
【讨论】:
以上是关于如何为我的 ADC 输出添加迟滞?的主要内容,如果未能解决你的问题,请参考以下文章