Arduino旋转编码器入门指南:从硬件连接到中断处理

1次阅读
没有评论

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

image.webp

1. 旋转编码器是什么?

旋转编码器就像电子设备的 ” 方向盘 ”,通过旋转操作输出数字信号。常见的是增量式编码器(如 EC11),它有两路输出信号(A 相和 B 相),特点如下:

Arduino 旋转编码器入门指南:从硬件连接到中断处理

  • 正交信号 :两路信号波形相同但相位差 90 度
  • 方向判断 :通过两路信号的相位关系识别正反转
  • 脉冲计数 :每转动一个刻度产生一组脉冲

2. 硬件连接实战

以 EC11 编码器为例的接线方案:

EC11 引脚说明:CLK(A 相)→ Arduino D2(中断 0)DT(B 相)→ Arduino D3
SW(按键)→ Arduino D4(可选)+  → 5V
GND → GND

重要细节:

  • 必须接 10K 上拉电阻(编码器内部是开路输出)
  • 推荐使用中断引脚(UNO 上是 D2/D3)
  • 按键引脚需要额外接下拉电阻

3. 软件方案三选一

方案 1:轮询检测(简单但低效)

void loop() {int clkState = digitalRead(CLK_PIN);
  int dtState = digitalRead(DT_PIN);

  if(clkState != lastClk){if(dtState != clkState){counter++;}else{counter--;}
    lastClk = clkState;
  }
}

缺点:占用 CPU 资源,高速旋转时可能漏检

方案 2:中断 + 状态机(推荐方案)

// 状态机实现
void handleEncoder() {
  static uint8_t state = 0;
  state = (state << 2) | (digitalRead(DT_PIN) << 1) | digitalRead(CLK_PIN);

  switch(state){
    case 0b0001: case 0b1110: // 正转
      counter++; break;
    case 0b0010: case 0b1101: // 反转
      counter--; break;
  }
}

void setup() {attachInterrupt(0, handleEncoder, CHANGE); // 中断 0 对应 D2
}

优势:

  • 通过 4 状态检测实现硬件级消抖
  • 中断触发保证实时性
  • 准确识别旋转方向

4. 必知的避坑技巧

信号抖动问题

硬件方案:
– 在 CLK/DT 引脚对 GND 接 100nF 电容
– 使用施密特触发器整形

软件方案:
– 状态机消抖(如上例)
– 添加时间戳校验

中断冲突预防

  • 避免与 Servo、SoftwareSerial 等库共用中断
  • 优先使用 PCINT 中断(如果有)

长线传输方案

  • 使用双绞线
  • 线路超过 50cm 时加 120Ω 终端电阻
  • 考虑改用 RS422 差分传输

5. 进阶玩家路线

对于 STM32 等高级 MCU:

// 使用硬件编码器接口(TIM 模块)void setupEncoder() {
  TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, 
                            TIM_ICPolarity_Rising, 
                            TIM_ICPolarity_Rising);
  TIM_Cmd(TIM3, ENABLE);
}

优势:零 CPU 占用,支持高速计数

动手实验建议

  1. 基础实验:用串口监视器观察旋转计数值
  2. 中级实验:用编码器控制 LED 亮度(PWM 输出)
  3. 高级实验:实现多级菜单系统(结合 OLED 显示屏)
// 控制 LED 亮度示例
void loop() {analogWrite(LED_PIN, map(counter, 0, 100, 0, 255));
  Serial.println(counter);
  delay(50);
}

实际使用中发现,EC11 编码器每转一圈大约产生 20 个脉冲(因型号而异)。建议先用示波器观察信号波形,这对理解工作原理非常有帮助。遇到信号不稳时,不妨先用手机慢动作录像观察机械结构是否正常。

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