打印

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

[复制链接]
楼主: czha1
手机看帖
扫描二维码
随时随地手机跟帖
21
刘前辈| | 2009-5-16 21:13 | 只看该作者 回帖奖励 |倒序浏览

为20楼加重语气:根本绝无可能!

这正是LZ认为的消抖概念偏差吧:“抖动”只可能发生在开关改变状态时,平时根本不可能发生,——20楼揭穿的能量问题。干扰信号能量大还是电平信号能量大?

“抖动”是真实信号电平的抖动,而不是干扰虚假信号抖动。抖动过程间的任何一个1/0信号都可以看作是“真实事件”并触发相应程序动作(如何消抖根据具体开关参数条件,也不一定只是第一个信号电平才认为有效起始。)。而干扰信号则不然,那是虚假信号,——绝对要除掉并且不能触发任何程序动作的。

完全两回事,。

使用特权

评论回复
22
lyjian| | 2009-5-17 11:49 | 只看该作者

浪费青春的讨论

没什么意义

使用特权

评论回复
23
McuPlayer| | 2009-5-17 12:22 | 只看该作者

消抖程序有用也是有理论根据的

假设干扰出现的几率是1%,如果你间隔读取3次,如果不全相同,则取2个的那一个值。
这样2个同时出错才能让程序误判,而几率已经成万分之一了。
如果实在想不通,拿大学的概率统计课本来找找公式也未尝不可。

举个例子,串口通讯的波特率,有没有人想过为什么实际时钟源要是好几倍的关系,一般是4倍或者8倍数。实际上是每个bit做了4次或者8次采样,并且采样点是波特率周期上均匀分布的,然后很容易做到丢弃干扰出错的采样,至于出错的概率降低了多少,自己去思考一下并不难理解。


另外,学校讲到消抖的例子,往往都是Delay(20ms)之类的做法,确实误导了很多学生。新来的同事,我给他的跑马灯作业,他就是用Delay实现的。

就像上面有位朋友提到的那样,CPU不像公务员那样整天没事干,它有N多的活要干,显示要定时更新,Key要扫描,无源Buzzer的驱动更是个CPU繁琐的工作。

最裸奔的办法是,用中断处理。
高档一点,中断里设置Flag,主程序里处理
再高档一点,用PostMessage的方式去处理,那已经有EmbededOS的雏形了

使用特权

评论回复
24
刘前辈| | 2009-5-17 15:05 | 只看该作者

不同见解。

23楼:“举个例子,串口通讯的波特率,有没有人想过为什么实际时钟源要是好几倍的关系,一般是4倍或者8倍数。实际上是每个bit做了4次或者8次采样,并且采样点是波特率周期上均匀分布的,然后很容易做到丢弃干扰出错的采样,至于出错的概率降低了多少,自己去思考一下并不难理解。”

*******************************************************************

通讯中,接收方收到的错误数据确实是传输过程中“空间电磁干扰”的作用。按照20楼的观点:这时“干扰信号的能量”要大于传输中的真实信号的能量,例如一道闪电,雷击,几千伏的能量,连树木都能劈倒,7V、12V的传输数据早被淹没了。

所以,条件不一样。当然不能作为论据。

开关的抖动,不是“外来的”非系统“干扰信号”,是真实存在的电平信号,能量远大于空间电磁非系统信号。处理方法当然不一样。没有多选一的情况,“零耗时”只要检测到第一个闭合事件,立刻就可以触发响应驱动程序A。根本无需等待第二个闭合信号。注意下面:

如果被触发的驱动程序A的运行时间开销大于键盘/开关的抖动时间,那“消抖”就是多此一举!因为A 一次运行完成时,抖动早就结束了。何来干扰?消抖程序处理谁?

再举例问:在同步数据通信方式中,采样是否还像异步那样多选一?干扰同样存在,处理方法又不一样了。

所以,肯定不能用这一环境下的处理方法去说明另一环境下的处理方法是错误的。具体应用场合有具体应用方法。

愿意继续听讲。

使用特权

评论回复
25
ayb_ice| | 2009-5-17 15:37 | 只看该作者

LZ根本没有明白消抖

使用特权

评论回复
26
czha1|  楼主 | 2009-5-17 15:56 | 只看该作者

25楼具体讲讲嘛

我看他们有几位说的有点道理,还没有认真思考过。
一件事物,不是那么容易处理的,有时一个比较
具体的设计,有一点致命的错误就会影响整个系统的运行。
理解了就可以去应用,改进。
 刘前辈说的一方面有一定道理。
有这么多人深入讨论我没有想到。
谢谢你们。

使用特权

评论回复
27
ayb_ice| | 2009-5-17 16:02 | 只看该作者

消抖其实就是主要是防止一次按键

动作多次.完全可以在第一次检测到按键时做相关按键功能处理,但两次按键如果间隔太短,只能算一次,一般还要等待松才能再次处理...

使用特权

评论回复
28
刘前辈| | 2009-5-17 18:27 | 只看该作者

还是ayb_ice说得透。

刚才咱只说明“零耗时”的依据。这大概是HOTPOWER在他的键盘处理程序中最先发明的新名词?反正这种处理方法教材上没有。他就是创新。

“如果被触发的驱动程序A的运行时间开销大于键盘/开关的抖动时间,那“消抖”就是多此一举!因为A 一次运行完成时,抖动早就结束了。”消抖程序处理谁?

问题还有另一个方面:如果被触发的驱动程序A的运行时间开销“小于”键盘/开关的抖动时间,那“消抖”就是绝对必要了!这就是27楼ayb_ice说的:消抖就是防止一次按键,多次动作。

举例:假定抖动时间20ms,而被键盘动作事件触发的驱动程序A的运行时间开销是1ms;那么零耗时完成一次驱动程序A后,抖动还没有结束,如果再次检测键盘/开关,将引起第二次、第N次程序A运行。结果造成乱控。

所以教材上绝对不会教学生“零耗时”技巧程序。只能教人消抖概念和程序。——在开关动作抖动“结束之后”,开关稳定状态下决定A动作;(不是干扰信号前或后。)这样做显然A动作至少比零耗时技巧程序响应晚了一个消抖动延迟时间。要是核反应堆或者化工厂,控制器反应可就慢了。

使用特权

评论回复
29
dengm| | 2009-5-17 18:49 | 只看该作者

编码器 不用消抖的, 因为它是用格雷码的

使用特权

评论回复
30
yewuyi| | 2009-5-17 21:22 | 只看该作者

呵呵,灯苗的编码器是成品,

我上次用了一个是自己做的简易编码器,就是两个对管,那个还是需要处理的,我实际测试了一下,再施加EFT的时候,信号上被叠加的干扰脉冲还是比较多的,不处理不行。

不过,我上次那个转速比较慢,大约在4K个脉冲/S的速度上

使用特权

评论回复
31
McuPlayer| | 2009-5-17 21:44 | 只看该作者

看来很多人不懂消抖啊

尤其是拿特例来解释消抖无用的
消抖并不是真的去消除抖动,而是降低因为干扰导致的出错率

误导新入行的电工啊。

使用特权

评论回复
32
McuPlayer| | 2009-5-17 22:02 | 只看该作者

Hotpower的“零耗时键盘”

并非是不要消抖,而是用不Delay的方式进行消抖。
看来很多人比较浮躁啊,看**不仔细,不求甚解。

这也并非Hot原创,但是Hot把此经验整理出来是对新入门的电工一个非常好的指导。

使用特权

评论回复
33
highgear| | 2009-5-17 22:20 | 只看该作者

无知者无畏,28楼的刘公公果然精彩。

“假定抖动时间20ms,而被键盘动作事件触发的驱动程序A的运行时间开销是1ms;那么零耗时完成一次驱动程序A后,抖动还没有结束,如果再次检测键盘/开关,将引起第二次、第N次程序A运行。结果造成乱控“,
给你说了无数遍了,不懂就不要装懂,拿出你解决不了“乱控“这么一个简单问题做例子,实在滑稽可笑。我贴出的程序够简单了吧,你居然还是看不懂。

消抖的目的在于消除误判,以教科书上的程序(不断循环检测),如不消抖,很大的可能性会误判。
而使用定时中断的检测,第二次检测时,已经避开了抖动,其实并不一定需要消抖(程序作得差是另一回事,特别是处理非矩阵键盘),但出于尊重历史,往往还是会加入消抖处理,反正对于中高手没有多很多代码,至少心理感觉好很多,不是吗?

一句话:
也许我不知道不加消抖有什么坏处,但我知道加上肯定没有坏处。

使用特权

评论回复
34
czha1|  楼主 | 2009-5-18 08:06 | 只看该作者

30楼到33楼都是有具体经验的

30楼到33楼都是有具体经验的。
很都地方是不得不用消抖的,尤其是工控方面,不能说多少万分之一。
万万分之一的缺陷心里也不踏实。
很多真正的内行能够把他讲出来,讲全面,已经是很好的姿态了。
教科书上是没有的,夜郎自大自欺欺人很可悲。


使用特权

评论回复
35
刘前辈| | 2009-5-18 10:24 | 只看该作者

支持33楼中断检测键盘的技术方法。

“而使用定时中断的检测,第二次检测时,已经避开了抖动,其实并不一定需要消抖”

这句话最早源自农民讲习所长的博客**中关于键盘扫描技术部分。

其实这是OS中采用的技术:把键盘扫描当做一个独立任务A,每隔20ms或者50ms或者200ms扫描一次,如果A任务2次运行都检测到键盘按下有效,即认为此时键盘状态为“消除干扰”之后的有效状态。显然这里没有专门处理消抖的延时程序,例如下面开关检测程序:

FUNCTION: SWITCH_ON_OFF_Update()
  
  This is the main on-off switch function.  

  It should be scheduled every 50 - 500 ms.

-*------------------------------------------------------------------*/
void SWITCH_ON_OFF_Update(void)
   {
   // If the switch is blocked, decrement the count and return
   // without checking the switch pin status.
   // This is done to give the user time to remove their finger 
   // from the switch - otherwise if they keep their finger on
   // the switch for more than 0.4s the light will switch off again.

   if (Sw_blocked_G)
      {
      Sw_blocked_G--;
      return;
      }
.
.
.
.
.
在OS中,消抖的概念已经弱化,一旦检测到开关闭合(第一次/二次确定),开关状态就被阻塞了,(是否零耗时动作由用户决定。)此后开关的任何状态,系统都不关心,——“才不管你抖不抖。”

当然33楼谈的是所长5年前写的OS中采用的键盘扫描技术,——任务、进程什么的。跟前面网友说的是2个分支的技术。一件事物的两个面,站在任何一面的人都说反面的人看错了。xi,xi.

使用特权

评论回复
36
刘前辈| | 2009-5-18 11:12 | 只看该作者

书上2方面都写了。

看书上是这么写的:
    第一方面:消抖在“待抖动消失后”再次检测按键;
    键抖动会引起一次按键被误读多次。常见的软件去抖动方法是检测出按键闭合后执行一个延时程序....待“前沿抖动消失后”,“再”检测键的状态;如果仍保持闭合......
当检测到按键释放后,也要执行一个延时程序,避开按键的“后延抖动”。

   如果读键子程序被安排在主程序或...中,则延时子程序可直接插入读键过程中;

   第二方面:中断不“显性”等待抖动消失,(也就是所长介绍的技术:——事物的另一方面;)
    如果读键子程序被安排在定时器中断服务子程序中,则可利用2次或者多次定时器中断的时间间隔来完成去抖动处理,即N次以上定时中断里都采集到有键按下,才确认此键确实有效。


确实是浪费青春时间的讨论。书上从来没有说过键盘抖动要消除什么“干扰”。

使用特权

评论回复
37
xzq1019| | 2009-5-18 11:27 | 只看该作者

编码器根本就不用延时消拉动

用一个ST288芯片鉴相后
用单片机定时器直接接收就行了
如果系统中高频干扰可以在线上加磁环或磁珠试试

使用特权

评论回复
38
yewuyi| | 2009-5-18 11:56 | 只看该作者

LS的话让我很吃惊。。。

虽然成品编码器的信号是经过处理的,本身是比较好的波形,和机械按键完全不同,但不做消抖处理也是很无理的,就是简单的EFT测试都会让你死的很难看。


除非你的产品对多计和少计几个脉冲根本无所谓,或者有其它的什么纠正手段,但。。。


零耗时只是HOTPOWER的一个说法罢了,其实很多人都是那么做的,用系统的调度时钟做自然的消抖延迟基本都是零耗时的拉。

使用特权

评论回复
39
dengm| | 2009-5-18 11:56 | 只看该作者

re: yewuyi 你的简易编码器, 就是2bits格雷码的

使用特权

评论回复
40
McuPlayer| | 2009-5-18 13:30 | 只看该作者

小叶大吃一斤,哈哈哈

如果你把这个帖子全看一遍,到处有令人惊讶的题材,大吃一吨都有可能。

如果老Hot知道你们拿他总结出来“零耗时消抖”用来说明抖动时不用消除的,想想他的眼睛得睁多大。

学校课本上讲到消抖,误导学生的是消抖的方法Delay而不是是否需要消抖。

需要再次明确的是:
消抖的意图根本不是等抖动走了再读一次,而是读取N次,根据综合评估的结果做出判断,因为抖动或说某种干扰时随机出现的,原理和实现我也都有说过。

至于有人用打雷做例子说明消抖没用,真无语了。
咋不用地球毁灭做例子啊,大家都OVER了,看你的消抖有没有OVER掉。

使用特权

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

本版积分规则