打印

消抖......好麻烦的消抖...

[复制链接]
6105|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zq1987731|  楼主 | 2008-11-29 17:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    目前做了一小系统。有点像于PLC...
    因为系统资源相当紧张,所以浪费不了半点时间。
    其中数字量输入由于是按键/开关等等机械装置,所以需要消抖...但又不想用Delayms(10);这样的函数来,效率会被拖下去好多的,另外定时器的话也很麻烦...毕竟设置10ms后才来访问这些开关量输入的话,在此之间确实可以做些事,但主要问题是...后续的一大堆程序几乎都要参照数字量输入才能启动的,所以设个定时器标志等定时器10ms到就激活然后再读输入的方式相对而言也很浪费时间...毕竟处理完差不多1个ms就能解决完的不依靠开关量输入的任务后就等于在死等定时器计时到10ms,这样的话无异于调用Delayms(8);
    然后我想从硬件上动手,
    想法1:用EPM240的CPLD,用它来对开关量消抖,然后MCU以SPI的主模式接收这些开关量,同时EPM240以从方式从MCU接收开关量的输出并控制相关输出点,这个想法自我感觉挺好的,不过想真正实施的时候才发现PCB空间严重不足(本来这电路板上的贴片元件就挤得前胸贴后背的)...所以只好搁置...
=================================================================
    想法2:(RC滤波什么的看了就头晕...如有不对请指出)
    输入部分还有一定的电路板空间,所以完全足够增加些硬件..
    我现在的小系统是采用(下面的附图)中【1号】那张,当初的想法比较简单...通过那个1μF电容,在有按键输入的时候延迟10ms响应速度,等电容端电压跌落至74HC14的输入门限了就反转至高电平输出,然后我意外得发现忘加电阻了,电容端估计是直接通过光耦输出侧的CE放电...一般机械抖动防不住仍然需要软件消抖的吧?
    那么【2号】那张图是否可以做到硬件消抖呢?(其中R4和R5的值不清楚是否需要增大?反正74HC14输入电流1μA就足够...)至少这里加了电阻了,我就不信那个1μF电容还能那么快把电放光...
    话说...电容充电时间是不是按1F需要1A电流充电1S这样计算的呢?记得有个3τ的时间...以前的东西好多都还给老师了...
    【3号】只是把那两个阻容放到74HC14后面而已...效果就不得而知了...
=================================================================
    如果都不行的话在【2号】的74HC14输出端再加一级10K和1μF的RC是否有所改善呢?郁闷...请大家帮忙提些意见,板砖也行- -...

相关帖子

沙发
ayb_ice| | 2008-11-29 17:23 | 只看该作者

你这真是瞎折腾

用硬件替代软件,花钱还不讨好。。。

使用特权

评论回复
板凳
xwj| | 2008-11-29 17:27 | 只看该作者

唉,先学会用状态机写0耗时的消抖程序吧

完全能够用软件解决的哦

使用特权

评论回复
地板
5880527| | 2008-11-29 17:39 | 只看该作者

我的笨办法

比如你每一个输入都定义三个位变量:X0BIT,X0BIT0,X0BITL。X0BIT为消抖后能用的值,X0BIT0为当前临时值,X0BITL为前一状态。开一定时器,每一次循环把当前X0输入状态读进来同X0BIT0比较,如果相同则把这个状态存到X0BIT,并把输入状态存到X0BIT0。这样就能保证任何时候X0BIT里的状态是消抖后的最新值了,可以放心使用。有关输入的操作处理完后把X0BIT存到X0BITL,你要用沿变化都有了,几十个数字量或键盘也不会浪费多少时间的

使用特权

评论回复
5
AIRWILL| | 2008-11-29 18:51 | 只看该作者

这个笨办法还不错

基本达到了0耗时消抖算法的要求, 只是2次确认, 有点欠确认. 我的做法通常要3 到15 次.反正0耗时, 提高频率, 多几次何妨?

使用特权

评论回复
6
zq1987731|  楼主 | 2008-11-29 19:12 | 只看该作者

恍然大悟!

太久不用竟然把状态机忘了,罪过啊罪过...
谢谢LS各位...这回不用考虑硬件增加,反而还可以考虑减少了...

使用特权

评论回复
7
johnwjl| | 2008-11-30 18:50 | 只看该作者

所以....

搞硬件的也要懂点软件.

使用特权

评论回复
8
zcw9911| | 2008-12-1 12:31 | 只看该作者

去掉那个74HC14试试

    用来光偶再整形,效果不一定好

使用特权

评论回复
9
gx_huang| | 2008-12-1 12:35 | 只看该作者

许多人受教科书影响太深!

比如5个毫秒定时中断一次,连续4个一样才确认状态翻转,很可靠呀!

使用特权

评论回复
10
汽车电子| | 2008-12-1 12:41 | 只看该作者

哎,看来楼主是新手,没做过键盘扫描程序

    消抖很容易的

使用特权

评论回复
11
5880527| | 2008-12-1 12:43 | 只看该作者

不同的输入消抖的时间是大不相同的

有的用几个nop就可以了,有的需要好几ms,甚至有需要秒的,但教科书上那种原地延时消抖真是害人

使用特权

评论回复
12
HWM| | 2008-12-1 12:49 | 只看该作者

“许多人受教科书影响太深!”这话有点读书无用论的味道

“教科书是死的,人是活的”,这句话的另一个含义是,同样是一本教科书,有人可以融会贯通,有人只是照瓢画葫。更有甚者,书都不看,自以为是。

使用特权

评论回复
13
5880527| | 2008-12-1 12:52 | 只看该作者

不过书店里的很多书确实是害人的呀

使用特权

评论回复
14
程序匠人| | 2008-12-1 14:09 | 只看该作者

活学活用才是关键啊

使用特权

评论回复
15
zq1987731|  楼主 | 2008-12-1 18:49 | 只看该作者

怎么扯到教科书上去了- -...........

    我以前在学校用51单片机都处理些简单的事情,死等的消抖的10ms对系统一点影响都没...对实时性的要求实在是不高,只要能把按键读进来就行。
后面发现效率低的时候就在定时器中置10ms自动重装,但我发现程序如果运行时间超级短的话...和死等没区别,比如:
(下面假设消抖需要时间10ms)

// 定时器若10ms连续读取到2次同样的值(中断服务程序中),KEY_State = 1; 无按键或干扰键KEY_State = 0; 
volatile uint8 KEY_State = 0;
while(1)
{
    if(KEY_State)
    {
        KEY_Operation();       // 运行需要:2ms  
    }
}

上面这个程序执行了2ms,其余8ms就在发呆了...效率是比10ms高了2ms没错,但要求不高的话还不如delayms(10);即满足要求又方便省力...
但如果KEY_Operation(); 运行需要>10ms,那么这个方法就确实超级省事了...

    后面我用了个ZLG7290,什么麻烦事都没了...但现在因为一切向“省”靠拢,板上空间和成本都要算进去,故只好用MCU自己去消抖了。

    其实具体的要求是读取24路常开/常闭混合的开关量输入,需要知道每个按键输入了几次(对应常开/常闭按键的上升/下降沿),以及多个键同时按下/放开的先后顺序,根据设置还要进行长短击判定,有些紧急事件要在中断中就要处理或者预处理,比如长击2次就要以最快速度处理XXX最紧急事件等等...短击2次就要处理XXX比较紧急但晚点也不会出事的事件...
    不采用RTOS是因为没有外扩RAM,需要的相关资源定义后8K的片内SRAM就剩200多个字节了..(之前上UCOS,编译一下发现一个任务都没加就先用掉5K内存了...- -)

使用特权

评论回复
16
airwill| | 2008-12-1 20:14 | 只看该作者

我也很反感教科书

中消抖的提法.
虽然活学活用是正确的.

但教学, 不是把严谨的态度教给人家, 也在误人.

现在还有很多人在学习和应用那个消抖呢!
"小学而大遗"了!

使用特权

评论回复
17
liuchg1981| | 2008-12-1 20:51 | 只看该作者

这样搭硬件可以吗?

我觉得在光耦的输入端并一个电容也可以起消抖作用

使用特权

评论回复
18
WOAILYMD| | 2008-12-5 12:39 | 只看该作者

昨天也碰到消抖

大致浏览了各位大侠对于消除抖动的意见,以及多次对比实验,有以下体会:

1、采用N次判断方法好用,N越大越好,象2,3次那些太少了,我的用了256次判断(即一个字节变量的最大值,2次判断的间隔设的很短),非常稳定,几乎没有错判;

2、不同的按键真的抖动特性不一样,需要相应修改下程序的;象1中我没有错判的程序,换了另外一种按键,错判很多的;


使用特权

评论回复
19
最最| | 2008-12-5 15:50 | 只看该作者

记得匠人写过许多篇有关按键方面的贴,非常赞

使用特权

评论回复
20
royroyyy| | 2013-1-8 16:50 | 只看该作者
从这里可以看出,你很喜欢做设计,在能力范围内,自己想办法解决问题。
关于这个消抖,其实可以像操作系统里的那样,你腾出一个timer,做别的计时时加个消抖标识,每次进中断+1,查询,这样就不会浪费效率了。

使用特权

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

本版积分规则

95

主题

759

帖子

3

粉丝