ABZ编码器输出波形解析:从基础原理到实战调试指南

1次阅读
没有评论

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

image.webp

认识 ABZ 编码器的核心信号

第一次用示波器抓取 ABZ 编码器(Incremental Encoder)输出时,新手常会被各种波形问题困扰。我们先看两种典型波形对比:

  • 理想波形 :A/ B 两路方波信号严格保持 90°相位差(Quadrature Phase),Z 信号每转一圈产生单个脉冲
  • 失真波形 :可能出现信号毛刺(Glitch)、相位偏移(Phase Shift)或幅度衰减(Amplitude Attenuation)

ABZ 编码器输出波形解析:从基础原理到实战调试指南

硬件设计:信号调理电路实战

工业现场电磁环境复杂,原始信号需经过调理才能送入 MCU。推荐电路包含两个关键部分:

circuit LR
    A[ABZ 输入] --> B(施密特触发器 SN74LVC1G17)
    B --> C(光耦隔离 TLP2361)
    C --> D[MCU GPIO]
    subgraph 抗干扰设计
    B ---|10k 上拉 | VCC
    C ---|1uF 去耦电容 | GND
    end
  • 施密特触发器 :将缓慢变化的信号整形成干净方波,消除回差(Hysteresis)影响
  • 光耦隔离 :切断地环路(Ground Loop),典型参数 IF=5mA,Rlimit=680Ω

软件解码:STM32 编码器模式实战

以 STM32F407 为例,使用 TIM2 定时器的编码器接口模式(Encoder Interface Mode):

// 环境:STM32CubeIDE 1.8.0
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;
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

    // 关键配置:正交解码模式 + 双沿捕获
    sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
    sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
    sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
    sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
    sConfig.IC1Filter = 0x0F; // 16MHz 时钟下约 680ns 滤波

    // 对称配置通道 2
    sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
    sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
    sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
    sConfig.IC2Filter = 0x0F;

    HAL_TIM_Encoder_Init(&htim2, &sConfig);
    HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
}

工业现场 EMC 设计要点

  1. 接地处理
  2. 编码器外壳接机柜大地(Chassis Ground)
  3. 信号地(Signal Ground)通过 1MΩ 电阻并联 1000pF 电容接机柜地

  4. 电缆选择

  5. 优先选用双绞屏蔽线(Twisted Pair Shielded Cable)
  6. 屏蔽层 360°端接金属连接器外壳

  7. PCB 布局

  8. 信号线临近地平面走线
  9. 接口处放置 TVS 二极管(如 SMBJ5.0CA)

高级调试:FFT 波形分析法

当出现计数异常时,可用 FFT 工具分析信号质量:

  1. 采样率设为信号频率 10 倍以上
  2. 观察频谱中是否出现异常谐波
  3. 典型故障特征:
  4. 基波幅度 <1Vpp → 信号衰减
  5. 二次谐波 >-20dBc → 波形畸变

关键算法实现

32 位计数扩展

int32_t Get_FullCount(void) {
    static uint16_t last_cnt = 0;
    static int32_t total = 0;
    uint16_t curr_cnt = TIM2->CNT;

    int16_t delta = (int16_t)(curr_cnt - last_cnt);
    total += delta;
    last_cnt = curr_cnt;

    return total;
}

带时间戳的转速计算

float Get_Speed_RPM(uint32_t sample_ms) {
    static int32_t last_count = 0;
    static uint32_t last_time = 0;

    int32_t curr_count = Get_FullCount();
    uint32_t curr_time = HAL_GetTick();

    float rpm = (curr_count - last_count) * 60000.0f 
               / (ppr * (curr_time - last_time)); // ppr: 每转脉冲数

    last_count = curr_count;
    last_time = curr_time;

    return rpm;
}

实战挑战:相位误差分析

观察以下故障波形特征:
– A/ B 信号相位差从 90°变为 180°
– Z 信号位置正常

可能成因:
1. 编码器安装偏心导致 A / B 道光栅错位
2. 信号调理电路某通道反相
3. 电缆线序接错(如 A +/A- 反接)

请用示波器 XY 模式观察李萨如图形(Lissajous Curve),配合互换 A / B 通道的方法定位故障源。

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