共计 1579 个字符,预计需要花费 4 分钟才能阅读完成。
ABZ 编码器信号处理实战笔记
最近在电机控制项目中遇到了 ABZ 编码器信号抖动的问题,记录一下 RC 滤波电路的实践过程。工业现场电磁环境复杂,编码器信号常受到干扰,导致位置检测不准,这时候滤波电路就显得尤为重要。

一、为什么需要滤波?
ABZ 编码器(又称正交编码器)通过 A、B 两相 90 度相位差的方波信号提供位置和方向信息。但在实际应用中:
- 电机运行时产生的电磁干扰
- 长距离传输导致的信号衰减
- 连接器接触不良
这些都会引起信号边沿抖动,可能导致计数器误触发。我曾遇到过 1 米无屏蔽线缆情况下,转速测量误差高达 15% 的情况。
二、滤波方案对比
测试了三种处理方案:
- 无滤波
- 优点:零延迟
-
缺点:误触发频繁(SNR 仅 8dB)
-
一阶 RC 滤波
- 成本:电阻电容约 0.1 元
-
性能:SNR 提升至 24dB,相位延迟约 1.2μs
-
二阶 RC 滤波
- 成本:增加一倍元件
- 性能:SNR 达 32dB,但延迟增至 3.5μs
对于 1000RPM 以下的电机控制,一阶滤波通常就能满足需求。
三、核心实现步骤
3.1 RC 参数计算
截止频率公式:
f_c = 1/(2πRC)
建议取值原则:
– 下限:10 倍信号最高频率
– 上限:1/ 4 输入捕获定时器分辨率
例如:
– 编码器 1000 线,3000RPM 时:
1000 线 × (3000/60) = 50kHz 信号频率
→ 取 f_c=100kHz
→ 选 R =1kΩ,则 C =1.6nF
3.2 STM32 硬件配置
关键寄存器设置(以 TIM3 为例):
// 启用编码器模式
TIM3->SMCR |= TIM_SMCR_SMS_0 | TIM_SMCR_SMS_1;
// 配置 GPIO 复用
GPIOB->AFR[0] |= (1<<4*4) | (1<<5*4); // PB4/PB5 复用为 TIM3
// 设置输入捕获滤波器(4 个时钟周期)TIM3->CCMR1 |= (0x4<<12) | (0x4<<4);
3.3 软件滤波补充
移动平均滤波示例:
#define FILTER_WINDOW 5
uint16_t filter_buffer[FILTER_WINDOW];
uint16_t moving_average(uint16_t new_val) {
static uint8_t idx = 0;
uint32_t sum = 0;
filter_buffer[idx++] = new_val;
if(idx >= FILTER_WINDOW) idx = 0;
for(uint8_t i=0; i<FILTER_WINDOW; i++) {sum += filter_buffer[i];
}
return sum / FILTER_WINDOW;
}
四、实测效果
测试条件:
– 电机转速 500RPM
– 1024 线编码器
– 1 米非屏蔽电缆
| 方案 | 原始计数 | 滤波后计数 | 误差率 |
|---|---|---|---|
| 无滤波 | 8523 | – | 16.7% |
| 一阶 RC | 8531 | 8530 | 0.12% |
| 二阶 RC | 8528 | 8529 | 0.08% |
示波器观察发现:
– 原始信号边沿有约 200ns 抖动
– 一阶滤波后抖动减小到 50ns 以内
五、常见问题解决
- 信号畸变 :当截止频率设置过低时,方波可能变成三角波。解决方法:
- 用示波器确认信号形状
-
按 3.1 节重新计算参数
-
共模干扰 :电源噪声导致 AB 信号同时波动。建议:
- 在编码器供电端加 10μF+0.1μF 去耦电容
-
使用双绞线传输信号
-
实时性问题 :中断服务程序过长会导致丢失脉冲。优化技巧:
- 仅置标志位,主循环处理计数
- 使用 DMA 传输计数器值
六、进阶思考
对于高动态场景(如伺服系统),可以尝试:
– 卡尔曼滤波:结合运动模型预测
– 自适应滤波:根据转速动态调整参数
推荐论文:
“Rotary Encoder Signal Processing for High Performance Servo Drives” – IEEE Trans. Ind. Electron.
实践感悟
这次调试让我深刻体会到:硬件滤波是基础,软件算法是补充。在 EMC 恶劣的环境下,与其追求复杂的算法,不如先把 RC 参数调好。下一步计划尝试将滤波电路做成模块化设计,方便在不同项目中复用。
