共计 1695 个字符,预计需要花费 5 分钟才能阅读完成。
编码器测速基础原理
-
AB 相编码器工作原理
增量式编码器通过 A、B 两相输出相位差 90°的方波信号。每转产生的脉冲数(PPR)决定分辨率,例如 500 线编码器每转输出 500 个脉冲。正转时 A 相领先 B 相 90°,反转时 B 相领先 A 相 90°。
-
测速核心逻辑
- 脉冲计数法 :统计固定时间内的脉冲数,适用于低速场景
- 周期测量法 :测量相邻脉冲的时间间隔,适合高速场景
- 混合模式 :STM32 定时器的编码器模式可同时实现计数和方向检测
方案对比:定时器 vs 外部中断
- 定时器编码器模式(推荐)
- 硬件自动处理双沿计数,不占用 CPU 资源
- 自带方向判断逻辑,抗干扰能力强
-
最高支持 72MHz 计数频率(STM32F4)
-
外部中断方案
- 需要手动处理双相跳变沿
- 高频脉冲下易丢失中断
- 代码复杂度高,适合低分辨率编码器
HAL 库代码实现
定时器配置(以 TIM3 为例)
// 初始化代码片段
TIM_Encoder_InitTypeDef encoder_config = {0};
encoder_config.EncoderMode = TIM_ENCODERMODE_TI12; // 双相计数模式
encoder_config.IC1Polarity = TIM_ICPOLARITY_RISING;
encoder_config.IC1Selection = TIM_ICSELECTION_DIRECTTI;
encoder_config.IC1Prescaler = TIM_ICPSC_DIV1;
encoder_config.IC1Filter = 6; // 设置输入滤波 (0-15)
HAL_TIM_Encoder_Init(&htim3, &encoder_config);
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
速度计算公式
// 每 100ms 采样周期计算转速 (RPM)
int32_t get_rpm(TIM_HandleTypeDef *htim, uint16_t ppr) {
static int32_t last_count = 0;
int32_t current_count = (int32_t)htim->Instance->CNT;
int32_t delta = current_count - last_count;
last_count = current_count;
// 公式:转速 = (Δ 脉冲数 × 60000) / (PPR × 采样周期 ms)
return (delta * 60000) / (ppr * 100);
}
方向判断优化
// 通过 TIMx->CR1.DIR 位获取方向
#define IS_REVERSE(htim) ((htim)->Instance->CR1 & TIM_CR1_DIR)
性能优化实战技巧
- 高转速溢出处理
- 启用定时器溢出中断,在中断中维护 32 位计数器
-
示例代码:
// 在中断回调中扩展计数范围 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {if(htim == &htim3) {overflow_count += (htim->Instance->CR1 & TIM_CR1_DIR) ? -65536 : 65536; } } -
硬件消抖设计
- 推荐 RC 滤波参数:R=1kΩ, C=100nF(截止频率≈1.6kHz)
-
高速场景可改用施密特触发器 (如 74HC14)
-
采样周期选择
- 低速 (<100RPM):建议 500ms-1s
- 中速 (100-3000RPM):100-200ms
- 高速 (>3000RPM):10-50ms
避坑指南
- 接线错误
- A/ B 相接反会导致方向检测错误
-
未接上拉电阻时可能产生毛刺
-
电源干扰
- 编码器电源与电机电源分离
-
示波器实测电压纹波应 <5%
-
机械安装
- 联轴器偏心会导致低速抖动
- 推荐使用弹性联轴器(如梅花联轴器)
扩展思考
- 位置闭环实现
- 累计脉冲数作为位置反馈
-
结合 PID 算法输出 PWM 控制
-
不同线数适配
- 高 PPR 编码器需降低采样频率
-
低 PPR 编码器建议改用 M 法测速
-
进阶优化方向
- 添加卡尔曼滤波平滑速度曲线
- 使用 DMA 传输计数数据减少 CPU 干预
实际项目中遇到过编码器信号被变频器干扰的情况,最终通过加装磁环和改用屏蔽双绞线解决。建议大家在设计初期就考虑好电磁兼容性问题。
正文完
发表至: 未分类
近一天内

