其中100pF的电容为去抖动的作用,但是软件处理的时候最好还是加上软件去抖动,以防止误判。软件去抖动最常用的就是延时和连续采样多次,在此不再详述。
A和B输出波形为
通过输出波形图可知每个运动周期的时序为
顺时针运动 | 逆时针运动 |
A B 1 1 0 1 0 0 1 0 | A B 1 1 1 0 0 0 0 1 |
静止状态为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=0
0^0=0
1^0=1
0^1=1
两者相等为0,不等为1.
用户377235 2014-7-1 18:53
stm32新手根据博主写的stm32的代码可用 void TIM3_IRQHandler() { unsigned char pina,pinb; if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET) { pina = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1); pinb = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10); if((pina^pinb) == 0){ flag1 = (pina<<1)|pinb; } else if((pina^pinb) == 1){ flag2 = (pina<<1)|pinb; if((flag1^flag2) &0x02){ //这边好像是我引脚的原因,所以跟博主说的有点不一样 freNum--; if(freNum < 0) freNum = 0; } else if((flag1^flag2)&0x01){ freNum++; if(freNum > 27) freNum = 27; } } TIM_ClearITPendingBit(TIM3,TIM_IT_Update); flag1 = 0; flag2 = 0; } }