041、编码器接口与脉冲计数:STM32实战
上周调试一台伺服电机驱动的AGV小车,遇到了一个让人抓狂的问题:小车在低速运行时,编码器读数每隔几秒就会跳变几十个脉冲,导致速度环PID输出剧烈抖动,电机发出“嗡嗡”的异响。用示波器抓编码器A、B相波形,发现信号上升沿和下降沿都有毛刺,但用逻辑分析仪看STM32的TIM计数器值,却显示计数正常——问题出在哪儿?折腾了两天,最后发现是编码器接口的滤波参数没配好,TIM的输入捕获滤波器把有效边沿给滤掉了。这种坑,踩过一次就忘不了。
编码器接口的本质:不是“读脉冲”,是“解状态”
很多人以为编码器接口就是数脉冲个数,这想法太天真了。增量式编码器输出的是两路相位差90°的方波信号,A相和B相。STM32的定时器编码器模式,本质上是把这两路信号当成一个“格雷码状态机”来处理——每个边沿触发一次计数,方向由A、B相的电平组合决定。你不需要自己去判断正反转,硬件自动搞定。
看这张状态表(脑子里想象一下):A相上升沿时,如果B相是高电平,计数器加1;如果B相是低电平,计数器减1。四个边沿(A上升、A下降、B上升、B下降)都会触发计数,所以分辨率是编码器线数的4倍。比如一个1000线的编码器,用4倍频后,一圈就是4000个脉冲。
STM32的编码器模式配置:寄存器级操作
别用CubeMX自动生成代码,那玩意儿生成的初始化函数又臭又长,出了问题你都不知道哪儿配错了。直接操作寄存器,心里踏实。