打印
[STM32F1]

按键消抖

[复制链接]
583|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
janewood|  楼主 | 2024-11-18 23:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实际波形在按下和释放的霎时都有抖动的现象,抖动时长的长短和按键的机械特性有关,一般5~10ms。通常我们手动按键然后释放,这个动作中稳定闭合的时长超过20ms。因此单片机在检测键盘是否按下时都要加上去抖动操作,有专用的去抖动电路,也有专门的去抖动芯片,但通常我们采用软件延时的方法就能够攻克抖动问题。
1、单片机中按键消抖程序
1.1单片机中,假STM32中,一般的方法(最简略的方法)
软件消抖程序:
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_14)==1)?{?delay_ms(20);//延时20ms再去检测按键值if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_14)==0) //相当于下降沿
{
KEY1 = 1; //KEY1被按下
}
}
1.2比较全面的按键消抖程序及按键状态检测程序
第一步:初始化全局时长戳的定时器,一般采SysTick定时器来产生,mstick即可。
第二步:初始化按键对应IO,复用为边沿触发的外部中断。
第三步:在外部中断函数中添加按键事件处理函数。
代码局部:
typedef struct _Key_t
{
u32 last_time;
enum
{
May_Press,
Release,
}private_state;
enum
{
No_Press,
Short_Press,
Long_Press,
}state;
}Key_t;
#define Is_ShortPress_Threshold 1500
简单定义一个按键状态的结构体,用于管理每个按键的状态。顺便再定义一个长短按的识别阈值,用于区分按键的长短按。
if(key_state.private_state==Release)
{
if(KEY==0)
{
key_state.private_state=May_Press;
key_state.last_time=course_ms();
}
}
else if(key_state.private_state==May_Press)
{
if(KEY==1)
{
if((course_ms()-key_state.last_time>10)&&(course_ms()-key_state.last_time
{
key_state.state=Short_Press;
key_state.private_state=Release;
}
else if(course_ms()-key_state.last_time>Is_ShortPress_Threshold)
{
key_state.state=Long_Press;
key_state.private_state=Release;
}
else
key_state.private_state=Release;
}
}
以上为需要添加到中断处理函数的按键事件处理函数,算法的核心是一个状态机。在本例中,按键被默认上拉,按下接地course_ms()为获取全局时间戳的函数。
思路解释如下:按键状态结构体有一个用于识别的状态位,默认处Release,也就是释放的状态。一旦按键被按下,中断触发,此时检查是否Relase状态,如果是就检查按键是否被拉低,如果是,此时进May_Press状态,也就是可能是按下的,并且记录此时的时间戳,这一步是消抖的关键。当按键被释放,由于是边沿触发,会再次进行处理,此时检查和上一次触发之间的时间戳之差,如果小10ms我们就认为是抖动,此时不会对按键输出状态进行修改,而是直接将按键状态置Relase状态,反之检查差值和长短按阈值之间的关系,state置位为对应的状态。消抖的核心在于记录时间戳,而这只是一个简单的赋值操作,并不耗费时间。
效率上来说,延时消抖花费时间在无意义延时上,而相对较好的定时轮询还是不可避免的在轮询,而现在这种方式完全是中断性质的。唯一多出的开销(全局时间戳)并不是只可以用于按键消抖,另外HAL库中存在直接获tick的函数,这样实现就更方便了。经实际测试,消抖效果可以达到其他两种消抖算法的水平。

使用特权

评论回复
沙发
桃醉| | 2024-11-25 21:49 | 只看该作者
确保消抖方法的可靠性:选择的消抖方法应能够有效地消除抖动,并能够在各种条件下稳定工作。
考虑响应时间:消抖过程可能会引入一定的延迟,需要权衡消抖效果和系统响应时间之间的关系。
适应不同场景:不同的应用场景可能需要采用不同的消抖方法或组合不同的方法以达到最佳效果。
总之,按键消抖是确保电子设备正确、可靠地识别按键操作的重要技术之一。通过选择合适的消抖方法和适当的硬件、软件措施,可以有效地消除按键抖动带来的影响。

使用特权

评论回复
板凳
诸葛MM| | 2024-11-25 22:31 | 只看该作者
硬件消抖:在按键电路中加入硬件消抖电路。通过使用RC滤波器、继电器等硬件设备来滤除电信号中的抖动部分。
软件消抖:通过程序控制实现消抖。在检测到按键状态变化时,采用延时一定时间后再次检测的方法来确认按键状态是否真的发生了变化。如果多次检测后按键状态仍然未发生变化,则认为按键状态稳定,并执行相应的操作

使用特权

评论回复
地板
yzzly| | 2024-11-26 14:50 | 只看该作者
软件滤波,连续几次(持续时间60毫秒以上)扫描都有效则认为有键按下。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

58

主题

1301

帖子

1

粉丝