本帖最后由 曹文涛 于 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。这种软件消抖其实是有漏洞的,但可以滤去大部分干扰且成本低,要得到更好的消抖或者滤波效果可以选用更好的滤波算法,或者选择硬件消抖,可靠性高。
一周热门 更多>