共计 1964 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
AB 相编码器在电机控制中扮演着至关重要的角色,它能够提供精确的位置和速度反馈,是实现闭环控制的基础。然而,在实际应用中,开发者常常会遇到以下问题:

- 信号毛刺导致计数错误,尤其是在工业环境下,电磁干扰较为严重
- 正反向判别失效,导致电机运动方向与预期不符
- 低速时脉冲丢失,影响低速区域的运动控制精度
针对这些问题,我们需要从硬件和软件两个层面入手,构建一个稳定可靠的编码器信号处理系统。
硬件层方案
滤波电路设计
在硬件层面,信号滤波是首要考虑的问题。常见的滤波方案有 RC 滤波和施密特触发器两种:
- RC 滤波 :简单易实现,成本低,但无法完全消除毛刺
- 施密特触发器 :具有迟滞特性,能有效消除抖动,但需要额外的芯片
对于大多数应用,结合两者的优点,设计一个 RC 滤波 + 施密特触发器的两级滤波电路是最佳选择。
典型电路参数计算
截止频率的选取至关重要,一般建议为最大信号频率的 4 倍。例如,如果编码器最高输出频率为 100kHz,那么截止频率应设置为 400kHz。RC 滤波的计算公式为:
fc = 1 / (2πRC)
PCB 布局注意事项
- 信号线必须等长处理,避免相位差
- 编码器信号线应远离大电流走线
- 使用差分走线方式提高抗干扰能力
软件层实现
STM32CubeMX 配置
使用 STM32CubeMX 可以快速配置 TIM 编码器模式:
- 选择 TIMx 定时器
- 配置为 Encoder Mode
- 设置 TI1 和 TI2 的极性
- 开启编码器接口
四倍频解码算法
四倍频解码通过检测 AB 相的边沿变化,将分辨率提高到 4 倍。实现时可以采用状态机的方式:
typedef enum {
STATE_00,
STATE_01,
STATE_11,
STATE_10
} EncoderState;
EncoderState currentState;
int32_t encoderCount;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {uint8_t a = HAL_GPIO_ReadPin(ENC_A_GPIO_Port, ENC_A_Pin);
uint8_t b = HAL_GPIO_ReadPin(ENC_B_GPIO_Port, ENC_B_Pin);
switch(currentState) {
case STATE_00:
if(a && !b) {encoderCount++; currentState = STATE_10;}
else if(!a && b) {encoderCount--; currentState = STATE_01;}
break;
// 其他状态处理...
}
}
速度计算
速度计算推荐使用滑动窗口滤波算法,结合 ARM DSP 库可以高效实现:
#include "arm_math.h"
#define WINDOW_SIZE 16
float32_t speedBuffer[WINDOW_SIZE];
uint32_t bufferIndex = 0;
float32_t calculateSpeed(int32_t deltaCount, float32_t deltaTime) {
float32_t instantSpeed = deltaCount / deltaTime;
// 更新滑动窗口
speedBuffer[bufferIndex] = instantSpeed;
bufferIndex = (bufferIndex + 1) % WINDOW_SIZE;
// 计算平均值
float32_t meanSpeed;
arm_mean_f32(speedBuffer, WINDOW_SIZE, &meanSpeed);
return meanSpeed;
}
避坑指南
中断服务优化
- 避免在中断服务程序中进行浮点运算
- 使用查表法替代实时计算
- 优先使用整数运算
脉冲溢出处理
32 位计数器的溢出处理需要特别注意:
int32_t getEncoderCount() {
static uint32_t lastCount = 0;
uint32_t currentCount = TIMx->CNT;
int32_t delta = (int32_t)(currentCount - lastCount);
lastCount = currentCount;
return delta;
}
EMC 问题解决
- 确保良好的接地
- 使用屏蔽线连接编码器
- 在电源入口处添加 TVS 二极管
验证环节
实时监测
使用 J -Scope 可以实时观察速度曲线,评估控制效果。重点关注:
- 速度波动范围
- 响应时间
- 超调量
性能测试
通过阶跃响应测试评估系统性能:
- 设置目标速度从 0 到额定值的阶跃变化
- 记录以下指标:
- 上升时间
- 超调量
- 调节时间
- 稳态误差
EMC 测试
- 辐射发射测试
- 传导发射测试
- 静电放电测试
思考题
如何实现零速时的位置保持?可以考虑以下方案:
- 使用 PID 控制器的积分项补偿静摩擦力
- 采用自适应控制算法
- 结合电流环实现力矩控制
希望这篇文章能帮助开发者解决 AB 相编码器电机控制中的常见问题,实现高精度的运动控制。
正文完
