1. 编码器基础:编码器分类、工作原理与ABZ信号

大家好,我是老张。做嵌入式这些年,跟编码器打交道的次数,说实话比跟老婆吵架还多(开个玩笑)。编码器这东西,说白了就是个角度传感器,能把机械转动变成电信号。你想想看,电机控制、机械臂定位、数控机床,哪个离得开它?

今天咱们就从头捋一捋编码器的基础知识。嗯,这部分内容虽然基础,但我见过太多工程师在这上面栽跟头了。

1.1 编码器分类:增量式 vs 绝对式

编码器分两大类:增量式绝对式。这个分类标准很简单——就看它能不能记住位置。

核心区别一句话:增量式只告诉你"动了多少",绝对式直接告诉你"在哪儿"。

增量式编码器

增量式编码器,我习惯叫它"脉冲计数器"。它每转一个角度,就输出一个脉冲。你要想知道绝对位置,就得自己数脉冲数。

特点:

  • 结构简单,价格便宜
  • 掉电后位置丢失,需要回零
  • 输出ABZ三路信号
  • 适合速度测量、相对位置控制

我在项目中遇到过一件事:有个同事用增量式编码器做机械臂位置控制,结果每次断电重启,机械臂都得先"找家"——就是回到原点。客户觉得这太傻了,后来换成了绝对式。

绝对式编码器

绝对式编码器就高级多了。它内部有码盘,每个位置对应唯一的二进制码。你一上电,它直接告诉你当前角度,不用回零。

特点:

  • 位置唯一,掉电不丢失
  • 输出并行数据、SSI、SPI等协议
  • 价格贵,结构复杂
  • 适合绝对位置控制、安全关键系统

我的建议:做普通电机控制,增量式够用。做机器人关节、数控机床这种需要绝对位置的,别省那点钱,直接上绝对式。

1.2 工作原理:光栅与磁栅

编码器怎么工作的?说白了就两种主流方案:光栅式磁栅式

光栅式编码器

光栅式编码器内部有个码盘,上面刻着密密麻麻的条纹。发光二极管一照,透过条纹的光被接收器检测到,就产生了脉冲。

增量式的码盘是均匀条纹,绝对式的码盘是格雷码条纹。

优点:精度高,分辨率可以做到很高
缺点:怕灰尘、怕油污、怕震动

我曾经在一个木工机械项目里用过光栅编码器,结果车间里全是木屑,没两天编码器就罢工了。后来换了磁栅式的,再也没出过问题。

磁栅式编码器

磁栅式编码器用的是磁阻效应或霍尔效应。码盘上充了磁极,磁头检测磁场变化,输出信号。

优点:抗污染、抗震动、体积小
缺点:精度略低于光栅式

注意:磁栅式编码器怕强磁场!别把它放在电机线圈旁边,否则你会看到一堆乱码。我吃过这个亏,血的教训。

1.3 ABZ信号详解

增量式编码器最常用的输出就是ABZ信号。这三个信号,每个都有它的脾气。

A相和B相:正交信号

A和B是两路相位差90°的方波信号。为什么要有两路?为了判断方向。

  • A超前B 90° → 正转
  • B超前A 90° → 反转

你想想看,如果只有一路信号,你只能知道转了多少,但不知道往哪转。有了AB两路,方向就清楚了。

倍频技术:

STM32的定时器可以检测A和B的上升沿和下降沿。这样每个脉冲周期可以产生4个计数脉冲。这就是所谓的"4倍频"。

举个例子:一个1000线的编码器,4倍频后分辨率变成4000线。也就是说,每转一圈,你能检测到4000个位置变化。

Z相:零位信号

Z相信号,也叫零位信号。编码器每转一圈,Z相输出一个脉冲。这个脉冲用来做什么?

  • 回零操作:电机启动后,先转到Z相位置,把当前位置设为原点
  • 消除累积误差:每圈用Z相校准一次,防止脉冲计数漂移

我记得有一次调试伺服电机,发现位置总是慢慢偏移。查了两天,最后发现是Z相没接,计数器一直在累积误差。接上Z相后,问题立刻解决。

1.4 电气特性与接口

编码器的电气特性,嗯,这块容易踩坑。我列个表,大家一目了然。

输出类型 电压范围 传输距离 抗干扰 典型应用
TTL 0~5V <1m 一般 板内连接
HTL 0~24V <10m 较好 工业现场
RS-422 差分±5V <100m 优秀 长距离传输
推挽式 0~Vcc <5m 通用场合

经验之谈:STM32的GPIO一般只能接受3.3V或5V的TTL电平。如果你用的是24V的HTL编码器,记得加电平转换芯片,比如SN74LVC4245。直接接上去,芯片会冒烟的——别问我怎么知道的。

1.5 知识体系总览

下面这张图,是我自己画的编码器知识体系。你看一遍,心里就有谱了。

编码器知识体系 增量式编码器 绝对式编码器 ABZ信号 脉冲计数 方向判断 格雷码 SSI协议 掉电记忆 工作原理 光栅式 磁栅式 电气特性 TTL/HTL RS-422差分 推挽输出

1.6 选型建议

最后,我给大家一个选型清单。照着这个选,基本不会出错。

  1. 看精度需求:要求不高(<0.1°)用增量式,要求高用绝对式
  2. 看环境:干净环境用光栅式,脏污环境用磁栅式
  3. 看距离:近距离用TTL,远距离用RS-422
  4. 看接口:STM32用定时器模式接ABZ,或者用QEI外设
  5. 看预算:增量式几十块,绝对式几百到上千

避坑指南:我曾经在一个项目里选了1000线的增量式编码器,结果电机转速一高,STM32的定时器根本数不过来。后来才发现,1000线在3000rpm时,频率是50kHz,普通定时器扛得住。但如果是5000线、6000rpm,频率就500kHz了,必须用专门的编码器接口芯片或者高速定时器。

好了,编码器的基础知识就聊到这儿。下一节咱们会深入STM32的编码器接口模式,手把手教你配置定时器、读取ABZ信号。到时候我会拿出我调试过的代码,咱们一行一行地看。


公众号:蓝海资料掘金营,微信deep3321