共计 1704 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
在电机控制和工业自动化领域,AB 双相霍尔编码器(AB-phase Hall Encoder)是位置检测的关键部件。但实际开发中常遇到几个典型问题:

- 信号抖动(Signal Bounce):机械振动或电磁干扰导致波形出现毛刺
- 方向误判(Direction Misjudgment):转速突变时软件逻辑错误识别旋转方向
- 低速检测失效(Low-speed Failure):转速低于采样频率时丢失脉冲
这些问题直接影响伺服系统的定位精度,例如在 3D 打印机送料控制中,方向误判会导致挤出机反向运动引发堵料故障。
原理对比
单相编码 vs 正交编码
- 单相编码(Single-phase Encoding)
- 仅通过脉冲数量计算位移
- 无法判断旋转方向
-
典型应用:老式光电鼠标滚轮
-
正交编码(Quadrature Encoding)
- AB 两路信号相位差 90°(如图 1 时序图)
A 相: _|‾|_|‾|_|‾ B 相: ‾|_|‾|_|‾|_ - 通过相位关系判断方向(A 领先 B 为正转,反之为反转)
- 四倍频计数提升分辨率
硬件设计
信号调理电路(Signal Conditioning)
推荐使用施密特触发器(Schmitt Trigger)消除抖动,典型电路如图 2:
+5V
|
R1
|
A 相 ——||——+——> 到 MCU
C1 R2
|
GND
参数计算 :
– 截止频率公式:f_c=1/(2πRC)
– 示例:当 R1=10kΩ, C1=100nF 时,f_c≈159Hz(适合转速 <1000RPM 场景)
代码实现(STM32 HAL 库)
初始化编码器模式
// 使用 TIM3 的通道 1 / 2 作为 AB 相输入
TIM_Encoder_InitTypeDef encoder = {
.EncoderMode = TIM_ENCODERMODE_TI12, // 正交编码模式
.IC1Filter = 6, // 输入滤波 (0x0-0xF)
.IC1Polarity = TIM_ICPOLARITY_RISING,
.IC2Polarity = TIM_ICPOLARITY_RISING
};
HAL_TIM_Encoder_Init(&htim3, &encoder);
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
方向判断状态机
// 在定时器溢出中断中处理
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
static uint8_t last_state = 0;
uint8_t curr_state = (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC1) ? 1 : 0)
| (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC2) ? 2 : 0);
// 状态转移表
const int8_t state_table[4][4] = {{ 0, +1, -1, 0}, // 00 -> 00,01,10,11
{-1, 0, 0, +1},
{+1, 0, 0, -1},
{0, -1, +1, 0}
};
position += state_table[last_state][curr_state];
last_state = curr_state;
}
性能优化
软件去抖算法对比
| 方法 | 响应延迟 | CPU 占用 | 适用场景 |
|---|---|---|---|
| 查表法 | 低 | 中 | 低速高精度 |
| 移动平均滤波 | 高 | 低 | 高速抗干扰 |
推荐在中断中使用查表法:
// 预定义有效状态转移(抑制毛刺)const uint8_t valid_transitions[4] = {
0b0001 | 0b0010, // 00 只能转 01 或 10
0b0000 | 0b0011,
0b0000 | 0b0011,
0b0010 | 0b0001
};
避坑指南
- 长线传输畸变
- 问题现象:AB 相出现振铃(Ringing)
-
解决方案:在编码器端并联 120Ω 终端电阻
-
电源噪声干扰
- 问题现象:静止时计数器仍跳动
-
解决方案:给编码器单独供电并添加 LC 滤波
-
机械安装偏差
- 问题现象:高速时丢失脉冲
- 解决方案:确保编码盘与轴同心度 <0.1mm
验证方法
使用 Saleae 逻辑分析仪抓取波形时注意:
- 同时捕获 AB 相和 MCU 的 DIR 方向信号
- 检查正转 / 反转时的相位关系
- 突然反转时观察方向信号响应时间
思考题
如何扩展实现零速位置保持功能?
(提示:结合 TIM 的刹车功能和外部比较器)
正文完
