AB相编码器测速实战:从原理到Arduino实现避坑指南

1次阅读
没有评论

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

image.webp

背景痛点

在机器人控制或 CNC 系统中,AB 相编码器是最常见的速度反馈元件。但在实际应用中,新手常会遇到三类典型问题:

AB 相编码器测速实战:从原理到 Arduino 实现避坑指南

  • 信号毛刺导致计数错误 :机械振动或电磁干扰会使编码器输出产生抖动,一个物理脉冲被误判为多个计数
  • 低速时脉冲丢失 :当转速低于一定阈值时,传统计数方法会因采样间隔过大而丢失脉冲
  • 方向判断逻辑缺陷 :软件处理相位差时若存在时序问题,可能导致方向误判

测速方法对比

  1. 中断法
  2. 优点:响应快,可捕获所有边沿
  3. 缺点:高频时可能丢失中断,占用 CPU 资源

  4. 硬件计数器法

  5. 优点:不占用 CPU 时间,适合高频场景
  6. 缺点:依赖 MCU 硬件资源

  7. 软件轮询法

  8. 优点:实现简单
  9. 缺点:采样率受限,低速精度差

核心实现

硬件连接

使用 Arduino Uno 的 D2、D3 引脚(对应 INT0 和 INT1)连接编码器 AB 相,典型电路如下:

[编码器] ----[10k 上拉]--- D2 (A 相)
          |
          ----[10k 上拉]--- D3 (B 相)

正交解码状态机

volatile int32_t g_encoderCount = 0; // 必须声明为 volatile

void setup() {pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  attachInterrupt(0, isrA, CHANGE); // 四倍频计数
  attachInterrupt(1, isrB, CHANGE);
}

// 状态机实现四倍频解码
void isrA() {
  static uint8_t lastState = 0;
  uint8_t currState = digitalRead(2) | (digitalRead(3) << 1);

  if((lastState == 0x00 && currState == 0x01) || 
     (lastState == 0x03 && currState == 0x02)) {g_encoderCount++;} else {g_encoderCount--;}
  lastState = currState;
}

关键点说明:

  1. volatile 关键字确保中断与主程序间正确共享变量
  2. 状态机通过检查 AB 相组合变化实现方向判断
  3. CHANGE 触发方式使每个物理周期产生 4 次计数(上升 / 下降沿各一次)

性能优化

数字滤波算法

#define FILTER_TIME 50 // 单位 ms

uint32_t lastValidTime = 0;
int32_t lastValidCount = 0;

float getFilteredSpeed() {uint32_t now = millis();
  if(now - lastValidTime > FILTER_TIME) {float speed = (g_encoderCount - lastValidCount) * 1000.0 / (now - lastValidTime);
    lastValidCount = g_encoderCount;
    lastValidTime = now;
    return speed;
  }
  return NAN; // 数据未更新
}

滤波时间常数建议:

  • 高速场景:20-50ms
  • 低速场景:100-200ms

ISR 执行时间测量

通过示波器观察中断引脚与测试引脚的延时:

void isrA() {digitalWrite(13, HIGH);
  // ... 中断处理代码
  digitalWrite(13, LOW);
}

避坑指南

  1. 上拉电阻选择
  2. 10kΩ:适合大部分场景
  3. 1kΩ:长线传输时增强信号完整性
  4. 100kΩ:低功耗应用

  5. 替代 delay() 的方案

    uint32_t lastUpdate = 0;
    void loop() {if(millis() - lastUpdate > 100) {updateDisplay(); // 非阻塞式定时任务
        lastUpdate = millis();}
    }

  6. ESD 防护设计

  7. 信号线串联 100Ω 电阻
  8. 对地添加 TVS 二极管
  9. 使用屏蔽双绞线

延伸思考

  1. 多编码器系统
  2. 使用 PCA9548 等 I2C 多路复用器扩展 IO
  3. 为每个编码器分配独立硬件定时器

  4. STM32 硬件接口改造

    TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, 
      TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);

实测波形对比

(此处应有示波器截图,展示滤波前后信号质量改善)

  • 原始信号:可见明显振铃和毛刺
  • 滤波后信号:干净方波,边沿清晰

结语

通过合理选择硬件参数和优化软件算法,AB 相编码器可实现 0.1RPM 的低速测量精度。实际项目中还需考虑机械安装同轴度、电缆屏蔽等非电气因素。希望本文的实践经验能帮助开发者少走弯路。

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