从零开始理解AB相增量式霍尔编码器:原理、实现与避坑指南

1次阅读
没有评论

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

image.webp

背景痛点:为什么需要编码器?

在电机控制系统中,精确的位置和速度反馈是闭环控制的基础。AB 相增量式霍尔编码器因其结构简单、成本低廉、抗污染能力强等优点,成为中小型电机的主流选择。但新手常遇到以下问题:

从零开始理解 AB 相增量式霍尔编码器:原理、实现与避坑指南

  • 信号抖动:机械振动导致 AB 相出现毛刺,引发误计数
  • 计数丢失:高速旋转时 MCU 来不及处理所有脉冲边沿
  • 方向误判:未正确处理 AB 相 90°相位差逻辑
  • 电源干扰:电机启停导致编码器供电波动,产生错误信号

原理解析:AB 相信号的秘密

增量式编码器输出两路正交方波(A 相和 B 相),其相位关系携带方向信息:

  1. 正向旋转 时 A 相领先 B 相 90°(电气角度)
  2. 反向旋转 时 B 相领先 A 相 90°

通过检测边沿顺序即可判断方向。典型信号波形如下(示波器实测):

 A 相: __|‾‾|__|‾‾|__|‾‾|__
B 相: ____|‾‾|__|‾‾|__|‾‾|
      ↑ 正向旋转时边沿顺序

硬件设计:打造稳定信号链路

推荐电路架构

编码器 → 光电隔离 → RC 滤波 → 施密特触发器 → MCU

关键设计要点

  1. 光电隔离:采用 HCPL-2631 等高速光耦,隔离电机与逻辑电路
  2. VCC1 接编码器 5V 电源
  3. VCC2 接 MCU 的 3.3V 电源

  4. 电源去耦:每个 IC 的 VCC 引脚就近放置 0.1μF 陶瓷电容

  5. 信号滤波

  6. 推荐值:R=100Ω,C=100pF(截止频率约 16MHz)
  7. 注意电容值过大会导致边沿变缓

软件实现:STM32 实战代码

定时器编码器模式配置

// TIM3 初始化(STM32CubeIDE 生成)void MX_TIM3_Init(void)
{TIM_Encoder_InitTypeDef sConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 0;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 65535; // 16 位计数器最大值
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

  // 编码器模式配置
  sConfig.EncoderMode = TIM_ENCODERMODE_TI12; // 双通道模式
  sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
  sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
  sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
  sConfig.IC1Filter = 6; // 8 个时钟周期的滤波

  sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
  sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
  sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
  sConfig.IC2Filter = 6;

  HAL_TIM_Encoder_Init(&htim3, &sConfig);

  // 启动编码器接口
  HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
}

位置读取与方向判断

int32_t GetEncoderPosition(void)
{
  static uint16_t last_count = 0;
  static int32_t total_count = 0;

  uint16_t curr_count = TIM3->CNT;
  int16_t delta = (int16_t)(curr_count - last_count);

  // 处理计数器溢出
  if(delta > 32767) delta -= 65536;
  else if(delta < -32768) delta += 65536;

  total_count += delta;
  last_count = curr_count;

  return total_count;
}

性能优化:精度与速度的平衡

采样频率选择

转速(rpm) 线数 脉冲频率 推荐采样频率
3000 500 25kHz ≥100kHz
6000 1000 100kHz ≥400kHz

方案对比

  1. 中断方式
  2. 优点:实现简单
  3. 缺点:高速时可能丢失脉冲

  4. DMA 方式

  5. 优点:不占用 CPU 资源
  6. 缺点:需要更多存储空间

避坑指南:前人踩过的 5 个坑

  1. 机械安装偏差
  2. 症状:低速时计数不稳定
  3. 解决:保证编码器与轴同心度 <0.1mm

  4. 信号延迟不对称

  5. 症状:正反转计数不一致
  6. 解决:确保 AB 相走线等长

  7. 电源干扰

  8. 症状:电机启动时出现乱码
  9. 解决:编码器电源单独稳压

  10. 软件滤波过度

  11. 症状:高速时计数滞后
  12. 解决:动态调整滤波器参数

  13. 忽略归零处理

  14. 症状:断电后位置丢失
  15. 解决:增加 Z 相参考信号

扩展思考:从能用走向好用

掌握了基础计数功能后,可以尝试:

  1. 速度计算
  2. 方法:M 法测速(固定时间测脉冲数)
  3. 优化:T 法测速(测量脉冲周期)

  4. 位置校准

  5. 方案:利用限位开关建立物理零点
  6. 进阶:电池备份的绝对位置记忆

  7. 故障诊断

  8. 检测:AB 相信号丢失告警
  9. 保护:异常状态自动停机

通过本文介绍的方法,读者应能构建稳定的编码器信号处理系统。实际应用中还需结合具体场景调整参数,建议先用示波器观察原始信号质量,再逐步优化软硬件设计。

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