原创 旋转编码器的编程思路

2009-2-27 22:35 4746 6 7 分类: MCU/ 嵌入式

旋转编码器的编程思路





旋转编码器的应用电路为:


点击看大图


其中100pF的电容为去抖动的作用,但是软件处理的时候最好还是加上软件去抖动,以防止误判。软件去抖动最常用的就是延时和连续采样多次,在此不再详述。


AB输出波形


03d4ac8a-2205-4ed1-ad14-725854364c3c.JPG


通过输出波形图可知每个运动周期的时序为




顺时针运动


逆时针运动


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




单片机可利用定时器中断来检测AB的状态,中断时间在5~20ms之间均可。




当检测到A^B = 0时,表示为静止状态,记下AB的状态。


当检测到A^B = 1时,表示有转动,读取AB的状态,如果AB是从1101或者是从0010则为正转,反之如果AB是从1110或者是从0001则为反转。




此方法比较简单可靠,可以检测转动一格又可以检测快速转动。






1: 异或运算


异或的运算方法是一个二进制运算,C语言中用A^B表示A异或B


1^1=0
0^0=0
1^0=1
0^1=1
两者相等为0,不等为1.

PARTNER CONTENT

文章评论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; } }

相关推荐阅读
用户1435700 2009-02-27 22:41
sprintf的使用
sprintf,你知道多少? 选自《CSDN 社区电子杂志——C/C++杂志》本文作者:steedhorse(晨星)printf 可能是许多程序员在开始学习C 语言时接触到的第二个函数(我猜第一个是m...
用户1435700 2008-12-12 11:12
电容的用途
电容的用途今天在网上看到一种加速电容的概念,于是查了相关资料,顺便整理一下电容的用途。电容器在电子电路中几乎是不可缺少的储能元件,它具有隔断直流、连通交流、阻止低频的特性。广泛应用在耦合、隔直、旁路;...
用户1435700 2008-12-03 14:14
SPI协议的简单实例说明
SPI协议的简单实例说明 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />     ...
用户1435700 2008-12-03 14:08
SPI协议简介
SPI协议简介 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应...
用户1435700 2008-11-26 21:44
工作
 从事单片机的工作也有一年了,从刚开始找单片机方面的工作时,和面试官说我可以帮你们输入程序的什么都不懂的应届毕业生,到现在基本完成软硬件的设计,但自己依然还是个很菜的菜鸟,渴望成为高手啊!学习啊努力!...
EE直播间
更多
我要评论
1
6
关闭 站长推荐上一条 /3 下一条