本帖最后由 曹文涛 于 2013-12-16 21:49 编辑
- if(key)
- {
- Delay_ms(10);
- if(key)
- {
- ……
- }
- }
复制代码
以下是网上普遍对软件消抖的解释
“检测到按键输入为0之后,延时5ms~10ms,再次检测,如果按键还为0,那么就认为有按键输入。延时的5ms~10ms恰好避开了抖动期。”
记得初学单片机时,就对这个软件消抖留下好多问题。特别是我很纠结于延时10ms后再做一次判断,如果第二次判断不符合条件没进入,那这是什么情况?(解释上没详细说明)。后来也没彻底搞明白软件消抖,但一直用着挺好,也没出问题。今天搞程序的时候,偶然发现一种更好的理解,解决了我的不少困惑。
人按按键的频率是多少?也就是我们一秒钟能按几次按键?这个我们可以尝试下,快的可能会到20次,慢的可能5、6次,但我们考虑正常的按键输入速度,暂且取为10次。那就是说我们人的按键输入频率为10HZ,那我们就以10倍的采样频率去采样(是符合采样定理的),即以100HZ的频率去采样(这里我认为就是我们延时10ms的原因),这样可以真实还原人的按键输入信号。那延时10ms后的判断到底有什么意义?我们延时10ms读一次按键值,即以100HZ进行采样,如果连续两次采样的键值不同,那我们有充分的理由认为就是抖动(这里的抖动也是相对我们人的按键输入速度来说的),不对其响应。为什么它是抖动呢?因为我们事先已经确定,我们人的正常按键输入频率就是10HZ,采样频率为100HZ,在10ms内出现键值变化不可能是人为产生的,即意料之外的现象,这里面可以包含按键按下或弹起时的抖动也可以是电磁干扰,总之相对于人的按键输入信号都是抖动。
最后来总结一下,
软件消抖中的延时应该是根据我们想要采样的信号的最高频率来定的,比如某个输入信号的最高频率为100HZ,那我们就已1KHZ去采样,即延时为1ms。这种软件消抖其实是有漏洞的,但可以滤去大部分干扰且成本低,要得到更好的消抖或者滤波效果可以选用更好的滤波算法,或者选择硬件消抖,可靠性高。
O(∩_∩)O~,谢谢澄清!是的,我现在也不用死等延时了,这里为了说明问题,就偷懒用这个“经典”的消抖代码。消抖和消干扰可以做在一起,根据有效信号的最高频率,确定采样频率,就能把有效信号还原,滤去抖动或者干扰信号,但不能滤去同频段的干扰(这里也包括高频干扰中混杂的低频干扰,这样的干扰,硬件也比较难以消除,可以通过高频采样+智能算法滤去)。要消除干扰,第一步是采样,相当于我们软件消抖中的延时;第二步是判断,相当于软件消抖中的两次if结构(两次确认的判断虽然成本低且较为有效,但漏洞也大。判断两次键值,如果不一样可以认定是干扰,但一样不一定就是有效信号。多次判断能增加判断为有效信号的概率,但引入一些风险,比如不提高采样频率的情况下,做多次判断其实是降低了采样频率,可能会导致失真,即漏检真实按键。提高采样频率,又可能会引入高频干扰,增加判断成本。
讨论这么多,其实对于正常的按键输入,就用一般的延时消抖就可以解决问题,我们以上讨论的都是概率相对比较低的特殊情况。对于按键输入我们所说的干扰无非就是按键抖动,延时消抖简单而有效。
一周热门 更多>