打印

求教 中断消抖的方法// 最新实验结果(见跟贴)

[复制链接]
楼主: szshawn2010
手机看帖
扫描二维码
随时随地手机跟帖
21
szshawn2010|  楼主 | 2010-4-7 20:37 | 只看该作者 回帖奖励 |倒序浏览
16# 原野之狼

我的MCU的工作电源也是类似这样,很不干净的!!

使用特权

评论回复
22
szshawn2010|  楼主 | 2010-4-7 20:38 | 只看该作者
我总结发现:杂波出现的时间,主要是在交流电的峰值左右。

请教有何技巧实现对过零点的捕捉!

使用特权

评论回复
23
highgear| | 2010-4-7 20:45 | 只看该作者
既然是判断交流电的零点, 那么可以肯定是你的整形电路的问题, 这本来是一个不该有的问题.

软件消除办法:
51的定时器有外部输入重置定时器的功能, 可以用来削抖.

一句忠告: 硬件的问题不要试图用软件来弥补, 去改电路吧.

使用特权

评论回复
24
xlnflw| | 2010-4-7 20:55 | 只看该作者
同意15楼观点
不知道LZ的前端电路是咋实现的 波形怎么这么难看呢
原野之狼 发表于 2010-4-7 19:44


同意16楼观点,改善硬件电路的设计。。。。这种东西不特别好用软件来解决

使用特权

评论回复
25
szshawn2010|  楼主 | 2010-4-7 21:04 | 只看该作者
搞明白了,明天去换一种接法。
另一接法,高电平存在的时间应该是us级别的。这样应该就不会有噪声干扰了

使用特权

评论回复
26
shangxuejian| | 2010-4-7 22:01 | 只看该作者
过滤,宽度小于多少不计

使用特权

评论回复
27
licanjian| | 2010-4-7 22:06 | 只看该作者
我个人认为,这种信号不用用中断去做,可以用软件去抖动.
发一个6502的给你看看.                r1 = key_idle
                        [key_code] = r1                                       
                        r1 = [P_IOC_Data]
                        r1 |= KeyControlPin
                        [P_IOC_Data] = r1
                        [P_IOC_Buffer] =r1
sc_ky01:
                        [keyscx] = r1
                        r2 = 0x0040
sc_ky02:
                        call        ScankeyDelay
                        r1 = [P_IOC_Data]
                        r1 ^= 0x00ff
                        r1 &= KeyPin
                        cmp        r1,[keyscx]
                        jne                sc_ky01
                        r2 = r2 - 0x0001
                        jnz                sc_ky02
                        r1 &= KeyPin
                        jz                sc_ky03
                        jmp                sc_ky04
sc_ky03:
                        //r1 = [P_IOC_Buffer]
                        //r1 &= KeyControlPin
                        //jnz         sc_ky03a
                        //goto        sc_exit       
sc_ky03a:
                        r1 = [P_IOC_Buffer]
                        r1 &= KeyControlScan2Pin
                        jnz        sc_ky03b
                        goto        sc_exit
                               
sc_ky03b:
                        r1 = [P_IOC_Buffer]
                        r1 &= KeyControlScan1Pin
                        jz   sc_ky03C
                        r1 = [P_IOC_Buffer]
                        r1 &= ~KeyControlPin
                        r1 |= KeyControlScan2Pin   // scan 2 IOC0
                        [P_IOC_Buffer] =r1
                        [P_IOC_Data] = r1
                        jmp        sc_ky01
                       
                       
sc_ky03C:
       
                        r1 = [P_IOC_Buffer]
                        r1 &= ~KeyControlPin
                        r1 |= KeyControlScan1Pin
                        [P_IOC_Buffer] =r1
                        [P_IOC_Data] = r1
                        jmp        sc_ky01
sc_ky04:
                        r1 = [P_IOC_Buffer]
                        r1 &= KeyControlScan1Pin         //SCAN KEY TO IOC5   
                        jnz   sc_next1
                        jmp   sc_scan1OK
                       
sc_next1:
                       
                        r1 = [P_IOC_Buffer]
                        r1 &=KeyControlScan2Pin
                        jz    sc_ky06              //SCAN KEY TO IOC6   
                       
sc_scan1OK:
                           nop
                            r1 = [keyscx]
                        cmp        r1,BuzzerSetPin
                        jnz                sc_ky04a
                        r2 = 0x000e
                      jmp                sc_ky09
sc_ky04a:
//-----------------------------------------
                        cmp        r1,LockPin
                        jnz                scan2OK
                        r2 = 0x000f
                        jmp                sc_ky09


                       
scan2OK:
                       
                        r1 = [keyscx]                //
                       
                       

                               
                       
//-----------------------------------------

                       
       
sc_ky06:                                               
                        r1 = [keyscx]
                        r1=r1 lsr 1
                        r2 = 0xffff
sc_ky07:
                        r2 = r2 + 0x0001                                                                               
                        test        r1,0x0001
                        jnz                sc_ky08
                        r1 = r1 lsr 1
                        jmp                 sc_ky07
sc_ky08:
                        r1 = r1 lsr 1
                        jnz         sc_exit
                        r1 = [P_IOC_Buffer]
                        r1 &= 0x0020
                        jnz        sc_ky08a
                        r2 = r2 + 0x0004
                        jmp         sc_ky09
sc_ky08a:                       
                        r1 = [P_IOC_Buffer]
                        r1 &= 0x0040
                        jnz        sc_ky09
                        r2 = r2 + 0x0008
                       
sc_ky09:
                        [key_code] = r2
                        r1 = [sys_mode]
                        r1 = r1 lsl 4
                        r1 = r1 + [key_code]
                        r1 = r1 + KeyTab
                        r1 = [r1]
                        [key_code] = r1       
                        r1 = 0x0000
                        [cnt_sec] = r1
sc_exit:
                        r1 = [P_IOC_Buffer]
                        r1 &= 0x009f
                        [P_IOC_Buffer]=r1
                        [P_IOC_Data] = r1       
                        retf
                        .endp
//================================================
//        ScankeyDelay
//================================================
ScankeyDelay:        .proc
                        r1 = 0x0010
                        [Scandelay]        = r1
ScankeyDelay01:
                        r1 = [Scandelay]

                        r1 = r1-0x0001
                        [Scandelay] = r1
                        cmp        r1,0x0000
                        jne        ScankeyDelay01
                        retf
                        .endp

使用特权

评论回复
28
mytempid| | 2010-4-8 08:57 | 只看该作者
感觉这是一个理想化的消抖方案。只能用于消除周期不变的干扰(效果还不一定好),还不如软件定时采样消抖

LZ还是说明输入信号的源是怎样的,是按键抖动,还是现场交流干扰,或者其它?
这样可能更有针对性

使用特权

评论回复
29
电子三极管| | 2010-4-8 09:25 | 只看该作者
:handshake

使用特权

评论回复
30
赤铸| | 2010-4-8 10:29 | 只看该作者
如果允许有延时,比较可靠的是RC滤波+施密特触发
豪华版本就是RC滤波+比较器
如果不允许延时,或者不那么严重,就用施密特触发

使用特权

评论回复
31
ai1988121| | 2010-4-8 12:53 | 只看该作者
软件可以用延时

使用特权

评论回复
32
华荣汇FAE1| | 2010-4-8 12:57 | 只看该作者
如果一定要用中断,建议使用硬件消噪;可以使用施密特反相器。

使用特权

评论回复
33
szshawn2010|  楼主 | 2010-4-8 17:08 | 只看该作者
以下菜鸟拙见:(认为我的想法是错误的朋友,务请指点!)
噪声的原因其根本上是系统的电源。因为就算使用了施密特,其波形也不会像理想值那样,很平稳。正如,我现在实验中的波形就不像理论上那么的纯洁,那么的无暇。

因此,不改善电源,都是徒劳的。但是事实上,本题目中,电源是不能改动的,就是一个容阻降压,半周整流虑波稳压的一个 5V电源。


因此,我想,不使用INT中断了。修改一下程序思路,从INT中断改为判断端口的高低电平。这样或许可以避免这样的一个问题。

使用特权

评论回复
34
szshawn2010|  楼主 | 2010-4-8 17:46 | 只看该作者
附上我的原理图:

567.gif (2.66 KB )

567.gif

使用特权

评论回复
35
szshawn2010|  楼主 | 2010-4-8 17:47 | 只看该作者
实际接法中。按上图的原理,把4007及稳压管,电解电容的方向接成相反方向。即,把图中的正极作为我的负极,图中的负极做为我的正极使用。


上图是上次请教may哥,然后may哥帮我设计的。

使用特权

评论回复
36
szshawn2010|  楼主 | 2010-4-8 20:51 | 只看该作者
试着做一个稍稍复杂点的玩意儿,却遇到各式各样的问题,汗!

我用的是义隆的芯片,没有用过51的

使用特权

评论回复
37
szshawn2010|  楼主 | 2010-4-8 20:55 | 只看该作者
36# highgear

兄弟,我以前没听过你的这种提法。但我知道应该有办法解决这个问题。而且我感觉你的提法可能是解决这个问题的有力途径。能否请教你把这个提法说的更仔细些吗?谢谢

使用特权

评论回复
38
szshawn2010|  楼主 | 2010-4-8 21:03 | 只看该作者
27# licanjian

也在考虑您的建议。只是软件写好了(以后硬件不试好,不写软件了),现在只希望尽可能的用中断。实在不行,只能改成读高低电平了。

使用特权

评论回复
39
szshawn2010|  楼主 | 2010-4-8 21:08 | 只看该作者
本帖最后由 szshawn2010 于 2010-4-8 21:14 编辑

通过判断 I/O的电平是否改变来决定是否中断,是否可行呢?

MCU带有 电平改变 中断功能。

即,事先预读一下I/O的状态,然后 当I/O的状态与之前的状态不同时,会进入到中断。这种方法有朋友用过吗?可行吗?毛刺会有干扰吗?(惭愧,以前从未使用过这种中断方式)

从波形上看,高电平期间,无论毛刺怎么多,MCU都判读为高电平。低电平中,毛刺高峰也不到1.0V,稍稍加点限压的电路,不知能否实现MCU将其判读为低电平。然后,利用MCU电平改变唤醒sleep的特性来 识别过零点,不知能否可行?

使用特权

评论回复
40
szshawn2010|  楼主 | 2010-4-9 14:23 | 只看该作者
************************************
此贴为最新实验结果
************************************

把上升边沿 触发中断,更改为 电平变化 触发中断 后,情况明显好转。但是存在一个问题,即在低电平期间,其毛刺,有的会触发 中断,在高电平期间不会有影响。

因此,在实验中,测量MCU计算的数据时,发现:大多数都是 10ms,即半个交流周期。偶尔会出现5个ms,即1/4个周期(从波形上看,应该是低电平期间,其交流峰值时刻,出现的毛刺。因此MCU偶尔出现的时间为5ms,正好是1/4周期)


请教高手,如何调整一下电路,可以在不影响波形的情况下,减轻毛刺的幅度。

使用特权

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

本版积分规则