Adrino旋转编码器入门指南:从基础原理到嵌入式开发实战

1次阅读
没有评论

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

image.webp

核心概念

1. 旋转编码器类型差异

  • 增量式编码器 :通过 A / B 两相脉冲信号输出相对位置变化,断电后位置信息丢失。特点是成本低、接口简单,适合速度测量和相对定位。

    Adrino 旋转编码器入门指南:从基础原理到嵌入式开发实战

  • 绝对式编码器 :每个位置对应唯一二进制编码,直接输出绝对角度信息。抗干扰强但价格高,多用于精密仪器。

graph LR
  A[旋转编码器] --> B[增量式]
  A --> C[绝对式]
  B --> D[A/ B 相脉冲]
  C --> E[并行 / 串行编码]

2. 正交编码信号原理

当编码器旋转时,A/ B 相会产生 90 度相位差的方波:

 A 相: _|‾|_|‾|_|‾
B 相: ‾|_|‾|_|‾|_  (顺时针旋转)
      _|‾|_|‾|_|‾
      ‾|_|‾|_|‾|_  (逆时针旋转)

通过检测边沿顺序即可判断方向。实际开发中常使用四倍频技术(同时捕获上升沿和下降沿)提高分辨率。

3. 典型应用场景

  • 人机交互 :旋钮调节参数(如音量控制)
  • 电机控制 :测量转速和转向
  • 位置反馈 :CNC 机床的闭环控制

痛点分析与解决方案

1. 机械抖动问题

现象 :手动旋转时因触点振动产生毛刺脉冲

硬件消抖方案

       10kΩ      0.1μF
A 相 ----/\/\/-----||-----> MCU
               RC 时间常数 =1ms

软件消抖逻辑

  1. 检测到边沿变化后启动 10ms 计时
  2. 在此期间忽略新边沿
  3. 超时后确认有效信号

2. 高速信号丢失

优化策略

  • 使用 STM32 的硬件编码器接口(TIMx_ENCODER_MODE)
  • 配置输入捕获为双边沿触发
  • 确保时钟频率 ≥ 编码器最大脉冲频率×4

3. MCU 兼容性问题

通用适配方案

  • 5V 编码器接 3.3V MCU 时需加电平转换电路
  • 对于不支持硬件编码器模式的 MCU,可用外部中断 + 状态机实现

STM32 实战配置

1. CubeMX 设置

// TIM3 配置示例
htim3.Init.Period = 0xFFFF;          // 16 位计数器
htim3.EncoderMode = TIM_ENCODERMODE_TI12;  // 双通道模式
htim3.IC1Filter = 6;                 // 8 个时钟周期的滤波 

2. 四倍频计数实现

// 获取带方向的计数值
int32_t GetEncoderValue() {
  static uint16_t last_cnt = 0;
  uint16_t new_cnt = TIM3->CNT;
  int16_t delta = (new_cnt - last_cnt) & 0xFFFF;
  if(delta > 0x7FFF) delta -= 0xFFFF; // 处理溢出
  last_cnt = new_cnt;
  return total_count += delta;
}

避坑指南

  1. 接地环路干扰
  2. 使用屏蔽双绞线连接编码器
  3. 在信号线靠近 MCU 端加磁珠

  4. 脉冲宽度差异

  5. 通过示波器测量实际脉冲宽度
  6. 调整输入捕获滤波参数(如 STM32 的 ICx_FILTER)

  7. 低功耗唤醒

  8. 配置编码器中断唤醒 MCU
  9. 休眠前保存计数器值

验证测试

测试数据(1000RPM 下)

理论脉冲数 实际测得 误差率
600 598 0.33%
1200 1195 0.42%

示波器波形示例

          ______      ______
A 相 ______/      \____/      \____
            ______      ______
B 相 ________/      \____/      \__

思考题

  1. 如何用万用表快速判断编码器的 A / B 相线序?
  2. 当编码器转速超过 MCU 检测能力时,硬件上可以如何改进?
  3. 为什么四倍频技术能提高分辨率但不会增加精度?

通过本文的实战方法,我在电机控制项目中成功实现了 0.5°的角度分辨率。关键点在于硬件消抖和滤波参数的精细调整,希望这些经验能帮助到正在入门的朋友们。

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