STM32实战:AB编码器的原理与高效驱动实现

1次阅读
没有评论

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

image.webp

背景痛点

在电机控制、位置检测等嵌入式应用中,AB 编码器的稳定读取直接影响系统性能。常见问题包括:

  • 信号抖动 :机械振动或电磁干扰导致边沿误触发
  • 计数丢失 :高速旋转时因处理延迟错过脉冲
  • CPU 占用高 :轮询方式占用大量计算资源

技术方案对比

方案 优点 缺点
外部中断 +GPIO 轮询 无需专用硬件 高频信号下 CPU 负载极高
定时器输入捕获 可测量脉冲宽度 需软件实现方向判断
专用编码器接口 (TIM) 硬件自动处理正交信号 需特定定时器资源

硬件配置(STM32CubeMX)

  1. 启用 TIMx 的 Encoder Mode
  2. 设置 TI1/TI2 引脚为浮空输入
  3. 配置滤波器参数(示例值:IC1F=0x04)
  4. 开启计数器自动重装载(ARR=65535)
// 编码器初始化示例(HAL 库)TIM_Encoder_InitTypeDef sConfig = {0};
sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
sConfig.IC1Filter = 4;  // 4 个时钟周期滤波
// 重复类似配置给 IC2...
HAL_TIM_Encoder_Init(&htim3, &sConfig);

4 倍频计数原理

  • 正转时 :TI1 上升沿与 TI2 为低电平 → 计数 +1
  • 反转时 :TI1 上升沿与 TI2 为高电平 → 计数 -1
  • 通过两路信号的 90°相位差实现方向识别

STM32 实战:AB 编码器的原理与高效驱动实现

DMA 优化实现

// DMA 循环读取计数器值
HAL_TIM_Base_Start_DMA(&htim3, (uint32_t*)&encoder_raw, 1);

// 中断回调处理
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM3)
  {int16_t delta = __HAL_TIM_GET_COUNTER(htim) - last_count;
    position += delta;  // 原子操作避免数据撕裂
    last_count += delta;
  }
}

抗干扰设计要点

  1. PCB 布局
  2. 信号线走等长差分对
  3. 远离 PWM 等高频信号线

  4. 电源处理

  5. 编码器供电加 π 型滤波
  6. 模拟地与数字地单点连接

  7. 长线传输

  8. 终端匹配 120Ω 电阻
  9. 使用双绞屏蔽线(如 CAT5)

性能测试数据

滤波参数 100RPM 误差 CPU 占用率
ICxF=0 ±3 脉冲 18%
ICxF=4 ±1 脉冲 5%
ICxF=15 ±0 脉冲 3%

扩展思考

实现多编码器同步采样可考虑:

  1. 使用 TIM 主从模式触发 ADC 采样
  2. 通过硬件同步信号连接各编码器
  3. 在定时器溢出中断中批量读取计数值

结语

通过合理配置 STM32 的硬件编码器接口,配合 DMA 和滤波参数优化,可构建鲁棒性强、CPU 占用低的 AB 编码器采集系统。实际应用中还需根据机械结构特性调整安装位置,减少径向跳动带来的信号抖动。

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