共计 1871 个字符,预计需要花费 5 分钟才能阅读完成。
背景与痛点
在嵌入式开发中,CCS 编码器(增量式光电编码器)常用于电机转速、位置测量等场景。但新手常遇到以下问题:

- 信号干扰:工业环境中的电磁干扰易导致脉冲计数错误
- 测速精度不足:低速时分辨率差,高速时计数器溢出
- 实时性差:传统轮询方式占用 CPU 资源过高
- 配置复杂:不同型号编码器的 PPR(每转脉冲数)参数差异大
技术解析
CCS 编码器通过 A / B 两相正交脉冲输出信号,其测速核心原理是:
- 方向判定:A 相与 B 相信号的相位差决定旋转方向
- 脉冲计数:每个有效边沿触发计数器增减
- 速度计算:单位时间内的计数值换算为转速(RPM)
典型信号时序:
A 相: __|‾‾|__|‾‾|__
B 相: ____|‾‾|__|‾‾| (B 滞后 A→正转)
方案对比
| 方法 | 精度 | CPU 占用 | 适用场景 |
|---|---|---|---|
| 硬件定时器法 | ★★★★ | ★★ | 高速 / 高精度场合 |
| 外部中断法 | ★★★ | ★★★★ | 低速简单应用 |
| 软件循环轮询法 | ★★ | ★★★★★ | 仅限原型验证 |
硬件定时器法 最优选,因其:
- 自动捕获脉冲边沿
- 支持方向检测
- 可配置滤波消除抖动
代码实现(STM32 HAL 库示例)
// 1. 定时器初始化
void Encoder_Init(TIM_HandleTypeDef *htim) {TIM_Encoder_InitTypeDef config = {0};
config.EncoderMode = TIM_ENCODERMODE_TI12; // 双通道模式
config.IC1Polarity = TIM_ICPOLARITY_RISING;
config.IC2Polarity = TIM_ICPOLARITY_RISING;
config.IC1Filter = 6; // 4μs 滤波(假设时钟 72MHz)
config.IC2Filter = 6;
HAL_TIM_Encoder_Init(htim, &config);
HAL_TIM_Encoder_Start(htim, TIM_CHANNEL_ALL);
}
// 2. 速度计算
float Get_Speed_RPM(TIM_HandleTypeDef *htim, uint16_t ppr, float sample_time) {
static int32_t last_count = 0;
int32_t curr_count = (int32_t)htim->Instance->CNT;
int32_t delta = curr_count - last_count;
// 处理计数器溢出(假设 16 位定时器)
if(delta > 32767) delta -= 65536;
else if(delta < -32768) delta += 65536;
last_count = curr_count;
return (delta * 60.0f) / (ppr * sample_time); // RPM = (Δcount/ 采样时间)*60/PPR
}
关键点说明:
TIM_ENCODERMODE_TI12模式可自动处理正交信号- 滤波器值根据实际噪声调整(0-15 对应不同时间常数)
- 必须处理计数器溢出(特别是 16 位定时器)
性能优化
提升低速精度
- 增加采样时间:低速时延长采样周期(如 500ms)
- 使用 X4 计数模式:统计所有边沿(需配置为
TIM_ENCODERMODE_TI12)
提高高速稳定性
- 自动重载优化:
htim3.Init.Period = 0xFFFF; // 16 位最大值 - DMA 传输计数值:避免频繁 CPU 中断
抗干扰措施
- 硬件:增加 RC 滤波电路(典型值:R=1kΩ, C=100nF)
- 软件:启用定时器输入滤波(如前文 IC1Filter 参数)
避坑指南
常见问题 1:转速跳动大
- 检查项:
- 编码器电源电压是否稳定(建议 5V±5%)
- 信号线是否使用双绞线
- 接地是否良好(推荐单点接地)
常见问题 2:方向检测错误
- 解决方案:
// 添加方向校验 if(htim->Instance->CR1 & TIM_CR1_DIR) {delta = -delta; // 当前为逆向计数}
常见问题 3:低速时零值
- 对策:启用定时器的溢出中断,统计微小位移
HAL_TIM_RegisterCallback(&htim3, HAL_TIM_PERIOD_ELAPSED_CB_ID, Timer_Overflow_IRQ);
实践建议
- 进阶学习:
- 研究 STM32 的编码器接口文档(参考 RM0008 手册)
-
尝试 Z 相(零位信号)的归零应用
-
扩展优化:
- 结合 PID 实现闭环控制
-
移植到 RTOS 实现多任务测速
-
调试技巧:
- 用逻辑分析仪抓取 AB 相信号波形
- 使用 STM32CubeMonitor 实时观测计数值
通过上述方法,我们项目中的编码器测速误差从±5% 降低到±0.2%。关键是要根据实际场景灵活调整滤波参数和采样周期,必要时做非线性校准。
正文完
