进入正题。
一,为什么要使用编码器
编码器的工作原理是如果两个信号相位差为90度,则这两个信号称为正交。由于两个信号相差90度,根据两个信号哪个先哪个后来判断方向、根据每个信号脉冲数量的多少及整个编码轮的周长就可以算出当前行走的距离、如果再加上定时器的话还可以计算出速度。
由于TI1,TI2一前一后有个90度的相位差,所以当有相位差时就表示轮子旋转了一个角度。实际上如果是轮子一直正常旋转当然没有问题,但是如果出现了毛刺就会给我们的计数造成误差,这时候需要我们在软件中编写算法进行改正,而编码器正是用来解决这一问题。
STM32中,编码器使用的是定时器接口,查阅STM32F103数据手册可知,定时器1,2,3,4,5和8有编码器的功能,而其他定时器没有。注意,在这几个定时器中也只有CH1和CH2可以设置为编码器模式~
选择编码器接口模式的方法是:
1)如果计数器只在TI2的边沿计数,则置TIMx_SMCR寄存器中的 SMS=001;
2)如果只在TI1边沿计数,则置SMS=010;
3)如果计数器同时在TI1和TI2边沿计数,则置SMS=011。
通过设置TIMx_CCER寄存器中的CC1P和CC2P位,可以选择TI1和TI2极性;如果需要,还可以 对输入滤波器进行编程。
两个输入TI1和TI2被用来作为增量编码器的接口。假定计数器已经启动(TIMx_CR1 寄存器中的CEN=’1’),计数器由每次在TI1FP1或TI2FP2上的有效跳变驱动。
配置范例:
CC1S=’01’ (TIMx_CCMR1寄存器, IC1FP1映射到TI1)
CC2S=’01’ (TIMx_CCMR2寄存器, IC2FP2映射到TI2)
CC1P=’0’ (TIMx_CCER寄存器, IC1FP1不反相, IC1FP1=TI1)
CC2P=’0’ (TIMx_CCER寄存器, IC2FP2不反相, IC2FP2=TI2)
SMS=’011’ (TIMx_SMCR寄存器,所有的输入均在上升沿和下降沿有效).
CEN=’1’ (TIMx_CR1寄存器,计数器使能)