共计 1945 个字符,预计需要花费 5 分钟才能阅读完成。
ABZ 编码器基础原理
ABZ 编码器(增量式编码器)通过输出两路相位差 90°的方波信号(A/ B 相)和零位脉冲信号(Z 相)来记录旋转角度和位置。这种设计允许我们不仅测量旋转角度,还能判断旋转方向。

- A/ B 相信号 :两路正交方波,相位差 90°,旋转方向可通过相位领先关系判断
- Z 相信号 :每转一圈输出一个脉冲,用于绝对位置校准
- 分辨率 :取决于编码器线数,常见有 100-5000 线 / 转
硬件接口方案
在 STM32 上,我们有两种主要实现方式:
- 硬件解码(推荐)
使用定时器的正交编码器接口模式,自动处理计数方向和脉冲累加
// STM32 HAL 库配置示例
TIM_Encoder_InitTypeDef encoderConfig = {
.EncoderMode = TIM_ENCODERMODE_TI12,
.IC1Polarity = TIM_ICPOLARITY_RISING,
.IC1Selection = TIM_ICSELECTION_DIRECTTI,
.IC1Prescaler = TIM_ICPSC_DIV1,
.IC1Filter = 6, // 适当滤波
.IC2Polarity = TIM_ICPOLARITY_RISING,
.IC2Selection = TIM_ICSELECTION_DIRECTTI,
.IC2Prescaler = TIM_ICPSC_DIV1,
.IC2Filter = 6
};
HAL_TIM_Encoder_Init(&htim3, &encoderConfig);
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
- 软件解码
通过 GPIO 中断捕获边沿,需要自行处理计数逻辑,适合低端 MCU
信号处理与滤波
编码器信号常受噪声干扰,我们采用移动平均滤波算法:
#define FILTER_WINDOW 5
int32_t movingAverageFilter(int32_t newValue) {static int32_t buffer[FILTER_WINDOW] = {0};
static uint8_t index = 0;
static int32_t sum = 0;
sum -= buffer[index];
buffer[index] = newValue;
sum += newValue;
index = (index + 1) % FILTER_WINDOW;
return sum / FILTER_WINDOW;
}
零位校准与存储
Z 相信号用于绝对位置校准,校准数据需要可靠存储:
// 带 CRC 校验的 EEPROM 存储
void saveCalibrationData(int32_t zeroPos) {uint8_t data[8];
uint32_t crc;
memcpy(data, &zeroPos, 4);
crc = HAL_CRC_Calculate(&hcrc, (uint32_t *)data, 1);
memcpy(data+4, &crc, 4);
HAL_FLASH_Unlock();
// EEPROM 写入操作...
HAL_FLASH_Lock();}
常见问题与解决方案
- 信号振铃现象
- 使用双绞线传输信号
- 在编码器输出端添加 100Ω 终端电阻
-
必要时增加 RC 滤波电路(典型值:100Ω+100nF)
-
计数器溢出处理
// 32 位扩展计数器实现 volatile int64_t fullCount = 0; int32_t lastCount = 0; void updatePosition() { int32_t current = TIM3->CNT; int32_t delta = current - lastCount; if(delta > 0x7FFF) { // 向下溢出 fullCount -= 0x10000 - delta; } else if(delta < -0x7FFF) { // 向上溢出 fullCount += 0x10000 + delta; } else {fullCount += delta;} lastCount = current; } -
Z 脉冲丢失问题
- 增加硬件滤波:在 Z 相输入前加 π 型滤波器(100Ω+100nF+100Ω)
- 软件去抖:连续检测到 3 次有效边沿才确认 Z 脉冲
系统验证方法
- 时序验证
- 使用 J -Link Scope 或逻辑分析仪捕获 ABZ 信号
-
确认 A / B 相 90°相位差和 Z 脉冲位置
-
角度标定
- 使用激光测距仪或高精度转台作为基准
-
在全量程范围内取多个测试点对比
-
老化测试
- 连续运行 24 小时监测角度漂移
- 记录温度变化并建立补偿曲线
动手实验
- 使用示波器连接编码器 ABZ 输出
- 手动旋转编码器轴,观察波形关系
- 测量 A 相两个上升沿的时间差 Δt
- 计算转速:RPM = (60/( 线数×Δt))
通过本指南的系统实践,我们成功实现了±0.1°的角度测量精度。实际应用中,还需要根据具体环境优化滤波参数和抗干扰措施。希望这些经验能帮助开发者少走弯路,快速实现可靠的编码器应用方案。
正文完
