野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10639|回复: 16

讨论下最入门最简单的IO实验,按键消抖

[复制链接]
发表于 2016-10-8 10:48:14 | 显示全部楼层 |阅读模式
本帖最后由 ㄗs-.蝸牛· 于 2016-10-8 12:36 编辑

好多人都说,消抖,简单,不就10ms么,说着就从兜里掏出了一条delay_ms(10);.....大兄弟你这样真的好么...

其实说起来按键消抖应该是相当简单了哦,但是为什么还要讨论呢,因为我觉得里面好像有很多技巧性的东西啊,我想多学学,看看众神们是怎样处理的,特别是多按键

有的说用简单的delay就行,你这么说考虑过整体系统的感受么,阻塞延时这个东西我是拒绝的,相信99%以上的人也是拒绝的,因为太耽误事了,搞得系统完全没有实时性可言

有的人说状态机,这个没有搞过,也没看到过求分享,求指教

还有的说用定时器10ms检测,如果多按键的话检测流程是怎么样的呢?要不要中断呢?

这一切的一切还是想即让按键高效,又不能让他误动作,如果我按了一下,没反应,这体验效果不好,如果按了一下动作好几次,那就出事了

所以来讨论一波按键处理吧

讲一个亲身经历,单位的事,我们设备主要以机械为主,设备是一个光闸,用来遮挡X射线的,照射线前需要对光野,所以我们的设备里有一个定时的板子,板子接了一个灯泡,一按开关等就亮,时间到了就灭,然后对光野,再曝光,曝光过程中灯是不亮的

我们之前的板子是用NE555做的延时,后来客户反正时间偏差较大,改用了单片机,此单片机没有中断,什么都没有,就一个简单的定时器,就这样开始做了,开始交给了另外一个人,我不知道,等我知道的时候是已经出事了,客户反应在开X光的时候,我们的灯也开了,而且是亮灭亮灭...

在工业探伤行业开X射线是有报警灯的,就是这样亮灭亮灭,我们医疗的没有。这一下子做出了个不得了的东西啊,太智能了,自带报警灯...客户很客气的说,要么来人给我解决,要么50台全额退货....

这我才介入,然后看代码编写者的程序,第一看就没再往下看,我就开始自己做了,他做的连延时消抖都没有,说是胆大好呢,还是无知好呢..

X射线是由高压发生器那边控制的,而且是高频的,所以是怀疑有干扰串入,单纯的delay的话治标不治本,如果干扰频率够高,delay是无用的,定时器的话又没有多余资源,所以我采用了软件计数的方式,后经验证确实没问题了,各个厂家,各个医院再没有反馈回来灯有自己亮灭的现象

我的思路很简单,按键按下,软件计数,记到一定值被判定为按键确实按下,这样也不阻塞程序,效率也可以

如果是干扰来的,电平势必会有高有低,那么被识别到电平不对时,所有软件消抖计数器清零,代码就不会被执行,然后由增加了按键锁,因为我们有一个按键,要控制亮灭

现应用到STM32上,下有视频

左边的按键对应左边LED,左边是加上计数消抖的,为了让它表现的明显点特意增加了时间,所以按下大概0.5S才有反应,实际应用减小就好了,右边是对比,简单写了个delay,也没有按键锁

我们现在主管把时间放慢,手多次按模拟干扰信号,可以看到右边只要按下就有反应,就当做是被干扰到,左边快速多次按下没有反应,代表干扰被滤掉

长时间按下:右边LED在闪烁,这也是误动作,实际情况下只应该动一下,其实加个东西就可以避免这问题很简单,左边按下只动作一次,按键锁的缘故

代码方面我也觉得挺复杂的,希望大神们分享下自己的经验和代码,给我们小白来学习学习~~~





按键消抖.rar

287.47 KB, 下载次数: 145

回复

使用道具 举报

发表于 2016-10-8 11:11:44 | 显示全部楼层
挺好的方法~                    
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-8 11:30:59 | 显示全部楼层

3Q但是我觉得是个好啰嗦的办法.....
回复 支持 反对

使用道具 举报

发表于 2016-10-8 11:54:27 | 显示全部楼层
看了楼主的程序,是用软件计数,计数满500.在给另一个变量计数,确定是人为的按下,在计数500,将按键锁死标志位置1.按键释放的时候锁死标志位置0.
感觉楼主这个方式挺实用的,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-8 12:24:08 | 显示全部楼层
xdh873939316 发表于 2016-10-8 11:54
看了楼主的程序,是用软件计数,计数满500.在给另一个变量计数,确定是人为的按下,在计数500,将按键锁死标 ...

但是确实好啰嗦啊.............
回复 支持 反对

使用道具 举报

发表于 2016-10-8 13:44:59 | 显示全部楼层
我来凑凑热闹
回复 支持 反对

使用道具 举报

发表于 2016-10-8 13:58:23 | 显示全部楼层
一个简单的细节能玩到这样的地步也是牛逼的不行
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-8 14:19:40 | 显示全部楼层
Mr.Guo 发表于 2016-10-8 13:58
一个简单的细节能玩到这样的地步也是牛逼的不行

虽然我没吃过这种亏,但是前车之鉴就在那,没办法,这亮灯还好说,如果是高压发生器出这种故障,自己就自动送高压那就要命了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-8 14:20:05 | 显示全部楼层

火哥来个宇宙超级无敌消抖方法
回复 支持 反对

使用道具 举报

发表于 2016-10-8 14:27:21 | 显示全部楼层
ㄗs-.蝸牛· 发表于 2016-10-8 14:20
火哥来个宇宙超级无敌消抖方法

没那个心思啊
回复 支持 反对

使用道具 举报

发表于 2016-10-8 15:23:53 | 显示全部楼层
  按键都有固定模式了,就是定时中断+FIFO缓存,你这个相当于没有定时中断,用了FIFO缓存
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-8 16:29:02 | 显示全部楼层
zhaoyi821103 发表于 2016-10-8 15:23
  按键都有固定模式了,就是定时中断+FIFO缓存,你这个相当于没有定时中断,用了FIFO缓存

哦,定时器的那种不了解,但是遇到那种没有任何中断的单片机咋办,比如我们用过的PIC12F509,简直吊炸天,什么都没有,只是一个8脚单片机...
回复 支持 反对

使用道具 举报

发表于 2016-10-8 17:04:32 | 显示全部楼层
本帖最后由 zhaoyi821103 于 2016-10-8 17:07 编辑
ㄗs-.蝸牛· 发表于 2016-10-8 16:29
哦,定时器的那种不了解,但是遇到那种没有任何中断的单片机咋办,比如我们用过的PIC12F509,简直吊炸天 ...

把大循环时间做为定时器,建立一个FIFO缓冲环,缓冲的大小根据大循环的时间做调整,缓冲里面要是全部填满1,说明按键稳定了,不过你这种小单片机,任务一般都不繁重,加点柱塞DELAY其实也无所谓,1MS一个应该没事
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-8 18:49:43 | 显示全部楼层
zhaoyi821103 发表于 2016-10-8 17:04
把大循环时间做为定时器,建立一个FIFO缓冲环,缓冲的大小根据大循环的时间做调整,缓冲里面要是全部填满 ...

delay的话,简单场合没问题,关键是比较恶心的场合就不行了,我们那个板子就是因为用电场合的问题出的事,delay多长时间的话,还是有很高几率被碰上delay和delay后状态是一样的时候,还有,如果大循环的话那不是跟我的办法差不多了么,这个办法其实还是有弊病的,如果中断到来且中断频繁或中断内容比较多,按键检测时间也会相应变长
回复 支持 反对

使用道具 举报

发表于 2016-10-8 19:33:44 | 显示全部楼层
ㄗs-.蝸牛· 发表于 2016-10-8 18:49
delay的话,简单场合没问题,关键是比较恶心的场合就不行了,我们那个板子就是因为用电场合的问题出的事 ...

抗干扰的程序设计可以试下双变量标志位,好像汽车电子里面就是这样用的
回复 支持 反对

使用道具 举报

发表于 2016-10-9 08:27:31 | 显示全部楼层
定时器定时10ms,使用状态机,判断释放状态,按下状态,扫描状态,按键处理为释放有效,就可以判断短按,长按。
回复 支持 反对

使用道具 举报

发表于 2016-10-9 15:20:57 | 显示全部楼层
本帖最后由 zhaoyi821103 于 2016-10-9 15:23 编辑
ㄗs-.蝸牛· 发表于 2016-10-8 18:49
delay的话,简单场合没问题,关键是比较恶心的场合就不行了,我们那个板子就是因为用电场合的问题出的事 ...

另外补充一点,干扰的情况应该设置,检测口上拉电阻,并且接个瓷片电容到地,键盘低电平才有效,这样可以抑制脉冲干扰。。。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-22 01:31 , Processed in 0.034128 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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