STM32电机编码器测速代码实现与避坑指南

1次阅读
没有评论

共计 1695 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

编码器测速基础原理

  1. AB 相编码器工作原理
    增量式编码器通过 A、B 两相输出相位差 90°的方波信号。每转产生的脉冲数(PPR)决定分辨率,例如 500 线编码器每转输出 500 个脉冲。正转时 A 相领先 B 相 90°,反转时 B 相领先 A 相 90°。

    STM32 电机编码器测速代码实现与避坑指南

  2. 测速核心逻辑

  3. 脉冲计数法 :统计固定时间内的脉冲数,适用于低速场景
  4. 周期测量法 :测量相邻脉冲的时间间隔,适合高速场景
  5. 混合模式 :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)

性能优化实战技巧

  1. 高转速溢出处理
  2. 启用定时器溢出中断,在中断中维护 32 位计数器
  3. 示例代码:

    // 在中断回调中扩展计数范围
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {if(htim == &htim3) {overflow_count += (htim->Instance->CR1 & TIM_CR1_DIR) ? -65536 : 65536;
      }
    }

  4. 硬件消抖设计

  5. 推荐 RC 滤波参数:R=1kΩ, C=100nF(截止频率≈1.6kHz)
  6. 高速场景可改用施密特触发器 (如 74HC14)

  7. 采样周期选择

  8. 低速 (<100RPM):建议 500ms-1s
  9. 中速 (100-3000RPM):100-200ms
  10. 高速 (>3000RPM):10-50ms

避坑指南

  • 接线错误
  • A/ B 相接反会导致方向检测错误
  • 未接上拉电阻时可能产生毛刺

  • 电源干扰

  • 编码器电源与电机电源分离
  • 示波器实测电压纹波应 <5%

  • 机械安装

  • 联轴器偏心会导致低速抖动
  • 推荐使用弹性联轴器(如梅花联轴器)

扩展思考

  1. 位置闭环实现
  2. 累计脉冲数作为位置反馈
  3. 结合 PID 算法输出 PWM 控制

  4. 不同线数适配

  5. 高 PPR 编码器需降低采样频率
  6. 低 PPR 编码器建议改用 M 法测速

  7. 进阶优化方向

  8. 添加卡尔曼滤波平滑速度曲线
  9. 使用 DMA 传输计数数据减少 CPU 干预

实际项目中遇到过编码器信号被变频器干扰的情况,最终通过加装磁环和改用屏蔽双绞线解决。建议大家在设计初期就考虑好电磁兼容性问题。

正文完
 0
评论(没有评论)