共计 1618 个字符,预计需要花费 5 分钟才能阅读完成。
1. 核心概念
AB 相编码器是一种通过两路正交方波信号(A 相和 B 相)来检测旋转方向、位置和速度的传感器。其核心原理基于两个关键特性:

- 相位差 :A、B 两相信号存在 90°相位差(正交)。当编码器顺时针旋转时,A 相领先 B 相;逆时针时则相反。
- 脉冲计数 :每转过一个最小角度单位(由编码器分辨率决定),A/ B 相会各产生一个方波脉冲。
位置计算通常通过以下步骤实现:
- 通过硬件或软件捕获 A / B 相的上升沿和下降沿
- 根据两相信号的先后顺序判断方向
- 累计脉冲数乘以单个脉冲对应的位移量(如每脉冲 0.1mm)
2. 痛点分析
实际应用中常见的挑战包括:
- 信号干扰 :长距离传输时易受电磁干扰导致信号畸变
- 高速漏脉冲 :转速超过计数器采样频率时会出现脉冲丢失
- 机械安装误差 :编码盘与转轴不同心会导致周期性测量误差
- 抖动问题 :运动方向频繁切换时可能产生误判
3. 技术方案
硬件优化
- 采用差分信号传输(如 RS422 接口)
- 增加磁环滤波器和屏蔽线缆
- 选择更高分辨率的光电隔离输入模块
软件处理
// 伪代码示例:四倍频计数算法
void handleEncoderISR() {
static uint8_t prevState = 0;
uint8_t currState = (digitalRead(A_PIN) << 1) | digitalRead(B_PIN);
// 状态转移表:prevState -> currState
const int8_t countTable[16] = {
0, +1, -1, 0, // 00 -> 00,01,10,11
-1, 0, 0, +1,
+1, 0, 0, -1,
0, -1, +1, 0
};
position += countTable[(prevState << 2) | currState];
prevState = currState;
}
4. 代码示例
完整 STM32 HAL 库实现示例:
// encoder.h
#define ENCODER_GPIO_PORT GPIOA
#define ENCODER_A_PIN GPIO_PIN_0
#define ENCODER_B_PIN GPIO_PIN_1
volatile int32_t encoderCount = 0;
// encoder.c
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
static uint8_t oldAB = 0;
uint8_t newAB = (HAL_GPIO_ReadPin(ENCODER_GPIO_PORT, ENCODER_A_PIN) << 1) |
HAL_GPIO_ReadPin(ENCODER_GPIO_PORT, ENCODER_B_PIN);
// Gray code sequence: 00->01->11->10->00...
switch(oldAB | (newAB << 2)) {
case 0b0001: case 0b0111: case 0b1110: case 0b1000:
encoderCount++; break;
case 0b0010: case 0b1011: case 0b1101: case 0b0100:
encoderCount--; break;
}
oldAB = newAB;
}
5. 性能考量
| 方案 | 精度提升 | CPU 负载 | 适用场景 |
|---|---|---|---|
| 单边沿计数 | 1x | 低 | 低速简单控制 |
| 双边沿计数 | 2x | 中 | 常规速度控制 |
| 四倍频解码 | 4x | 高 | 高精度定位系统 |
| 硬件计数器 | 1x | 最低 | 超高速场合 |
6. 避坑指南
- 信号处理 :
- 线路长度超过 1 米时必须使用双绞屏蔽线
- 信号端接 120Ω 终端电阻匹配阻抗
- 机械安装 :
- 联轴器径向偏差应小于 0.1mm
- 推荐使用弹性联轴器补偿微小不对中
- 电气隔离 :
- 工业环境必须使用光耦隔离或磁隔离芯片
- 避免与电机驱动共用电源
7. 总结与思考
实际项目中,编码器性能的优化往往需要硬件和软件的协同设计。对于需要亚微米级精度的场合,可以考虑:
- 增加参考零点(Z 相)进行周期性位置校准
- 采用自适应滤波算法动态消除抖动
- 结合卡尔曼滤波融合多传感器数据
未来随着 MEMS 技术的发展,集成化智能编码器可能成为趋势,将信号处理、温度补偿等功能全部集成在传感器端。
正文完
