共计 1818 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
AB 相编码器作为运动控制系统的 ” 眼睛 ”,通过正交脉冲反馈实时位置和速度。但在实际应用中常遇到三大难题:

- 信号毛刺 :机械振动或电磁干扰导致脉冲抖动,引发计数器误增 / 误减
- 高速漏脉冲 :当转速超过中断响应能力时,脉冲被 ” 吞掉 ” 导致速度计算失真
- 低速方向误判 :在接近零速时,因信号边沿抖动出现错误的转向判断
技术方案对比
硬件计数器模式(推荐)
- 优势
- 硬件自动处理边沿检测和方向判断
- 支持 4 倍频计数(上升沿 + 下降沿均触发)
-
不占用 CPU 资源,理论支持更高转速
-
局限
- 需要特定定时器支持(如 STM32 的 TIM1/TIM2 等)
- 无法直接获取速度值,需定期采样计数值
GPIO 中断 + 软件解码
- 适用场景
- 编码器脉冲频率低于 10kHz
- MCU 无专用编码器接口
-
需要灵活自定义解码逻辑
-
风险点
- 高频脉冲导致 CPU 中断风暴
- 软件消抖算法增加额外延迟
STM32 硬件实现详解
CubeMX 配置步骤
- 打开 TIMx 的 ”Encoder Mode”
- 设置 IC1/IC2 映射到对应引脚
- 配置滤波器参数(通常 4 - 8 个时钟周期)
- 开启计数器溢出中断(可选)
关键配置代码片段:
// TIM2 Encoder Interface Configuration
henc.Instance = TIM2;
henc.Init.Period = 0xFFFF; // 16 位计数器
henc.Init.CounterMode = TIM_COUNTERMODE_UP;
henc.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
HAL_TIM_Encoder_Init(&henc, TIM_ENCODERMODE_TI12); // 双通道模式
速度计算算法
volatile int32_t g_encoder_count = 0;
// 每 10ms 执行的速度计算任务
void Speed_Calculation(void) {
static int32_t last_count = 0;
int32_t delta = g_encoder_count - last_count;
last_count = g_encoder_count;
// 公式:速度 (rpm) = (delta*60000)/(ppr* 采样周期 ms)
float rpm = (delta * 60000.0f) / (ENCODER_PPR * 10);
// 一阶低通滤波
static float filtered_rpm = 0;
filtered_rpm = 0.2f * rpm + 0.8f * filtered_rpm;
}
性能优化关键点
采样周期选择
- 低速场景 (<100rpm):建议 50-100ms 采样周期
- 高速场景 (>1000rpm):建议 1 -5ms 采样周期
中断优化
- ISR 执行时间应小于脉冲间隔的 1 /3
- 避免在中断内进行浮点运算
- 关键变量必须加 volatile:
__attribute__((section(".ramfunc"))) void TIM2_IRQHandler(void) { volatile static uint32_t capture; // 中断处理代码 }
常见问题解决方案
信号消抖处理
- 硬件方案 :在 AB 相线上并联 100pF 电容,串联 100Ω 电阻
- 软件方案 :连续 3 次采样一致才判定有效边沿
低速方向锁定
// 当速度低于阈值时保持上次方向
if(fabsf(filtered_rpm) < 5.0f) {delta = (last_direction == POSITIVE) ? 1 : -1;
} else {last_direction = (delta > 0) ? POSITIVE : NEGATIVE;
}
中断冲突预防
- 编码器中断设为最高优先级
- 在速度计算临界区关闭中断:
__disable_irq(); // 临界区操作 __enable_irq();
扩展应用:Z 相零位校准
- 配置 Z 相为外部中断
- 在中断内重置计数器:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {if(GPIO_Pin == Z_PHASE_PIN) {__HAL_TIM_SET_COUNTER(&htim2, 0); g_home_position_flag = 1; } }
实测数据参考
| 转速 (rpm) | 硬件计数误差 | 软件解码误差 |
|---|---|---|
| 50 | ±0.1% | ±1.2% |
| 1000 | ±0.3% | ±5.8% |
| 3000 | ±0.5% | 脉冲丢失 |
总结建议
对于大多数工业应用,优先选用硬件编码器接口。当遇到信号质量问题时可结合本文的软硬件抗干扰方案。下一步可研究增量式编码器的动态补偿算法,进一步提升高速场景下的测量精度。
正文完
