还是建议认真看下老Hot的**

[复制链接]
yewuyi 发表于 2009-5-19 17:33 | 显示全部楼层

消抖也是一种消除干扰的方法

用MP的话,其实就是一个概率论的东西,如果你的按键做是简单的套用延迟20MS再检测一次的方法,不管是丑陋的DELAY还是美丽的TIMER中断甚至是神奇的状态机,都不会让你的系统多强壮。

根据一般机械弹片的物理特性,一般是在100~200MS内抖动,所以为了可靠的解决解决这个问题,就应该尽量利用这个时间,例如,每4个MS检测一次键盘,如果有按键按下,记录当前键值,在第二个4MS进行消抖处理,如果有抖动则放弃,如果键值一致就继续第三个4MS读键,如此连续25个4MS周期后进行键值输出,那么我可以告诉你,只要你的PCB不是太垃圾,你的按键输出将是十分的稳定,即使施加了4KV的EFT信号,也不会出现什么问题。
常来21ic 发表于 2009-5-19 18:19 | 显示全部楼层

呵呵 比较认同楼上的思路

一个不起眼的键盘扫描居然也引来这么多争论......
最近坛子里火*比较浓,我还是不发表意见为好
 楼主| czha1 发表于 2009-5-19 19:56 | 显示全部楼层

认同61楼

比较认同61楼 yewuyi  虽然我不懂啥状态机
61楼已经把情况讲的非常清楚了。
不要把简单的问题复杂化,复杂的问题简单化。
该怎么的就怎么的,总之一个DELAY解决得不全面。
highgear 发表于 2009-5-19 20:40 | 显示全部楼层

顶yewuyi,说得很好

huangqi412 发表于 2009-5-19 21:01 | 显示全部楼层

热闹

McuPlayer 发表于 2009-5-19 22:32 | 显示全部楼层

纯技术层面的PK也会很精彩,只是不要为了面子而PK

电工也要学会享受生活之美
shanweichao 发表于 2010-6-19 23:00 | 显示全部楼层
看到了大家的肺腑之言呀,,,书上说的的确都是骗学生的,杭州新华书店(购书中心)的关于单片机的书我差不多都翻阅了一遍且不仅是一次,想起那句话 。。。**一大抄。。。我都是看着骂着,真的,有本杭州XX公司出的简直就是骗钱的2个版本的书,就书皮换了,,请广大像我一样的菜鸟们擦亮眼睛。。还有,电子类那里,我翻了5本竟然3本有错的有本很可笑把光敏电阻写成了光头电阻,有本把电感单位写成了UF。。。。我很无语,于是我在心里骂了几句就走了。。。。
xd54622 发表于 2011-7-26 11:20 | 显示全部楼层
嘿嘿,翻一下看看
gaoyiyiyi 发表于 2011-7-26 14:06 | 显示全部楼层
每次遇到消抖,都是争吵一堆。可以将消抖贴看成二姨的月经了。。。。哈哈
大家还是争技术吧,不要互相攻击,天热,伤肝。
Chaos_zc 发表于 2011-7-26 18:31 | 显示全部楼层
每次遇到消抖,都是争吵一堆。可以将消抖贴看成二姨的月经了。。。。哈哈
大家还是争技术吧,不要互相攻击,天热,伤肝。
gaoyiyiyi 发表于 2011-7-26 14:06

顶六十九楼。技术上要多探讨,相互尊重不能忘。贬低、攻击别人并不能显出自己博学,往往暴露出自己的浅薄。
雪落有声 发表于 2013-12-31 14:34 | 显示全部楼层
我把这贴从头仔细看到尾,也是深有70楼的感触。开始看着技术上的争论很兴奋,但越往后看越没意思。美在技术的PK而不在相互攻讦。
零度888 发表于 2014-4-11 20:12 | 显示全部楼层
eeproom 发表于 2009-5-16 14:49
       延时20mS以上原地等待是一种变相的自杀行为,除非你的程序任务 ...

这个是我要的答案,尼玛  今天就因为这个被批了     菜鸟一枚飘过
WM~~~ 发表于 2014-4-21 16:10 | 显示全部楼层
你又来这里吹牛b了,害我找了几个论坛,翻了几百页帖子,终于找到你了。 工头让我告诉你,明天去工地早些,要搬3车水泥两车砖头,如果搬不完,连昨天的工钱也不给你了。 还有隔壁寡妇村的凤姐叫我问你,你还娶不娶她,不娶她就要嫁给工地的那个歪嘴了。
周炎33 发表于 2014-7-18 18:50 | 显示全部楼层
我也用了延时来去抖,可是效果不好,按键按下去有时还是会多跳一下,请问怎么准确的去抖啊,保证按键按一下就跳一下
NWPU_CHEN 发表于 2014-7-21 15:25 | 显示全部楼层
周炎33 发表于 2014-7-18 18:50
我也用了延时来去抖,可是效果不好,按键按下去有时还是会多跳一下,请问怎么准确的去抖啊,保证按键按一下 ...

新手就用这个延迟,看来你的延迟时间不够才会导致多次执行,当然中断添加标志也可以,或者多次检测,对结果进行处理等都可以,新手就用delay吧,加长点延时时间
按键进行这样处理保证一次
void KeyRead( void )
{
    unsigned char ReadData = P1^0xff;           // 1
    Trg = ReadData & (ReadData ^ Cont);         // 2
    Cont = ReadData;                                             // 3
}

1:读P1的端口数据,取反,然后送到ReadData 临时变量里面保存起来。
2:算法1,用来计算触发变量的。一个位与操作,一个异或操作,我想学过C语言都应该懂吧?Trg为全局变量,其它程序可以直接引用。
3:算法2,用来计算连续变量。
kamen588 发表于 2014-7-21 19:54 | 显示全部楼层
yewuyi 发表于 2009-5-19 17:33
用MP的话,其实就是一个概率论的东西,如果你的按键做是简单的套用延迟20MS再检测一次的方法,不管是丑陋的 ...

同意 我就是这样处理的
peter_wjp 发表于 2014-7-22 09:38 | 显示全部楼层
我是一个菜鸟,目前写的程序都很简单,对于键盘我很惭愧我还在使用延时和timer,我的目的很简单,就是防止手按键盘时候会出现抖动,然后导致了很多次的输入程序的执行。 当然,如果能在检测到按键输入后进行一些处理(比如按键短时间内多次触发仅仅接受第一次),那么我就完全可以取消所谓的delay和timer。 所以,我感觉就我自己的实际应用而言,无论怎么处理,只要保证用户按键按一下,有一次的输入执行就行了。(当然,如果碰到那种一直按着不放的用户,我也没办法,不可能花大把的程序时间放在那里去不停检测,完了再去执行)

当然对于编码器的干扰消除,我之前仅仅接触过一点点,用的简单的增量式编码器,用的51单片机中断完成的,因为当时频率很低(5K以下),精度也要求不高,我根本没有使用消除干扰处理。当然,仅仅是个人玩玩而已。就实际工控而言,消除干扰是肯定要做的。楼上很多高手给出了很多解决方案,以我目前所能够理解的程度,我感觉都不错。做出东西简单适用最好。
周炎33 发表于 2014-7-22 10:32 | 显示全部楼层
NWPU_CHEN 发表于 2014-7-21 15:25
新手就用这个延迟,看来你的延迟时间不够才会导致多次执行,当然中断添加标志也可以,或者多次检测,对结 ...

谢谢您的指导,等我回去试试
周炎33 发表于 2014-7-22 10:32 | 显示全部楼层
NWPU_CHEN 发表于 2014-7-21 15:25
新手就用这个延迟,看来你的延迟时间不够才会导致多次执行,当然中断添加标志也可以,或者多次检测,对结 ...

谢谢您的指导,等我回去试试
caowent 发表于 2015-5-11 15:53 | 显示全部楼层
我认为按键检测是一个频率采样的过程。软件消抖可以这样理解,人按按键最高频率假设是10HZ,抖动信号的频率假设是100HZ。我们目的是采到人的按键信号,同时剔除抖动的影响。根据采样定理,“当采样频率fs.max大于信号中最高频率fmax的2倍时(fs.max>2fmax),采样之后的数字信号完整地保留了原始信号中的信息”。我们的采样频率只要比20HZ大,比200HZ小,就能完整得呈现按键信号,同时屏蔽抖动干扰。(比如设为100HZ,效果更好,可以自行分析)所以软件消抖是体现在延时上,很多采用延时10ms的 。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部