AB相编码器原理深度解析:从信号处理到实际应用

1次阅读
没有评论

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

image.webp

背景与痛点

在伺服控制系统中,AB 相编码器(Quadrature Encoder)如同设备的 ” 眼睛 ”,实时反馈电机转子的位置和速度。这种增量式编码器通过两路相位差 90°的方波信号(A 相和 B 相),既能计数脉冲数量,又能通过相位关系判断旋转方向。但在实际开发中,工程师们常遇到三大难题:

  • 信号抖动问题 :机械振动或电气干扰导致脉冲边沿出现毛刺
  • 方向误判 :高速旋转时因信号延迟造成相位关系误读
  • 计数溢出 :长时间运行导致 32 位计数器不够用

正交解码原理

  1. 基础时序分析
    当编码器顺时针旋转时,A 相信号上升沿对应 B 相高电平;逆时针时则对应 B 相低电平。这种相位差是方向判定的核心依据。

AB 相编码器原理深度解析:从信号处理到实际应用
(图示:A 相黄色,B 相蓝色,虚线标注关键采样点)

  1. 状态机实现
    将 AB 相信号的四种组合(00,01,11,10)定义为状态,通过状态转移表实现方向判断:
当前状态 下一状态 方向判定
00 01 CW
01 11 CW
11 10 CW
10 00 CW
(反向旋转时状态转移顺序相反)

硬件设计要点

  • RC 消抖电路
    典型参数选择:R=1kΩ,C=100nF,时间常数 τ =RC=100μs。该配置可滤除 <10μs 的抖动。
 A 相 ——/\/\/\——||——→ MCU
       1kΩ   100nF
  • ESD 保护
    在信号线对地并联 TVS 二极管(如 SMAJ5.0A),防止静电损坏 IO 口。

软件实现(STM32 示例)

中断服务函数

// 使用 STM32CubeMX 配置 GPIO 上升沿 / 下降沿双沿触发
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
  static uint8_t last_state = 0;
  uint8_t new_state = (HAL_GPIO_ReadPin(GPIOB, A_Pin) << 1) 
                     | HAL_GPIO_ReadPin(GPIOB, B_Pin);

  // 状态转移判断
  if((last_state == 0x00 && new_state == 0x01) ||
     (last_state == 0x01 && new_state == 0x03) ||
     (last_state == 0x03 && new_state == 0x02) ||
     (last_state == 0x02 && new_state == 0x00)) {position++;} else {position--;}
  last_state = new_state;
}

原子操作处理

__IO int32_t position; // 使用 volatile 修饰

// 在中断和主循环中访问时
uint32_t get_safe_position(void) {__disable_irq();
  int32_t tmp = position;
  __enable_irq();
  return tmp;
}

性能优化技巧

  1. 中断响应测试
    用 IO 口翻转法测量中断延迟:

HAL_GPIO_WritePin(TEST_PIN, GPIO_PIN_SET);
// 中断服务函数内立即清除
HAL_GPIO_WritePin(TEST_PIN, GPIO_PIN_RESET);

用示波器测量脉冲宽度即为中断延迟时间。

  1. 高速计数方案
  2. 启用 TIM 编码器接口模式(硬件正交解码)
  3. 定时器溢出中断中更新全局计数器:

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {if(htim->Instance == ENCODER_TIM) {overflow_cnt += (htim->Instance->CR1 & TIM_CR1_DIR) ? -1 : 1;
      }
    }

避坑指南

  • GPIO 配置陷阱
    必须设置输入模式为浮空输入(GPIO_NOPULL),上拉电阻会改变信号边沿时间。

  • 软件消抖参数
    采样周期应大于 3 倍 RC 时间常数,但小于最小有效脉冲宽度。例如:

  • 机械编码器:建议 10-100μs 采样间隔
  • 光电编码器:可缩短至 1 -10μs

  • 多轴同步
    给不同编码器分配不同优先级,确保高转速轴的中断能抢占:

    HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 0); // 主轴高优先级
    HAL_NVIC_SetPriority(EXTI1_IRQn, 2, 0); // 从轴低优先级 

进阶思考

如何利用 Z 相(零位信号)实现绝对位置校准?提示:
1. 在 Z 脉冲到来时重置计数器
2. 结合 EEPROM 存储多圈信息
3. 使用窗口比较法消除震荡带来的多次触发

建议用 Saleae 逻辑分析仪捕获 ABZ 三相波形,实测信号质量与软件处理效果。

实践心得

经过多个伺服项目的验证,这套方案在 3000RPM 转速下仍能稳定工作。关键点在于硬件消抖与软件状态的协同处理,就像给编码器信号上了 ” 双保险 ”。下次遇到计数漂移问题时,不妨先检查 RC 参数是否与转速匹配,这往往能节省大量调试时间。

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