共计 2173 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点:为什么需要编码器?
在电机控制系统中,精确的位置和速度反馈是闭环控制的基础。AB 相增量式霍尔编码器因其结构简单、成本低廉、抗污染能力强等优点,成为中小型电机的主流选择。但新手常遇到以下问题:

- 信号抖动:机械振动导致 AB 相出现毛刺,引发误计数
- 计数丢失:高速旋转时 MCU 来不及处理所有脉冲边沿
- 方向误判:未正确处理 AB 相 90°相位差逻辑
- 电源干扰:电机启停导致编码器供电波动,产生错误信号
原理解析:AB 相信号的秘密
增量式编码器输出两路正交方波(A 相和 B 相),其相位关系携带方向信息:
- 正向旋转 时 A 相领先 B 相 90°(电气角度)
- 反向旋转 时 B 相领先 A 相 90°
通过检测边沿顺序即可判断方向。典型信号波形如下(示波器实测):
A 相: __|‾‾|__|‾‾|__|‾‾|__
B 相: ____|‾‾|__|‾‾|__|‾‾|
↑ 正向旋转时边沿顺序
硬件设计:打造稳定信号链路
推荐电路架构
编码器 → 光电隔离 → RC 滤波 → 施密特触发器 → MCU
关键设计要点
- 光电隔离:采用 HCPL-2631 等高速光耦,隔离电机与逻辑电路
- VCC1 接编码器 5V 电源
-
VCC2 接 MCU 的 3.3V 电源
-
电源去耦:每个 IC 的 VCC 引脚就近放置 0.1μF 陶瓷电容
-
信号滤波:
- 推荐值:R=100Ω,C=100pF(截止频率约 16MHz)
- 注意电容值过大会导致边沿变缓
软件实现:STM32 实战代码
定时器编码器模式配置
// TIM3 初始化(STM32CubeIDE 生成)void MX_TIM3_Init(void)
{TIM_Encoder_InitTypeDef sConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim3.Instance = TIM3;
htim3.Init.Prescaler = 0;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 65535; // 16 位计数器最大值
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
// 编码器模式配置
sConfig.EncoderMode = TIM_ENCODERMODE_TI12; // 双通道模式
sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
sConfig.IC1Filter = 6; // 8 个时钟周期的滤波
sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
sConfig.IC2Filter = 6;
HAL_TIM_Encoder_Init(&htim3, &sConfig);
// 启动编码器接口
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
}
位置读取与方向判断
int32_t GetEncoderPosition(void)
{
static uint16_t last_count = 0;
static int32_t total_count = 0;
uint16_t curr_count = TIM3->CNT;
int16_t delta = (int16_t)(curr_count - last_count);
// 处理计数器溢出
if(delta > 32767) delta -= 65536;
else if(delta < -32768) delta += 65536;
total_count += delta;
last_count = curr_count;
return total_count;
}
性能优化:精度与速度的平衡
采样频率选择
| 转速(rpm) | 线数 | 脉冲频率 | 推荐采样频率 |
|---|---|---|---|
| 3000 | 500 | 25kHz | ≥100kHz |
| 6000 | 1000 | 100kHz | ≥400kHz |
方案对比
- 中断方式:
- 优点:实现简单
-
缺点:高速时可能丢失脉冲
-
DMA 方式:
- 优点:不占用 CPU 资源
- 缺点:需要更多存储空间
避坑指南:前人踩过的 5 个坑
- 机械安装偏差:
- 症状:低速时计数不稳定
-
解决:保证编码器与轴同心度 <0.1mm
-
信号延迟不对称:
- 症状:正反转计数不一致
-
解决:确保 AB 相走线等长
-
电源干扰:
- 症状:电机启动时出现乱码
-
解决:编码器电源单独稳压
-
软件滤波过度:
- 症状:高速时计数滞后
-
解决:动态调整滤波器参数
-
忽略归零处理:
- 症状:断电后位置丢失
- 解决:增加 Z 相参考信号
扩展思考:从能用走向好用
掌握了基础计数功能后,可以尝试:
- 速度计算:
- 方法:M 法测速(固定时间测脉冲数)
-
优化:T 法测速(测量脉冲周期)
-
位置校准:
- 方案:利用限位开关建立物理零点
-
进阶:电池备份的绝对位置记忆
-
故障诊断:
- 检测:AB 相信号丢失告警
- 保护:异常状态自动停机
通过本文介绍的方法,读者应能构建稳定的编码器信号处理系统。实际应用中还需结合具体场景调整参数,建议先用示波器观察原始信号质量,再逐步优化软硬件设计。
正文完
