硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1323|回复: 13
收起左侧

[GPIO] 按键弹起消抖疑惑,看了好久没太明白。

[复制链接]

5

主题

12

回帖

27

积分

新手上路

积分
27
发表于 2022-11-20 13:52:04 | 显示全部楼层 |阅读模式
今天看按键消抖的代码,看到弹起消抖时有点疑惑。如果是弹起时,抖动了,是又要去执行一遍按下消抖吗?有大佬帮忙解释一下,看了很久还是没看太明白。
image.png
image.png

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2022-11-21 09:06:42 | 显示全部楼层
是的,需要按下消抖,松手也需要消抖的。

这个在BSP驱动手册按键章节:第19章
https://www.armbbs.cn/forum.php?mod=viewthread&tid=86980

或者视频教程章节都有说明:
视频教程第10期:STM32H7的GPIO专题,非阻塞式驱动编程思想,按键FIFO,蜂鸣器驱动的新式玩法(2022-03-23)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=111527
回复

使用道具 举报

5

主题

12

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2022-11-21 09:46:18 | 显示全部楼层
eric2013 发表于 2022-11-21 09:06
是的,需要按下消抖,松手也需要消抖的。

这个在BSP驱动手册按键章节:第19章

大佬,早上好。我可能没表述清楚。如果弹起消抖没有完成,确实是真的弹起抖动,假如这时pBtn->=2,这个时候就会转去执行if(IsKeyDownFunc(i))这里,就会重新执行一遍按下消抖,发送按下的消息。按照常理来说,这个时候,不应该忽略吗?因为这是一次按下。恳请大佬解惑。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2022-11-21 10:07:36 | 显示全部楼层
凉粉 发表于 2022-11-21 09:46
大佬,早上好。我可能没表述清楚。如果弹起消抖没有完成,确实是真的弹起抖动,假如这时pBtn->=2,这个时 ...

这里有两点注意事项:
1、一般按钮抖动,不会抖出0-3.3V这么大幅度的抖动。一般都是判断按下或者松手是否有效。
2、然后假如你松手消抖期间检测到一个按下,这个也没有关系,他要继续做按下消抖判断。这个抖动是不足以支撑出一个按下消息发出来的。
回复

使用道具 举报

5

主题

12

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2022-11-21 10:36:23 | 显示全部楼层
eric2013 发表于 2022-11-21 10:07
这里有两点注意事项:
1、一般按钮抖动,不会抖出0-3.3V这么大幅度的抖动。一般都是判断按下或者松手是 ...

大佬,你好。我说的是这种情况:按下后在稳定时,如果一个松开抖动,这种情况不应该再发按下消息吧。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2022-11-21 10:52:29 | 显示全部楼层
凉粉 发表于 2022-11-21 10:36
大佬,你好。我说的是这种情况:按下后在稳定时,如果一个松开抖动,这种情况不应该再发按下消息吧。

1、从硬件角度来说,按下稳定后不会出现这种脉冲,稳定后自己还出这种脉冲硬件出问题了,人手动操作很难在稳定的按下期间搞出这种短暂脉冲。

2、从软件角度来说,即使出来了也没有关系,就是所谓的误触发了。重新操作即可,不过这种出错的概率极其小。当然,如果你不放心的话,给这个引脚并个电容效果最佳,过滤短脉冲。软件上再做稳定按下期间的消抖,意义不大。
回复

使用道具 举报

5

主题

12

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2022-11-21 11:03:07 | 显示全部楼层
eric2013 发表于 2022-11-21 10:52
1、从硬件角度来说,按下稳定后不会出现这种脉冲,稳定后自己还出这种脉冲硬件出问题了,人手动操作很难 ...

好的,谢谢大佬。
回复

使用道具 举报

14

主题

62

回帖

104

积分

初级会员

积分
104
发表于 2022-11-21 11:07:47 | 显示全部楼层
加个数字滤波,消抖不需要区分按下/谈起。
1ms中断内这样采样:

if(io)
    filter++;
else
    filter--;
if(filter >=5)
{
    filter = 5;
    key =1;
}
else if(filter <= -5)
{
    filter = -5;
    key = 0;
}
回复

使用道具 举报

2

主题

269

回帖

275

积分

高级会员

积分
275
发表于 2022-11-21 11:58:54 | 显示全部楼层
不要重复造轮子,MultiButton你值得拥有

https://github.com/0x1abin/MultiButton
回复

使用道具 举报

5

主题

12

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2022-11-21 14:03:48 | 显示全部楼层
apleilx 发表于 2022-11-21 11:07
加个数字滤波,消抖不需要区分按下/谈起。
1ms中断内这样采样:

大神,能发个完整的吗?
回复

使用道具 举报

5

主题

12

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2022-11-21 14:10:05 | 显示全部楼层
cctv180 发表于 2022-11-21 11:58
不要重复造轮子,MultiButton你值得拥有

https://github.com/0x1abin/MultiButton

感谢大神分享,这个按键思路很清晰。
回复

使用道具 举报

14

主题

62

回帖

104

积分

初级会员

积分
104
发表于 2022-11-22 14:20:07 | 显示全部楼层
凉粉 发表于 2022-11-21 14:03
大神,能发个完整的吗?

这个本来就是完整的,io是你的管脚状态,filter是个带符号变量,key是滤波后的按键状态值
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2022-11-24 16:54:27 | 显示全部楼层
推荐《嵌入式系统构件》里面的方法。那本书有源代码,结合ucos非常好用。
矩阵式键盘扫描用的是状态机,移植的时候只需要改扫描IO的输出和输入,使用的时候直接从缓冲区读取按键值。
回复

使用道具 举报

5

主题

12

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2022-11-25 10:40:20 | 显示全部楼层
zouhp 发表于 2022-11-24 16:54
推荐《嵌入式系统构件》里面的方法。那本书有源代码,结合ucos非常好用。
矩阵式键盘扫描用的是状态机,移 ...

感谢大神推荐。大概看了下,确实适合我。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 18:12 , Processed in 0.283511 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表