1. 课程导入

编码器,说白了就是电机的位置传感器。做运动控制,你绕不开它。我刚开始接触STM32做电机驱动时,总觉得编码器不就是个脉冲计数器嘛,有什么难的?直到有一次,一个伺服项目在高速运行时位置跳变,我才意识到——编码器接口的信号完整性,才是整个控制系统的基石。

这一章,我们先打好基础。把增量式和式编码器的原理、分辨率与精度的区别、以及A/B/Z信号的时序彻底搞清楚。

1.1 增量式编码器:原理与输出信号

增量式编码器,它不告诉你位置,只告诉你「动了多少」。每次转动,它输出脉冲。你需要一个计数器来累加这些脉冲,才能知道当前的位置。

它的核心结构很简单:一个码盘,上面刻着均匀的透光和不透光条纹。光耦对射,码盘一转,就输出方波。

增量式编码器的三个关键信号:

  • A相:主脉冲信号,每转一圈输出N个脉冲
  • B相:与A相差90°相位,用于判断旋转方向
  • Z相:零位信号,每转一圈输出一个脉冲,用于机械原点校准

判断方向的方法很简单:A相上升沿时,读B相的电平。如果B相是高电平,正转;低电平,反转。这就是所谓的「正交解码」。STM32的定时器硬件直接支持这个功能,你只需要配置好编码器模式,硬件会自动帮你计数。

我的经验: 实际项目中,编码器线缆的屏蔽层一定要单端接地。我曾经在一个变频器旁边调试,编码器信号被严重干扰,A/B相上叠加了毛刺,导致STM32误判方向。后来把屏蔽层在控制器端接地,问题立刻解决。

1.2 式编码器:位置数据直接读取

式编码器就高级一些了。它不需要计数器,上电就能知道当前位置。码盘上刻的是格雷码或多圈编码,每个位置对应唯一的二进制码。

它的优势很明显:

  • 断电不丢失位置:不需要找原点
  • 抗干扰能力强:数据通过串行协议传输,不是脉冲计数
  • 适合多圈应用:比如机械臂关节,需要知道转了多少圈

常用的通信协议有:SSI、BiSS、EnDat、CANopen等。STM32通过SPI或UART接口读取数据。我建议你优先用SPI,因为它的时钟由主控控制,时序更可控。

注意: 式编码器的数据读取有严格的时序要求。比如SSI协议,时钟频率、数据建立时间、保持时间都有明确参数。如果时序不满足,读出来的数据就是错的。我曾经在调试BiSS协议时,因为STM32的SPI时钟极性配置反了,读到的位置数据一直在跳变,折腾了两天才找到原因。

1.3 分辨率与精度:两个容易混淆的概念

很多初学者把分辨率和精度混为一谈。我告诉你,它们完全是两码事。

概念 定义 举例
分辨率 编码器能检测到的最小位置变化量 1000线编码器,分辨率 = 360°/1000 = 0.36°
精度 实际位置与测量位置之间的误差 ±0.1°,取决于码盘刻划精度和安装误差

分辨率高不代表精度高。一个10000线的编码器,如果码盘偏心,精度可能还不如一个1000线的。我见过有人花大价钱买了高分辨率编码器,结果安装时轴没对中,精度反而更差。

避坑指南: 选型时,先确定你需要的精度,再反推分辨率。一般分辨率要比精度高一个数量级。比如你需要±0.1°的精度,分辨率至少要做到0.01°。

1.4 A/B/Z信号时序解析

增量式编码器的时序,是信号完整性分析的基础。我们来看一个标准的A/B/Z时序图。

增量式编码器 A/B/Z 信号时序图 增量式编码器 A/B/Z 信号时序 t A B Z 90° 相位差 Z脉冲宽度 = 1个A相周期 正转时:A相上升沿 → B相为低;反转时:A相上升沿 → B相为高

时序上要注意几个关键参数:

  • 相位差:A和B的相位差必须是90° ± 一定容差。如果偏差太大,STM32的编码器接口会误判方向
  • Z脉冲宽度:通常等于一个A相周期。有些编码器的Z脉冲更窄,需要确认
  • 边沿抖动:高速时,信号边沿会有抖动。我建议在STM32的定时器配置中开启数字滤波器,可以有效滤除窄脉冲干扰

我的调试习惯: 每次拿到新的编码器,我都会先用示波器抓一下A/B/Z的波形。确认相位关系正确、脉冲宽度符合预期、没有毛刺。这一步花10分钟,能省后面几天的排查时间。

1.5 编码器接口的电气特性

编码器的输出类型主要有三种:

输出类型 电压范围 特点 STM32接口
推挽输出 5V / 3.3V 信号强,抗干扰好 直接连接,注意电平匹配
集电极开路 取决于上拉电阻 需要外部上拉,上升沿慢 加10kΩ上拉到3.3V
差分输出 RS-422电平 抗干扰最强,适合长距离 需要差分接收器(如AM26LV32)

我个人强烈建议:如果编码器距离控制器超过1米,一定要用差分输出。我在一个项目中,编码器线缆走了5米,用了推挽输出,结果信号衰减严重,A相上升沿变成了斜坡,导致STM32计数丢步。换成差分输出后,问题彻底解决。

电平转换陷阱: 很多5V输出的编码器,直接接到3.3V的STM32 GPIO上,虽然能工作,但长期可靠性堪忧。我建议用电平转换芯片(如74LVC4245)或者电阻分压。别图省事,烧了IO口就得不偿失了。

1.6 本章小结

这一章我们讲了编码器的基础知识。增量式编码器输出A/B/Z脉冲,需要计数器累加;式编码器直接输出位置数据,通过串行协议读取。分辨率和精度是两个概念,选型时别搞混。A/B/Z的时序要重点关注相位差和脉冲宽度,这是信号完整性的起点。