共计 1845 个字符,预计需要花费 5 分钟才能阅读完成。
电机编码器工作原理
- 增量式编码器通过 A / B 两相正交信号输出脉冲,相位差 90°用于判断旋转方向。
- 520 电机常用 500 线编码器,每转产生 2000 个计数(4 倍频模式下)。
- 正交信号解码原理:
- A 相上升沿时检测 B 相电平(高电平为正转,低电平为反转)
- 每个边沿均可触发计数,实现 4 倍频精度提升
STM32 采集方案对比
- 定时器编码器模式(推荐方案):
- 硬件自动处理正交信号
- 支持 4 倍频计数
- 计数器自动增减,无软件开销
-
最大支持定时器时钟频率

-
外部中断方式:
- 需手动判断方向
- 高频信号易丢失脉冲
- 占用 CPU 资源
- 仅建议用于低速场景(<100RPM)
HAL 库配置详解
// 定时器初始化示例(TIM3)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; // 数字滤波器
sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
sConfig.IC2Filter = 6;
HAL_TIM_Encoder_Init(&htim3, &sConfig);
// 计数器溢出处理(在中断回调中)void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM3) {overflow_count++; // 全局变量记录溢出次数}
}
典型问题解决方案
- 脉冲丢失问题(>1000RPM 时):
- 降低输入滤波器值(ICxFilter)
- 确认定时器时钟≥72MHz
-
使用 DMA 传输计数值
-
信号抖动处理:
- 硬件端增加 RC 滤波(推荐 100Ω+100pF)
-
软件端采用移动平均滤波
#define FILTER_LEN 5 int32_t filter_buf[FILTER_LEN]; int32_t moving_avg(int32_t new_val) { static uint8_t idx = 0; filter_buf[idx++] = new_val; if(idx >= FILTER_LEN) idx = 0; int64_t sum = 0; for(uint8_t i=0; i<FILTER_LEN; i++) {sum += filter_buf[i]; } return sum/FILTER_LEN; } -
电源干扰对策:
- 编码器供电独立 LDO(如 AMS1117-3.3)
- 信号线使用双绞线
- 添加 TVS 二极管(SMAJ5.0A)
实测数据对比
| 转速 (RPM) | 无滤波误差 | 硬件滤波误差 | 复合滤波误差 |
|---|---|---|---|
| 300 | ±2 脉冲 | ±1 脉冲 | ±0 脉冲 |
| 800 | ±15 脉冲 | ±5 脉冲 | ±2 脉冲 |
| 1200 | 计数溢出 | ±20 脉冲 | ±8 脉冲 |
生产环境建议
- PCB 设计规范:
- 编码器信号走线等长(±5mm)
- 避免与 PWM 线平行走线
-
全程铺地屏蔽
-
校准流程:
- 机械零位校准(Z 信号触发)
- 每转脉冲数验证
- 正反转计数一致性测试
拓展思考
- 多电机同步方案:
- 使用 TIMx 级联模式
-
通过 CAN 总线同步计数器
-
绝对位置扩展:
- 结合 SSI 接口编码器
- 上电后先执行回零操作
总结
通过合理配置 STM32 的编码器接口和优化信号处理链路,520 电机在 2000RPM 范围内可实现±5 脉冲 / 转的精度。关键点在于硬件滤波参数与软件算法的协同优化,以及严格的 PCB 布线规范。建议在量产前进行至少 24 小时的老化测试,验证长期稳定性。
正文完

