AB双相霍尔编码器原理剖析与嵌入式开发实战

1次阅读
没有评论

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

image.webp

背景痛点

在电机控制和工业自动化领域,AB 双相霍尔编码器(AB-phase Hall Encoder)是位置检测的关键部件。但实际开发中常遇到几个典型问题:

AB 双相霍尔编码器原理剖析与嵌入式开发实战

  • 信号抖动(Signal Bounce):机械振动或电磁干扰导致波形出现毛刺
  • 方向误判(Direction Misjudgment):转速突变时软件逻辑错误识别旋转方向
  • 低速检测失效(Low-speed Failure):转速低于采样频率时丢失脉冲

这些问题直接影响伺服系统的定位精度,例如在 3D 打印机送料控制中,方向误判会导致挤出机反向运动引发堵料故障。

原理对比

单相编码 vs 正交编码

  1. 单相编码(Single-phase Encoding)
  2. 仅通过脉冲数量计算位移
  3. 无法判断旋转方向
  4. 典型应用:老式光电鼠标滚轮

  5. 正交编码(Quadrature Encoding)

  6. AB 两路信号相位差 90°(如图 1 时序图)
     A 相: _|‾|_|‾|_|‾
    B 相: ‾|_|‾|_|‾|_
  7. 通过相位关系判断方向(A 领先 B 为正转,反之为反转)
  8. 四倍频计数提升分辨率

硬件设计

信号调理电路(Signal Conditioning)

推荐使用施密特触发器(Schmitt Trigger)消除抖动,典型电路如图 2:

          +5V
           |
           R1
           |
A 相 ——||——+——> 到 MCU
      C1   R2
           |
          GND

参数计算
– 截止频率公式:f_c=1/(2πRC)
– 示例:当 R1=10kΩ, C1=100nF 时,f_c≈159Hz(适合转速 <1000RPM 场景)

代码实现(STM32 HAL 库)

初始化编码器模式

// 使用 TIM3 的通道 1 / 2 作为 AB 相输入
TIM_Encoder_InitTypeDef encoder = {
  .EncoderMode = TIM_ENCODERMODE_TI12, // 正交编码模式
  .IC1Filter = 6,       // 输入滤波 (0x0-0xF)
  .IC1Polarity = TIM_ICPOLARITY_RISING, 
  .IC2Polarity = TIM_ICPOLARITY_RISING
};
HAL_TIM_Encoder_Init(&htim3, &encoder);
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);

方向判断状态机

// 在定时器溢出中断中处理
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
  static uint8_t last_state = 0;
  uint8_t curr_state = (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC1) ? 1 : 0) 
                     | (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC2) ? 2 : 0);

  // 状态转移表
  const int8_t state_table[4][4] = {{ 0, +1, -1, 0},  // 00 -> 00,01,10,11
    {-1,  0,  0, +1},
    {+1,  0,  0, -1},
    {0, -1, +1, 0}
  };

  position += state_table[last_state][curr_state];
  last_state = curr_state;
}

性能优化

软件去抖算法对比

方法 响应延迟 CPU 占用 适用场景
查表法 低速高精度
移动平均滤波 高速抗干扰

推荐在中断中使用查表法:

// 预定义有效状态转移(抑制毛刺)const uint8_t valid_transitions[4] = {
  0b0001 | 0b0010,  // 00 只能转 01 或 10
  0b0000 | 0b0011,
  0b0000 | 0b0011,
  0b0010 | 0b0001
};

避坑指南

  1. 长线传输畸变
  2. 问题现象:AB 相出现振铃(Ringing)
  3. 解决方案:在编码器端并联 120Ω 终端电阻

  4. 电源噪声干扰

  5. 问题现象:静止时计数器仍跳动
  6. 解决方案:给编码器单独供电并添加 LC 滤波

  7. 机械安装偏差

  8. 问题现象:高速时丢失脉冲
  9. 解决方案:确保编码盘与轴同心度 <0.1mm

验证方法

使用 Saleae 逻辑分析仪抓取波形时注意:

  1. 同时捕获 AB 相和 MCU 的 DIR 方向信号
  2. 检查正转 / 反转时的相位关系
  3. 突然反转时观察方向信号响应时间

思考题

如何扩展实现零速位置保持功能?

(提示:结合 TIM 的刹车功能和外部比较器)

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