本帖最后由 anywill 于 2016-11-9 06:58 编辑
按键防抖是单片机按键应用经常需要处理的问题,之所以要防抖是因为我们在按键的过程中存在抖动,从而造成高低电平变化影响应用程序的效果, 消抖是指消除按键接触时产生的干扰抖动杂脉冲波。 硬件消抖是通过采用外加零件来消除干扰抖动杂脉冲波,通常采用电容滤波、单稳延时电路等等。 软件消抖是通过采用软件程序的方法来达到消除干扰抖动杂脉冲波,最常见的是软件采用延时再次检测的方法来消抖。 补充: 按键按下时的瞬间,它的两片触片不是“理想”地立即接触的,特别是按键开关用了一段时间后,触片有些氧化和老化, 这一点,如果用示波器来观察,就能观察到按键接触时的脉冲变化中附带有许多抖动波。
另,无论采用硬件还是软件方法,消除抖动波只是它主要的功能,它还起到消除干扰的作用。
如下面的未消抖按钮中断代码: InterruptIn button(PC_13); DigitalOut led1(D13); void toggle() { led1=!led1; } int main() { button.rise(&toggle); } 该代码其实前面已经应用过,如果我们在这里多按几次,你就会发现偶尔工作不正常的情况,这是因为管脚输入有波动, 为此,我们需要延迟判定用户按下的效果,这可以简单地通过Timer来实现,改进后的代码如下,实际测试后会发现效果好很多。 InterruptIn button(PC_13); DigitalOut led1(D13); Timer debounce;//消抖定时器 void toggle() { if (debounce.read_ms()>10) //消抖延时10ms led1=!led1; debounce.reset(); //重置定时器 } int main() { debounce.start(); button.rise(&toggle); }
|