ABZ编码器角度读取实战指南:从基础原理到避坑实践

1次阅读
没有评论

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

image.webp

ABZ 编码器基础原理

ABZ 编码器(增量式编码器)通过输出两路相位差 90°的方波信号(A/ B 相)和零位脉冲信号(Z 相)来记录旋转角度和位置。这种设计允许我们不仅测量旋转角度,还能判断旋转方向。

ABZ 编码器角度读取实战指南:从基础原理到避坑实践

  • A/ B 相信号 :两路正交方波,相位差 90°,旋转方向可通过相位领先关系判断
  • Z 相信号 :每转一圈输出一个脉冲,用于绝对位置校准
  • 分辨率 :取决于编码器线数,常见有 100-5000 线 / 转

硬件接口方案

在 STM32 上,我们有两种主要实现方式:

  1. 硬件解码(推荐)
    使用定时器的正交编码器接口模式,自动处理计数方向和脉冲累加
// STM32 HAL 库配置示例
TIM_Encoder_InitTypeDef encoderConfig = {
    .EncoderMode = TIM_ENCODERMODE_TI12,
    .IC1Polarity = TIM_ICPOLARITY_RISING,
    .IC1Selection = TIM_ICSELECTION_DIRECTTI,
    .IC1Prescaler = TIM_ICPSC_DIV1,
    .IC1Filter = 6,  // 适当滤波
    .IC2Polarity = TIM_ICPOLARITY_RISING,
    .IC2Selection = TIM_ICSELECTION_DIRECTTI,
    .IC2Prescaler = TIM_ICPSC_DIV1,
    .IC2Filter = 6
};
HAL_TIM_Encoder_Init(&htim3, &encoderConfig);
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
  1. 软件解码
    通过 GPIO 中断捕获边沿,需要自行处理计数逻辑,适合低端 MCU

信号处理与滤波

编码器信号常受噪声干扰,我们采用移动平均滤波算法:

#define FILTER_WINDOW 5

int32_t movingAverageFilter(int32_t newValue) {static int32_t buffer[FILTER_WINDOW] = {0};
    static uint8_t index = 0;
    static int32_t sum = 0;

    sum -= buffer[index];
    buffer[index] = newValue;
    sum += newValue;
    index = (index + 1) % FILTER_WINDOW;

    return sum / FILTER_WINDOW;
}

零位校准与存储

Z 相信号用于绝对位置校准,校准数据需要可靠存储:

// 带 CRC 校验的 EEPROM 存储
void saveCalibrationData(int32_t zeroPos) {uint8_t data[8];
    uint32_t crc;

    memcpy(data, &zeroPos, 4);
    crc = HAL_CRC_Calculate(&hcrc, (uint32_t *)data, 1);
    memcpy(data+4, &crc, 4);

    HAL_FLASH_Unlock();
    // EEPROM 写入操作...
    HAL_FLASH_Lock();}

常见问题与解决方案

  1. 信号振铃现象
  2. 使用双绞线传输信号
  3. 在编码器输出端添加 100Ω 终端电阻
  4. 必要时增加 RC 滤波电路(典型值:100Ω+100nF)

  5. 计数器溢出处理

    // 32 位扩展计数器实现
    volatile int64_t fullCount = 0;
    int32_t lastCount = 0;
    
    void updatePosition() {
        int32_t current = TIM3->CNT;
        int32_t delta = current - lastCount;
    
        if(delta > 0x7FFF) {  // 向下溢出
            fullCount -= 0x10000 - delta;
        } else if(delta < -0x7FFF) {  // 向上溢出
            fullCount += 0x10000 + delta;
        } else {fullCount += delta;}
    
        lastCount = current;
    }

  6. Z 脉冲丢失问题

  7. 增加硬件滤波:在 Z 相输入前加 π 型滤波器(100Ω+100nF+100Ω)
  8. 软件去抖:连续检测到 3 次有效边沿才确认 Z 脉冲

系统验证方法

  1. 时序验证
  2. 使用 J -Link Scope 或逻辑分析仪捕获 ABZ 信号
  3. 确认 A / B 相 90°相位差和 Z 脉冲位置

  4. 角度标定

  5. 使用激光测距仪或高精度转台作为基准
  6. 在全量程范围内取多个测试点对比

  7. 老化测试

  8. 连续运行 24 小时监测角度漂移
  9. 记录温度变化并建立补偿曲线

动手实验

  1. 使用示波器连接编码器 ABZ 输出
  2. 手动旋转编码器轴,观察波形关系
  3. 测量 A 相两个上升沿的时间差 Δt
  4. 计算转速:RPM = (60/( 线数×Δt))

通过本指南的系统实践,我们成功实现了±0.1°的角度测量精度。实际应用中,还需要根据具体环境优化滤波参数和抗干扰措施。希望这些经验能帮助开发者少走弯路,快速实现可靠的编码器应用方案。

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