STM32单片机使用带方向编码器时碰到的问题
仅记录在使用过程中碰到的问题
关于STM32定时器的编码器功能网上大部分资料讲的都是使用正交编码器的配置方式,今天在配置带方向的编码器时碰到了一些奇怪的问题,在这里记录一下,以及想到的解决办法。
编码器使用的是逐飞科技的mini编码器,带方向的,因为手边只有这个,想测试一下。
问题一: 照着网上的教程在CubeMX里配置了编码器,因为编码器是一路脉冲信号和一路方向信号,所以配置成T1模式,脉冲信号接定时器的CH1通道引脚,方向信号接定时器的CH2通道引脚,但是使用起来发现CNT寄存器读到的数据只在0/1之间跳动,不论怎么转动编码器都不会有明显的数据变化。
解决记录: 研究了一下定时器的相关说明,发现TIM定时器在配置成编码器模式后,引脚输入的上升沿和下降沿都会有计数操作,不论方向信号的引脚高还是低,输入信号的上升沿和下降沿的计数方式刚好是反的(+1-1+1-1… …),所以CNT寄存器的值只会在0-1跳动。
所以在这需要配置一下预分频系数(PSC),在这里我改成了1,这样每次来一对上升下降沿只会触发一次+1或者-1,这样CNT的数据就正常了。
问题二: 计数的问题解决了,但是在后续测试的过程中发现,在都是顺时针转动编码器的情况下,CNT内的计数值有时候是正值,有时候是负值,每次复位单片机后查看这个值都毫无规律。
解决记录: 在网上翻资料的时候看到了这么一段话:
重点是画红线这句,本来以为配置Rising Edge是上升沿触发计数,下降沿不计数,没想到这个不是这么用的,下降沿依旧计数,这样我突然想到,会不会因为每次启动编码器计数的时候,因为编码器的脉冲引脚第一次进定时器是上升沿还是下降沿是不确定的,又因为分频系数设置成了1,所以如果第一次是上升沿,那么以后每次只有下降沿CNT才会有动作,如果第一次是下降沿,那么刚好相反,这样在结合上方的图片(仅在T1计数的模式),虽然方向引脚能正确输出,但每次初始化后到底是一直上升沿计数还是下降沿计数是不确定的,导致了这个现象。
大概猜到了原因,解决办法就可以找了,我这个编码器是接在电机上的,所以每次初始化的时候,判断一下编码器脉冲引脚的高低电平状态,如果不是低电平,就输出一点PWM让轮子动一下下,在编码器脉冲引脚变成低电平的一瞬间启动定时器,这样保证定时器启动之后第一个跳变沿是上升沿,之后再使用编码器方向就可以确定了。部分代码截图如下:
这么处理了以后再测试没有发现得到的数值方向胡乱变化的情况了,不过总觉得既然ST的定时器支持带方向的编码器模式,应该有硬件可以配置出来的方法,可能我没有找到。
如果大家有更好的解决方法可以留言告诉我。