|
以前在论坛看到傻孩子对编码器简洁精辟的结论:
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
}
}
电路图:
编码器 (原文件名:编码器.gif) |
|