在单片机开发经常需要去抖,那么什么是去抖?
去抖动是一个通用术语,并不指定任何特定的控制器芯片。
在微控制器中使用按钮时(尤其是弹片按钮),比如需要使用边沿触发来执行某些操作(例如切换 LED 状态、计数、中断)。
由于机械设计限制和老化效应…… 这些按钮可能没有良好的接触,按下按钮时发生多次接触与断开,因此它可能会在一次按下时产生多个上升沿(当然也是下降沿..)。
它也发生在释放按钮时......这可能导致控制器被误解为多次按下......。它会多次切换 LED 状态(或执行多次中断子程序),导致控制器错误操作。
如果发生在涉及计数器的过程将产生更麻烦的问题…。它将一次按压计算为几次按压,而这“几次”造成的后果是不可预测的。
按钮和控制器引脚之间涉及的这种不良现象称为抖动(弹跳)。
我们用来避免因抖动而引起的麻烦的方法称为去抖。
常用的去抖方法被归类为:硬件去抖动和软件去抖动
硬件去抖:
在开关的端子上使用电容器绕过高频脉冲序列(由弹跳引起),使其像单步信号一样发送给控制器。
软件去抖:
编写程序,当引脚实现上升沿时,进入延迟程序一段时间(比如200-500ms)并再次检查引脚是否处于高电平或低电平状态(以确认是否有意按下按钮)。
如果此检查完成,处理器将进行按钮按下操作。
//开关状态
#define SWITCH_PRESSED 1
#define SWITCH_BOUNCE 0
//检查Switch状态的函数
int Switch_Debounce(void)
{
int status = SWITCH_BOUNCE;
if(Switch == 0) // 按下开关
{
DebounceDelay();
if(Switch == 0)
{
status = SWITCH_PRESSED;
}
}
return status ;
}
void DebounceDelay(void)
{
int i = 0;
for(i=0; i < DEBOUNCE_VALUE; i++)
}
200-500 毫秒的延迟时间为发光所有伪上升沿(下降)。因此避免了引发引发的问题。