高精度运动控制实战:AB相增量式霍尔编码器的信号处理与抗干扰方案

1次阅读
没有评论

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

image.webp

背景与痛点

在工业自动化和机器人控制领域,AB 相增量式霍尔编码器(AB-Phase Incremental Hall Encoder)因其结构简单、成本低廉而被广泛应用。但在实际环境中,电磁噪声(EMI)、机械振动等因素会导致信号抖动(Signal Jitter),表现为:

高精度运动控制实战:AB 相增量式霍尔编码器的信号处理与抗干扰方案

  • 脉冲丢失(Missing Pulse):导致位置累计误差
  • 脉冲增生(False Pulse):引发速度计算异常
  • 相位偏移(Phase Shift):造成方向误判

解决方案对比

1. 硬件 RC 滤波

  • 优点:实时性强,不占用 CPU 资源
  • 缺点:截止频率固定,高频噪声抑制有限

2. 软件滑动窗口滤波

  • 优点:灵活调整窗口大小,适应不同噪声环境
  • 缺点:引入约 1 个采样周期的延迟

3. 卡尔曼滤波

  • 优点:最优估计,适合非线性系统
  • 缺点:计算复杂度高(O(n²)),需浮点运算

核心实现方案

STM32 正交编码器配置

// 使用 TIM2 作为编码器接口
void Encoder_Init(void) {TIM_Encoder_InitTypeDef sConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 0;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 0xFFFF; // 16 位计数器
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  sConfig.EncoderMode = TIM_ENCODERMODE_TI12; // AB 相正交模式
  sConfig.IC1Polarity = TIM_ICPOLARITY_RISING; 
  sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
  sConfig.IC1Prescaler = TIM_ICPSC_DIV1; // 无分频
  sConfig.IC1Filter = 6; // 设置输入滤波器 (0~15)
  // 相同配置应用于 IC2...
  HAL_TIM_Encoder_Init(&htim2, &sConfig);
  HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
}

带迟滞判别的软件去抖

// 时间复杂度 O(1) 的窗口滤波
#define DEBOUNCE_THRESHOLD 3
uint8_t debounce_counter_A = 0;

bool Get_Filtered_A_State(void) {
  static bool last_state = 0;
  bool current_state = HAL_GPIO_ReadPin(ENC_A_GPIO_Port, ENC_A_Pin);

  if(current_state != last_state) {
    debounce_counter_A++;
    if(debounce_counter_A >= DEBOUNCE_THRESHOLD) {
      last_state = current_state;
      debounce_counter_A = 0;
      return current_state; // 确认状态变化
    }
  } else {debounce_counter_A = 0;}
  return last_state; // 维持原状态
}

避坑指南

  1. 中断优化
  2. 将信号边沿触发改为定时采样(如 100us)
  3. 避免在中断内进行浮点运算

  4. 多电机防护

  5. 为每个编码器分配独立 TIM 资源
  6. 采用屏蔽双绞线,线长不超过 1.5 米

  7. 机械补偿

  8. 通过零点校准消除安装偏差
  9. 使用线性插值补偿非线性误差

验证数据

指标 原始信号 处理后信号
误脉冲率 12.7% 0.8%
位置误差 (1m) ±3.2mm ±1.5mm

延伸思考

本方案可移植到 ESP32 的 PCNT 模块(Pulse Counter),需注意:
– ESP32 的 PCNT 具有 8 个独立通道
– 内置 16 位滤波计数器
– 支持设置高低阈值触发中断

通过组合硬件滤波和软件算法,我们实现了位置误差降低 50% 的目标。读者可根据具体应用场景调整滤波器参数,在实时性和稳定性之间取得平衡。

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