请教傻孩子关于旋转编码器实现两倍频
以前在论坛看到傻孩子对编码器简洁精辟的结论: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) 首先,你要用示波器看波形,看看最窄的地方,脉宽有多少,是否满足90度相位差。
其次,你要看你的系统晶振是多少,我做马盘检测的系统,都是工作在至少16M频率
以上的,400线的我推荐用27M 谢谢傻孩子的回复,我用在收音机的飞梭上调整时间和频率,我的RC震荡只有不到1M左右(700~800khz左右),1条指令最少4个机器周期,我用的是24线的,会不会是这个原因呢,导致快速时,不能实时响应...最快的时候都还可以看到倒退的现象...
如果不满足90度相位差,这是编码器的原因吗,还是...
再次请教傻孩子大哥...谢谢 我觉得你需要检查90度相位差的问题,这通常是编码器的问题。 谢谢傻孩子,我用示波器检测了波形,相位是没问题的,可能是主震不够造成的,我把RC震荡的电阻改小,使主震变大,效果好多了...看来是主震的问题了.....原来的主震500khz估计都没有....现在改成1M左右,好多了... 旋转不均匀时不能保证90度相位差,所以设计假设不能基于90度相差的基础 谢谢各位 现在速度问题已经完全解决,不换晶振,用软件来欺骗使用者..
转一下后,停一下再转,每格速度+1或者-1;在规定的时间内连续迅速旋转编码器10圈以上时,每转一格+5或者-5,给人一种“加速”的感觉,这样做消耗了3个RAM :一个规定时间计数器,两个(顺时针/逆时针)计算旋转多少圈计数器,
页:
[1]