2、编码器基础:编码器分类、分辨率与精度、常用接口

做 FOC 控制,编码器就是你的眼睛。眼睛看不清,电机就转不好。这个道理我做了好几年才真正体会到。

今天咱们把编码器的基础掰开揉碎讲清楚。你搞懂了这些,后面做换相和零位校准才能心里有底。

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

编码器分两大类:增量式和绝对式。说白了,一个只告诉你动了多少,一个直接告诉你现在在哪。

对比项 增量式编码器 绝对式编码器
工作原理 输出脉冲信号,通过计数得到位置变化 输出唯一编码,直接对应绝对位置
断电记忆 不记忆,上电需回零 记忆位置,上电即用
抗干扰 脉冲易受干扰,累计误差 抗干扰强,无累计误差
成本 低 高
典型应用 伺服电机、步进电机 机器人关节、高端数控

我个人习惯,做低成本 FOC 驱动器时用增量式,配合霍尔传感器做上电初始定位。但如果你做协作机器人或者高端伺服,绝对式是必须的——上电不用回零,安全又省事。

我的经验: 增量式编码器做 FOC 时,上电必须做一次零位校准。我见过有人直接上电就跑,结果电机猛转半圈撞了限位。嗯,那场面挺尴尬的。

2.2 分辨率与精度——别搞混了

这两个概念很多人混为一谈。我面试工程师时经常问这个问题,能答清楚的不多。

分辨率是编码器能分辨的最小角度变化。比如 1000 线的增量式编码器,一圈 1000 个脉冲,四倍频后就是 4000 个计数,分辨率 = 360° / 4000 = 0.09°。

精度是实际位置和测量位置的偏差。它受机械安装、码盘刻划误差、信号处理电路影响。分辨率再高,精度跟不上也没用。

核心观点: 分辨率是理论上的细分能力,精度是实际上的测量误差。高分辨率 ≠ 高精度。

举个例子。我做过一个项目,用了 20 位绝对式编码器,分辨率高达 0.001°。结果装上去发现精度只有 0.1°。为什么?码盘偏心、轴系间隙、安装歪斜,这些机械误差把精度拉下来了。你想想看,花大价钱买高分辨率编码器,机械没做好,等于白花钱。

参数 分辨率 精度
定义 最小可检测角度变化 测量值与真实值的偏差
单位 线/圈、位(bit) 角分、角秒
影响因素 码盘刻线数、电子细分 机械安装、码盘质量、信号噪声
FOC 影响 决定速度环带宽上限 决定电流环相位精度
避坑指南: 我曾经选型时只看分辨率,忽略了精度。结果电机低速时抖动严重,查了三天才发现是编码器精度不够,导致电流环反馈有周期性误差。从那以后,我选编码器一定先看精度指标。

2.3 常用接口详解

接口决定了你怎么读数据,也决定了你的硬件成本和开发难度。我按使用频率从高到低讲。

2.3.1 ABZ 接口(增量式最常用)

A、B 两相正交信号,相位差 90°。通过判断 A 超前还是 B 超前,就能知道正反转。Z 相是零位脉冲,每圈一个,用于回零校准。

我习惯用 STM32 的定时器编码器模式直接读 ABZ,硬件自动计数,CPU 几乎零开销。代码很简单:

// STM32 定时器编码器模式配置示例
TIM_EncoderInterfaceConfig(TIM2, TIM_ENCODERMODE_TI12, 
                           TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
TIM_EncoderInterfaceConfig(TIM3, TIM_ENCODERMODE_TI12, 
                           TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
// 使能定时器
TIM_Cmd(TIM2, ENABLE);
TIM_Cmd(TIM3, ENABLE);

注意:ABZ 接口抗干扰能力一般,长线传输时建议加差分驱动(RS-422)。

2.3.2 UVW 接口(霍尔换相信号)

UVW 是三个霍尔信号,每 120° 一个。六个扇区,每个扇区 60°。主要用于无刷电机的初始换相。

做 FOC 时,UVW 信号可以用来做上电初始位置检测。我一般这样用:

  • 上电读 UVW 状态,确定转子在哪个 60° 扇区
  • 然后切换到 ABZ 或 SPI 做精细位置跟踪
  • 如果只有 UVW 没有 ABZ,那就只能做方波控制,做不了正弦 FOC
小技巧: UVW 信号也可以用定时器捕获。我习惯用 EXTI 中断触发,配合 DMA 读取,这样不会阻塞主循环。

2.3.3 SPI 接口(绝对式编码器主流)

SPI 接口的绝对式编码器,上电直接读位置数据。常见协议有 EnDat、SSI、BiSS 等。SPI 的好处是速度快、数据可靠、支持多圈。

我常用的 SPI 读取流程:

  1. 拉低片选 CS
  2. 发送读命令(通常是 16 位或 24 位)
  3. 接收位置数据(同时发送 dummy 时钟)
  4. 拉高片选 CS
  5. 解析数据,校验 CRC
// SPI 读取绝对式编码器示例(伪代码)
uint32_t read_encoder_position(void) {
    uint32_t raw_data = 0;
    CS_LOW();
    // 发送读命令,同时接收数据
    raw_data = SPI_ReadWrite(0x0000);  // 16位或24位
    CS_HIGH();
    // 解析位置(根据编码器协议)
    uint32_t position = raw_data & 0x3FFF;  // 假设14位
    return position;
}

注意:SPI 时钟频率不能太高,我一般控制在 1-5MHz,太高速容易受干扰。

2.3.4 BiSS 接口(高速绝对式编码器)

BiSS 是开源协议,速度比 SPI 快,支持更长的传输距离。它用差分信号传输,抗干扰能力强。

BiSS 的时序和 SPI 类似,但多了寄存器读写功能。你可以通过 BiSS 配置编码器的分辨率、滤波参数等。

接口 类型 最大速率 传输距离 典型应用
ABZ 增量式 ~10 MHz ~10m(差分) 通用伺服
UVW 增量式 ~100 kHz ~5m 霍尔换相
SPI 绝对式 ~10 MHz ~1m 机器人关节
BiSS 绝对式 ~50 MHz ~50m(差分) 高端数控

2.4 知识体系总览

下面这张图把编码器的基础知识串起来了。你对照着看,心里就有谱了。

编码器基础知识体系 编码器基础 增量式编码器 绝对式编码器 ABZ 接口 UVW 接口 脉冲计数 SPI 接口 BiSS 接口 多圈计数 关键参数 分辨率(线/位) 精度(角分/角秒) 接口速率 选型要点:先定接口(ABZ/SPI/BiSS),再定分辨率,最后确认精度是否满足 FOC 控制需求

这张图把编码器的分类、接口、关键参数串在了一起。你选型时,先看接口能不能匹配你的主控,再看分辨率够不够用,最后确认精度能不能满足 FOC 的电流环要求。