编码器基础:增量式与绝对式编码器的工作原理、电气特性与输出信号类型

做嵌入式这么多年,编码器是我打交道最多的传感器之一。不管是电机转速测量、位置闭环控制,还是工业机械臂的关节角度反馈,编码器都是那个“眼睛”。

但很多工程师一上来就画电路、调程序,结果发现信号跳变、丢步、甚至烧接口。为什么?说白了,没搞懂编码器本身的脾气。

这一章,我们先打好基础。把增量式和绝对式编码器的工作原理、电气特性、输出信号类型彻底理清楚。后面做隔离设计时,你才知道该隔离什么、怎么隔离。

1.1 增量式编码器:简单、便宜、但怕掉电

增量式编码器,我习惯叫它“脉冲计数器”。它不告诉你绝对位置,只告诉你“动了多少”。

工作原理:码盘上刻有均匀的透光/遮光条纹。光耦检测到明暗变化,输出脉冲。A、B两路信号相位差90°,用来判断方向。Z信号每转一圈输出一个脉冲,用于归零校准。

核心指标:分辨率 = 每转脉冲数(PPR)。比如1000 PPR,电机转一圈输出1000个脉冲。经过4倍频后,一圈可以分辨4000个位置。

我在项目中遇到过一个问题:客户反馈电机定位不准,每次断电重启后位置都偏。查了半天,发现是增量式编码器——它没有记忆功能。断电后位置信息丢失,必须重新找零位。这就是增量式的最大痛点。

我的建议:如果系统需要断电记忆位置,或者上电后必须立即知道当前位置(比如机器人关节),别用增量式。直接上绝对式编码器。

1.2 绝对式编码器:贵、但省心

绝对式编码器就不一样了。它每个位置都有唯一的二进制编码。上电瞬间,你就能读到当前角度或位置。不需要找零位,不怕掉电。

工作原理:码盘上有多个同心码道,每个码道对应一位二进制数据。通过光电读取,组合成位置编码。常见的有二进制码和格雷码。

格雷码是我特别推荐的。为什么?因为二进制码在相邻位置切换时,可能多位同时变化,容易产生毛刺。格雷码每次只变一位,抗干扰能力强很多。我在一个高精度转台项目里吃过二进制码的亏,后来全换成格雷码,问题就解决了。

对比项 增量式编码器 绝对式编码器
位置记忆 无,掉电丢失 有,上电即知
输出信号 A/B/Z脉冲 并行二进制/格雷码 或 串行协议
分辨率 取决于PPR和倍频 取决于码道位数(如12位=4096位置)
成本 低 高
适用场景 速度测量、相对定位 绝对位置、断电记忆

1.3 电气特性与输出信号类型

这部分是硬件设计的重点。编码器的输出信号类型直接决定了你的接口电路怎么搭。我见过太多人把推挽输出接到集电极开路的电路上,结果烧了光耦。

四种常见输出类型:

  • TTL输出:5V供电,输出高电平≥2.4V,低电平≤0.5V。适合短距离、低噪声环境。我一般只在实验板上用。
  • HTL输出:10-30V供电,输出高电平接近供电电压。抗干扰能力强,适合工业现场长距离传输。我个人习惯在工厂项目里优先选HTL。
  • 推挽输出:同时有拉电流和灌电流能力。信号上升沿陡峭,适合高速传输。但要注意,推挽输出不能直接并联。
  • 集电极开路输出:输出端是NPN晶体管的集电极,需要外部上拉电阻。优点是不同电压系统可以共用,但上升沿较慢,不适合高频信号。

避坑指南:我曾经在一个项目中,编码器输出是集电极开路,但没加上拉电阻。结果STM32的TIM捕获到的脉冲全是毛刺,计数乱跳。后来加上4.7kΩ上拉到5V,信号才恢复正常。记住:集电极开路必须配上拉!

1.4 知识结构总览

下面这张图,把编码器的分类、输出类型、电气特性串起来了。你对照着看,后面做隔离设计时思路会更清晰。

编码器知识结构总览 编码器 增量式编码器 绝对式编码器 A/B/Z 脉冲 掉电丢失位置 格雷码/二进制 上电即知位置 输出信号类型 TTL 输出 HTL 输出 推挽输出 集电极开路 说明:输出类型决定接口电路拓扑。HTL适合长距离工业现场,集电极开路需外加上拉电阻。 隔离设计时,需根据输出类型选择光耦/隔离器的输入侧电路参数。

1.5 选型建议与实战要点

最后,我总结几条实战经验,帮你少走弯路:

  • 距离判断:编码器到控制器距离超过3米,优先选HTL输出或差分输出(RS422)。TTL在长距离下衰减严重,容易误触发。
  • 速度匹配:高速电机(几千转/分钟)配合高PPR编码器时,输出频率可能达到几百kHz。集电极开路在这种场景下上升沿太慢,必须用推挽或差分。
  • 电平兼容:STM32的GPIO耐压一般是3.3V或5V。如果编码器是HTL(24V),必须做电平转换或隔离。直接接会烧引脚,我烧过一块F407,心疼了好久。
  • 上拉电阻计算:集电极开路输出,上拉电阻的选择有讲究。电阻太小,灌电流太大;电阻太大,上升沿太慢。我一般先算一下:R = (Vcc - Vol) / Iol_max,然后取标称值。比如5V供电,Iol_max=20mA,R≥(5-0.5)/0.02=225Ω,实际取4.7kΩ比较稳妥。

一个小技巧:如果你不确定编码器的输出类型,用万用表量一下输出引脚对GND的电压。推挽输出在静态时要么高要么低,集电极开路在静态时是浮空的(需要上拉)。这个办法我在现场排查时用过很多次,很管用。