ABZ编码器测速入门指南:从原理到实战避坑

1次阅读
没有评论

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

image.webp

ABZ 编码器在工业控制中的应用

ABZ 编码器是工业自动化中常见的转速 / 位置传感器,广泛用于伺服电机控制、CNC 机床、机器人关节等场景。其核心功能是将机械运动转化为电信号,通过 A / B 两相正交脉冲和 Z 相索引信号,实现高精度运动检测。

  • 典型应用场景
  • 伺服电机闭环控制中的速度反馈
  • 传送带物料定位
  • 机械臂关节角度测量

  • 测速重要性

  • 直接影响运动控制系统的动态响应
  • 精度不足会导致定位偏差或速度波动
  • 工业场景要求测速误差通常小于 0.1%

技术原理详解

ABZ 信号特征

ABZ 编码器输出三路信号:

  1. A/ B 相 :相位差 90°的方波(正交信号)
  2. 旋转方向判断:A 相上升沿时 B 相电平状态
  3. 每转脉冲数(PPR)决定分辨率

  4. Z 相 :每转产生一个索引脉冲

  5. 用于机械位置清零
  6. 消除累计误差的关键

ABZ 编码器测速入门指南:从原理到实战避坑
(注:此处应为 A / B 相正交波形与 Z 脉冲的位置关系示意图)

测速方法对比

1. 脉冲计数法(M 法)

  • 原理 :固定时间内统计脉冲数量
  • 优点 :低速时精度高
  • 缺点 :高速时可能丢失脉冲
  • 适用场景 :转速 <100RPM

2. 周期测量法(T 法)

  • 原理 :测量单个脉冲周期时间
  • 优点 :高速时分辨率好
  • 缺点 :低速时误差显著
  • 适用场景 :转速 >1000RPM

(注:展示两种方法在不同转速区间的误差曲线)

STM32 实战代码

TIM 编码器接口配置

// 使用 TIM3 的通道 1 / 2 接编码器 A / B 相
void Encoder_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 = 0xFFFF; // 16 位计数器
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

  // 编码器模式配置(X4 倍频)sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
  sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
  sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
  sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
  sConfig.IC1Filter = 6; // 设置数字滤波器 (参考时钟频率配置)

  // 类似配置 IC2 参数...
  HAL_TIM_Encoder_Init(&htim3, &sConfig);

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

速度计算算法

// 每 100ms 调用一次速度计算
float Get_Speed_RPM(void) {
  static uint16_t last_count = 0;
  uint16_t current_count = TIM3->CNT;
  int16_t delta = (int16_t)(current_count - last_count);

  // 考虑计数器溢出情况
  if(delta < -30000) delta += 65536;
  else if(delta > 30000) delta -= 65536;

  last_count = current_count;

  // 单位转换公式:// RPM = (Δcount * 60) / (PPR * 4 * 采样时间)
  // 假设 PPR=500, 采样时间 =0.1s
  return (delta * 60.0f) / (500 * 4 * 0.1f); 
}

性能优化策略

转速范围适配

  1. 低速优化 (<100RPM):
  2. 增大采样周期(如 500ms)
  3. 启用 TIM 的输入捕获滤波器(IC1F=0xF)

  4. 高速优化 (>3000RPM):

  5. 采用周期测量法
  6. 使用 TIM 输入捕获直接测量脉冲宽度

中断与 DMA 选型

  • 中断方式
  • 适用于单轴或低频率场景
  • 需要优化 ISR 执行时间(<5μs)

  • DMA 方式

  • 多轴系统首选
  • 配置 TIM 触发 DMA 传输计数值
  • 推荐使用循环缓冲模式

生产环境避坑指南

信号抖动处理

  • 硬件滤波
  • RC 滤波截止频率计算:
    f_c = 1/(2πRC)
    建议 f_c > 10 倍最大信号频率 
  • 典型值:R=1kΩ, C=100nF(截止频率≈1.6kHz)

  • 软件滤波

  • 移动平均滤波(窗口大小 4~8)
  • 中值滤波(适用于异常脉冲)

多轴同步采集

  1. 中断冲突解决
  2. 分配不同优先级(NVIC 分组)
  3. 关键轴使用抢占优先级

  4. 时间同步技巧

  5. 使用 TIM 从模式 + 触发输入
  6. 所有编码器共用同一个时基

计数器溢出预防

  • 32 位扩展方案
    volatile uint32_t total_count = 0;
    
    void TIM3_IRQHandler(void) {if(__HAL_TIM_GET_FLAG(&htim3, TIM_FLAG_UPDATE)) {if(TIM3->CNT > 0x7FFF) total_count += 0x10000;
        else total_count -= 0x10000;
      }
    }

进阶思考题

  1. Z 相校准实现 :如何利用 Z 相信号建立机械零点?需要考虑哪些误差因素?

  2. 高速算法优化 :当转速超过编码器最大响应频率时,有哪些间接测速方法?

  3. 编码器类型差异 :光电编码器与磁编码器在信号质量上有何区别?对应的处理策略有何不同?

结语

通过本文的实践,我们实现了从 ABZ 编码器信号采集到速度计算的全流程。实际项目中还需要注意电缆屏蔽、电源去耦等工程细节。建议先用信号发生器模拟编码器波形进行系统验证,再接入真实电机测试。对于更高精度的需求,可以考虑使用 Sin/Cos 型编码器配合专用解码芯片的方案。

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