AB相编码器速度测量实战:从硬件连接到算法优化

1次阅读
没有评论

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

image.webp

背景痛点

AB 相编码器在工业控制中广泛应用,但在实际使用中常遇到以下问题:

AB 相编码器速度测量实战:从硬件连接到算法优化

  • 信号抖动问题 :在高速旋转时,信号边沿容易产生毛刺,导致误计数
  • 低速测量不准 :传统脉冲计数法在低速时分辨率不足
  • 方向误判 :当 AB 相信号存在相位偏移时,可能出现方向误判

常见的速度测量方法对比:

  1. 脉冲计数法 :适用于中高速场景,低速时误差大
  2. T 法 :通过测量脉冲周期计算速度,适合低速但高速时精度下降
  3. M- T 法 :结合脉冲计数和时间测量,全速度范围内精度较高

硬件设计

STM32 定时器配置

使用 STM32 的编码器接口模式,关键配置如下:

// TIM3 编码器模式配置
TIM_Encoder_InitTypeDef sEncoderConfig = {0};
sEncoderConfig.EncoderMode = TIM_ENCODERMODE_TI12;
sEncoderConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
sEncoderConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
sEncoderConfig.IC1Prescaler = TIM_ICPSC_DIV1;
sEncoderConfig.IC1Filter = 0x0F;  // 设置滤波器
// 类似配置 IC2...
HAL_TIM_Encoder_Init(&htim3, &sEncoderConfig);

信号调理电路

  • 施密特触发器 :使用 74HC14 整形信号
  • RC 滤波 :推荐 100Ω 电阻 +100nF 电容组成低通滤波器
  • 抗干扰布线
  • 使用双绞线传输信号
  • 信号线远离电源线
  • 必要时增加屏蔽层

核心算法

四倍频解码实现

利用 AB 相的上升沿和下降沿实现 4 倍频:

// 在定时器中断中处理
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    static int32_t last_count = 0;
    int32_t current_count = TIM3->CNT;
    int32_t delta = current_count - last_count;

    // 处理计数器溢出
    if(delta > ENCODER_MAX/2) delta -= ENCODER_MAX;
    else if(delta < -ENCODER_MAX/2) delta += ENCODER_MAX;

    total_pulses += delta;
    last_count = current_count;
}

速度计算公式

转速计算公式(单位:rpm):

 转速 = (脉冲数 × 60) / (编码器线数 × 4 × 采样时间)

其中:
– 脉冲数:测量周期内捕获的脉冲数
– 编码器线数:编码器每转输出的脉冲数
– 4:四倍频系数
– 采样时间:单位为秒

性能优化

中断服务函数优化

  • 只做必要的最小操作
  • 避免在中断中进行浮点运算
  • 使用原子操作更新共享变量

DMA 方案

配置定时器通过 DMA 自动传输计数值:

// DMA 配置示例
__HAL_LINKDMA(&htim3, hdma[TIM_DMA_ID_CC1], hdma_tim3_ch1);
HAL_DMA_Start_IT(&hdma_tim3_ch1, (uint32_t)&TIM3->CNT, (uint32_t)&encoder_buffer, 1);

卡尔曼滤波应用

// 简化的卡尔曼滤波器实现
float kalman_update(float measurement) {
    static float P = 1.0, K, x = 0;
    static float Q = 0.01, R = 0.1;

    // 预测
    P = P + Q;

    // 更新
    K = P / (P + R);
    x = x + K * (measurement - x);
    P = (1 - K) * P;

    return x;
}

避坑指南

  1. 硬件连接
  2. 确保上拉电阻值合适(通常 4.7kΩ-10kΩ)
  3. 检查电源稳定性

  4. 软件防抖

  5. 推荐设置 5 -10μs 的消抖时间
  6. 可通过定时器滤波器寄存器实现

  7. 方向测试

  8. 手动旋转编码器,观察计数增减方向
  9. 测试 AB 相不同相位差下的方向判断

验证方法

  1. 示波器验证
  2. 同时观察原始信号和整形后信号
  3. 检查边沿对齐情况

  4. 阶跃响应测试

  5. 从低速突然切换到高速
  6. 观察系统响应时间和超调量

  7. 最小速度测试

  8. 缓慢旋转编码器
  9. 记录能稳定测量到的最小速度

工程资源

完整工程代码已开源:
GitHub 仓库链接

扩展阅读建议:
– STM32 参考手册编码器接口章节
–《电机控制中的编码器应用》
– 卡尔曼滤波在测量中的应用论文

通过以上方案,我们成功实现了 AB 相编码器在 0.1-5000rpm 范围内的精确速度测量,测量误差小于 0.5%。实际应用中,还需要根据具体场景调整参数,但核心思路和框架具有通用性。

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