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的相位差必须是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的时序要重点关注相位差和脉冲宽度,这是信号完整性的起点。