wwwdege 发表于 2010-12-11 18:57:13

请教傻孩子关于旋转编码器实现两倍频

以前在论坛看到傻孩子对编码器简洁精辟的结论:
1)需要至少用到一个外中断和一个普通引脚。在每一个中断的上升沿或下降沿(注意这里是或的关系,意思是必须
从两个边沿中选择一个边沿来触发中断)读取普通引脚的电平,高电平,计数器增加,低电平计数器减小。这两个
引脚分别接编码器的A和B两根信号。

2)如果你想实现两倍频,则需一个外中断和一个普通引脚,在每一个中断变化边沿(同时包括上升沿和下降沿),比较
中断引脚的电平与普通引脚的电平,如果相同则计数器增加,如果不同则计数器减小。

3)如果你想实现4倍频,则需要两个外中断引脚,对于A信号的外中断来说,每一个变化的边沿都检查A,B两个信号电平
是否相同,相同则计数器增加,不同则计数器减小;对于B信号的外中断来说,每一个变化的边沿都检测A、B两信号电
平是否相同,相同则计数器减小,不同则计数器增加。

我用第二种方法只用一个中断(上升沿和下降沿)实现两倍频,慢速旋转的时候,加减都很正常,快速的的时候感觉有些问题,总觉得速度太慢了,猜测可能在同一个方向快速旋转时会
抖动,加的过程中会减,减得过程中会加,导致进位很慢,快速旋转时可以看到个位的数据在不停的快速变化,可是进位(加到九进位,或者减到0退位)感觉不是这个速度,有点慢,所以猜测有没有可能快速旋转时有抖动....
程序如下
请大家给给建议谢谢
__interrupt void interrupt_int1_isr(void)
{//上升沿和下降沿触发 test_tune1中断引脚/test_tune2普通引脚
        if ((P3PND & 2)!=0)
        {
                clr_bit(P3PND,1);
                P3INTL=0x00;                                
                if(test_tune1==test_tune2)//比较中断引脚的电平与普通引脚的电平如果相同则计数器增加
                                f_lag1.add_coder=1;//up
                else if(test_tune1!=test_tune2)//比较中断引脚的电平与普通引脚的电平如果不同则计数器减小。
                                f_lag1.sub_coder=1;//down                                               
        }
}

电路图:
http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_604030JRT3GI.gif
编码器 (原文件名:编码器.gif)

Gorgon_Meducer 发表于 2010-12-12 01:09:17

首先,你要用示波器看波形,看看最窄的地方,脉宽有多少,是否满足90度相位差。
其次,你要看你的系统晶振是多少,我做马盘检测的系统,都是工作在至少16M频率
以上的,400线的我推荐用27M

wwwdege 发表于 2010-12-12 09:56:53

谢谢傻孩子的回复,我用在收音机的飞梭上调整时间和频率,我的RC震荡只有不到1M左右(700~800khz左右),1条指令最少4个机器周期,我用的是24线的,会不会是这个原因呢,导致快速时,不能实时响应...最快的时候都还可以看到倒退的现象...
如果不满足90度相位差,这是编码器的原因吗,还是...
再次请教傻孩子大哥...谢谢

Gorgon_Meducer 发表于 2010-12-12 12:38:32

我觉得你需要检查90度相位差的问题,这通常是编码器的问题。

wwwdege 发表于 2010-12-12 16:11:10

谢谢傻孩子,我用示波器检测了波形,相位是没问题的,可能是主震不够造成的,我把RC震荡的电阻改小,使主震变大,效果好多了...看来是主震的问题了.....原来的主震500khz估计都没有....现在改成1M左右,好多了...

NJ8888 发表于 2010-12-12 16:48:20

旋转不均匀时不能保证90度相位差,所以设计假设不能基于90度相差的基础

wwwdege 发表于 2010-12-16 19:40:33

谢谢各位 现在速度问题已经完全解决,不换晶振,用软件来欺骗使用者..
转一下后,停一下再转,每格速度+1或者-1;在规定的时间内连续迅速旋转编码器10圈以上时,每转一格+5或者-5,给人一种“加速”的感觉,这样做消耗了3个RAM :一个规定时间计数器,两个(顺时针/逆时针)计算旋转多少圈计数器,
页: [1]
查看完整版本: 请教傻孩子关于旋转编码器实现两倍频