ABZ增量编码器入门指南:从基础原理到工业应用实践

1次阅读
没有评论

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

image.webp

信号特征解析

使用示波器捕获 ABZ 信号(1V/div,10μs/div)可见:
– A/ B 两相存在 90°相位差,Z 相每转产生单脉冲(典型脉宽 1 /4T)
– 正交编码模式下,A 相上升沿时 B 相电平状态决定方向(B= 1 正向,B= 0 反向)
– 与纯正交编码相比,Z 信号提供绝对位置校准点,消除累计误差

ABZ 增量编码器入门指南:从基础原理到工业应用实践

硬件层设计规范

  1. 信号调理电路
  2. 推荐 ISO7240C 数字隔离芯片(10Mbps 带宽)
  3. 施密特触发器阈值计算:
    V_T+ = (R2/(R1+R2)) * VCC + 0.7V
    V_T- = (R2/(R1+R2)) * VCC - 0.7V 
  4. 典型值:R1=10kΩ, R2=20kΩ @5V 系统

  5. EMC 防护设计

  6. 共模扼流圈选型要点:
    • 阻抗 Z≥100Ω@100MHz
    • 饱和电流 >2 倍工作电流
  7. TVS 管布局:
    • P6KE6.8CA(双向)
    • 距连接器 <10mm

算法层实现

STM32 HAL 库配置(TIM 编码器模式)

// TIM3 初始化片段
TIM_Encoder_InitTypeDef encoderConfig = {
  .EncoderMode = TIM_ENCODERMODE_TI12,
  .IC1Polarity = TIM_ICPOLARITY_RISING,
  .IC2Polarity = TIM_ICPOLARITY_RISING
};
HAL_TIM_Encoder_Init(&htim3, &encoderConfig);
__HAL_TIM_SET_COUNTER(&htim3, 32768); // 初始值设为中间值
TIM_RESET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_1);
TIM_RESET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_2);

双边沿计数状态机

stateDiagram
    [*] --> Idle
    Idle --> A_Rise: A 上升沿
    A_Rise --> B_High: B=1(正向)
    A_Rise --> B_Low: B=0(反向)
    B_High --> Count_Up: 计数器 +1
    B_Low --> Count_Down: 计数器 -1

应用层实战

CNC 机床 PID 控制集成

// 位置环 PID 计算(1kHz 中断)void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {if(htim->Instance == TIM6) {int32_t current_pos = __HAL_TIM_GET_COUNTER(&htim3) - 32768;
    int32_t error = target_pos - current_pos;

    integral += error;
    if(integral > 1000) integral = 1000;
    if(integral < -1000) integral = -1000;

    output = Kp*error + Ki*integral + Kd*(error - last_error);
    last_error = error;

    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, output);
  }
}

Arduino 测试代码

// 引脚定义
#define ENC_A 2
#define ENC_B 3
#define ENC_Z 4

volatile long count = 0;
unsigned long lastTime = 0;

void setup() {pinMode(ENC_A, INPUT_PULLUP);
  pinMode(ENC_B, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(ENC_A), isr_count, CHANGE);
  Serial.begin(115200);
}

void isr_count() {if(digitalRead(ENC_A) == digitalRead(ENC_B)) {count++;} else {count--;}
}

void loop() {if(millis() - lastTime > 100) {float rpm = (count * 60000.0) / (2000 * (millis() - lastTime));
    Serial.print("RPM:");
    Serial.println(rpm);
    count = 0;
    lastTime = millis();}
}

故障诊断矩阵

现象 可能原因 排查步骤
计数方向反向 A/ B 相序接反 交换 A / B 接线
Z 信号不触发 信号幅值不足 测量 Z 相电压 (应 >0.7VCC)
高速时丢脉冲 中断响应延迟 改用硬件编码器接口
数值跳变 电源噪声 检查去耦电容 (建议 100nF 贴片)

工程经验总结

  1. 中断优化技巧
  2. 在 1MHz 以上脉冲频率时,建议使用 DMA+ 定时器捕获模式
  3. STM32 的 TIM 编码器接口最高支持 72MHz 计数时钟

  4. 抖动处理方案

  5. 软件消抖:连续采样 3 次一致才确认状态变化
  6. 硬件消抖:RC 时间常数应大于抖动周期 (通常 >1μs)

  7. 工业现场布线

  8. 双绞线传输(绞距 <50mm)
  9. 屏蔽层单端接地(控制柜侧)
  10. 信号线与动力线间距 >30cm
正文完
 0
评论(没有评论)