通过输出波形图可知每个运动周期的时序为顺时针运动逆时针运动ABAB1101001011100001静止状态为11或00,A异或B的结果为0(注1)单片机可利用定时器中断来检测A和B的状态,中断时间在5~20ms之间均可
当检测到A^B=0时,表示为静止状态,记下A和B的状态
当检测到A^B=1时,表示有转动,读取AB的状态,如果AB是从11到01或者是从00到10则为正转,反之如果AB是从11到10或者是从00到01则为反转
此方法比较简单可靠,可以检测转动一格又可以检测快速转动
注1:异或运算异或的运算方法是一个二进制运算,C语言中用A^B表示A异或B:1^1=00^0=01^0=10^1=1两者相等为0,不等为1
也许是屎上最简单的旋转编码器程序,占用一个外中断#defineROTATE_APIND
2#defineROTATE_BPIND
3ucharCW=0;ucharCCW=0;//ExternalInterrupt0serviceroutineinterrupt[EXT_INT0]voidext_int0_isr(void){if(ROTATE_A
=ROTATE_B){CW++;}elseCCW++;}voidmain(void){if((CW|CCW)
=0){DATA=DATA+CW-CCW;}CW=0;CCW=0;delay_ms(50);}//////////////////////////////////////////占用一个外中断,电平变化触发,CW是顺时针转过的脉冲,CCW是逆时针每50ms处理一下数值,如果想要出错,起码脉冲时间要比50ms/256短才行,手指是没可能达到这速度实际应用中感觉很爽//*************************************************************************