第159篇 编码器原理——增量式和绝对式的区别与选型 📅 发布时间:2026/8/19 14:06:43 👁 浏览次数: 上篇讲了IMU数据预处理的完整流程——零偏补偿、温度补偿、低通滤波、时间对齐、坐标系变换。从这篇开始我们聊编码器。编码器是机器人运动控制的基础传感器不管是差速底盘的里程计还是机械臂的关节控制都离不开它。面试时候被问你用过什么编码器很多人会说增量式编码器。但面试官想听的是你理解增量式和绝对式的区别吗知道编码器的分辨率、精度、响应频率这些参数怎么选吗知道编码器信号怎么处理吗编码器的工作原理编码器的核心功能是测量旋转角度。根据输出方式的不同分为增量式和绝对式两大类。增量式编码器输出的是脉冲信号。编码器每转过一个固定的角度增量就输出一个脉冲。通过计数脉冲的数量可以知道转过了多少角度。通过检测脉冲的频率可以知道转速。增量式编码器通常有两个通道A相和B相两个通道的脉冲相位差90度正交编码。通过判断A相领先还是B相领先可以确定旋转方向。有些编码器还有第三个通道Z相每转一圈输出一个脉冲用作参考零点。正交编码的分辨率可以四倍细分——在每个脉冲的上升沿和下降沿都计数一个周期可以计4个数。所以如果一个编码器的标称分辨率是1000线每转1000个脉冲四倍细分后实际分辨率是4000 counts/rev。# 正交编码器读数示例通过GPIO中断 class QuadratureEncoder: def __init__(self, counts_per_rev4000): self.counts_per_rev counts_per_rev self.count 0 self.direction 1 def on_pulse(self, channel_a, channel_b): 脉冲中断回调 if channel_a ^ channel_b: # 异或为真正转 self.count 1 else: self.count - 1 def get_angle(self): 获取当前角度弧度 return (self.count / self.counts_per_rev) * 2 * np.pi def get_velocity(self, dt): 获取角速度rad/s需要记录上次的count delta_count self.count - self.last_count self.last_count self.count return (delta_count / self.counts_per_rev) * 2 * np.pi / dt绝对式编码器输出的是当前位置的绝对角度值。每个位置都有一个唯一的数字编码不需要计数。即使断电后重新上电也能立即知道当前位置。绝对式编码器有多种通信接口SSI同步串行接口、BiSS、CANopen、EtherCAT等。分辨率通常用位数表示比如17位编码器分辨率为2^17 131072个位置/转对应角度分辨率约0.0027度。编码器的机械安装和误差来源编码器不是装上就能用的机械安装质量直接影响测量精度。同轴度误差编码器的旋转轴和被测轴的轴线如果不重合就会产生偏心误差。偏心会导致编码器测量的角度和真实角度之间有周期性偏差——每转一圈误差呈现正弦变化。偏心越大误差越大。解决方法是用柔性联轴器比如梅花联轴器来补偿微小的同轴度偏差。轴向窜动和径向跳动如果被测轴在旋转时有轴向移动窜动或者径向摆动跳动编码器的测量也会受影响。高端编码器自带轴承可以容忍一定的轴向和径向偏差。低端编码器对被测轴的机械精度要求很高。齿轮间隙Backlash如果编码器不是直接安装在被测轴上而是通过齿轮传动齿轮之间的间隙会导致反向时的测量误差。比如机械臂关节反转时齿轮间隙会让编码器继续计数但关节实际还没动。解决方法是消除齿轮间隙用预紧齿轮或者在控制算法中补偿间隙。温度影响编码器的机械结构也会随温度变化。金属的热胀冷缩会导致间隙变化影响测量精度。对于高精度应用需要选择温度特性好的编码器或者在工作温度范围内做标定补偿。总的来说编码器的精度不仅取决于传感器本身的分辨率更取决于机械安装的质量。在实际项目中花时间在机械安装上对中、联轴器选型、间隙消除上往往比换一个更高分辨率的编码器收益更大。增量式 vs 绝对式怎么选选型时核心考虑四个维度精度需求、断电恢复、成本、通信接口。精度要求高关节角度误差0.01度且不允许断电后重新回零的场景比如机械臂、手术机器人必须用绝对式编码器。精度要求一般0.1度、成本敏感、断电后可以回零的场景比如差速底盘、AGV增量式编码器就够了。通信接口方面增量式编码器输出脉冲接口最简单MCU的定时器直接做正交解码。绝对式编码器常用SSI或BiSS-C接口传输速率高、抗干扰能力强。高端伺服电机用的EtherCAT接口编码器可以实现多编码器级联和纳秒级时间同步。成本上一个普通的增量式编码器模块几十块钱17位单圈绝对式编码器几百块多圈绝对式带电池或齿轮计数要上千。选型时不要盲目追求高分辨率——分辨率超出系统机械精度太多的话多出来的位数全是噪声。还有一点值得注意编码器的信号质量。增量式编码器的脉冲信号在长距离传输时容易受电磁干扰导致脉冲丢失或多计。解决方法是用差分信号RS422电平代替单端信号TTL电平差分信号的抗干扰能力强很多。高端编码器的线缆还会带屏蔽层进一步减少干扰。在工业环境中编码器线缆要远离动力线和变频器走线时保持至少20cm的间距。面试中怎么聊面试官问编码器原理按这个顺序回答先说增量式和绝对式的工作原理和区别再说选型考虑精度、断电恢复、成本、转速然后说编码器信号的处理方式正交解码、细分最后结合项目说你用过什么编码器、怎么用的。如果面试官追问增量式编码器的累计误差怎么解决你可以说增量式编码器的主要误差来源是脉冲丢失电磁干扰导致和机械传动误差齿轮间隙、皮带打滑。解决方法是定期用外部传感器比如激光雷达SLAM的位置估计做校正或者用绝对式编码器替代。如果面试官追问编码器的分辨率和精度有什么区别你可以说分辨率是编码器能区分的最小角度变化精度是测量值和真实值之间的偏差。分辨率高不代表精度高——一个17位的绝对式编码器分辨率是0.0027度但如果安装偏心或者轴承有间隙实际精度可能只有0.1度。如果面试官追问编码器在ROS2中怎么使用你可以说在ROS2中编码器数据通常通过nav_msgs/Odometry消息发布。差速底盘的两个轮子各接一个增量式编码器通过运动学模型差速运动学把左右轮的速度和位移转换成机器人的线速度和角速度再积分得到里程计。编码器驱动一般跑在MCU上比如STM32通过串口或CAN总线把数据传给上位机。上位机的ROS2节点接收数据发布odom topic供导航和SLAM使用。分享一个我在项目中排查编码器问题的经历。当时做一台差速机器人的里程计校准发现机器人走直线时odom报告的位移比实际偏小约5%。一开始以为是轮径参数设错了但用卷尺量了轮子直径和参数值一致。后来用示波器看编码器的输出波形发现高速运行时偶尔会丢脉冲——原因是编码器的信号线和电机的电源线走在一起电机的电磁干扰导致编码器信号出现毛刺MCU的计数器偶尔误判。解决办法是给编码器信号线加屏蔽层并且和电源线分开走线。改完之后丢脉冲的问题消失了里程计精度提升了5%。这个经历说明编码器的精度不只是编码器本身的问题信号传输的抗干扰设计同样重要。面试时候能讲出这种系统级的排查思路比单纯说编码器原理更有说服力。下一篇讲编码器应用——测速、测距和闭环控制中的使用。把编码器的原理搞清楚之后看看它在实际机器人系统中怎么用。如果这篇文章对你有帮助欢迎点赞、在看、转发三连。 你的支持是我持续更新的最大动力。「机器人软件开发面试·从入门到精通」连载系列上一篇第158篇 IMU数据预处理——滤波、补偿和对齐下一篇预告第160篇 编码器应用——测速、测距和闭环控制中的使用有任何问题欢迎评论区留言我会尽量回复。