51单片机与旋转编码器实战指南:从硬件连接到软件解码

1次阅读
没有评论

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

image.webp

旋转编码器的核心价值与新手痛点

旋转编码器作为机电转换的核心传感器,在工业控制中承担着电机转速测量、精密定位等关键任务,消费电子领域则广泛用于旋钮菜单导航(如音响音量调节)。其核心优势在于 无触点数字信号输出 360°无限旋转 特性,但新手常遇到两个致命问题:

51 单片机与旋转编码器实战指南:从硬件连接到软件解码

  • 信号毛刺:机械触点抖动导致单个物理步进产生多个脉冲
  • 方向误判:A/ B 相位关系解读错误造成计数反向累积

硬件连接:从器件选型到电路搭建

1. 编码器类型选择

  • 增量式编码器(EC11 为代表)
  • 输出正交脉冲信号(A/ B 相)
  • 每圈脉冲数有限(常见 20-600PPR)
  • 依赖外部上拉电阻
  • 绝对式编码器
  • 输出并行格雷码或串行协议
  • 掉电不丢失位置信息
  • 成本较高(本文不做展开)

2. 硬件连接示意图(EC11 编码器)

EC11 引脚     51 单片机连接方案
-------------------------------
CLK(A 相) --> P3.2(INT0)  
DT(B 相)  --> P3.3(INT1)  
SW(按键) --> P1.0 + 10kΩ 上拉
VCC      --> +5V         
GND      --> 单片机地线  

关键参数
– 上拉电阻选用4.7kΩ~10kΩ(过低耗电,过高易受干扰)
– 信号线推荐并联 100nF 电容 到地(滤除高频噪声)

3. 实测信号波形分析

用示波器同时捕获 A / B 相可观察到:

  • 顺时针旋转时:A 相上升沿对应 B 相 高电平
  • 逆时针旋转时:A 相上升沿对应 B 相 低电平
  • 抖动现象:触点闭合 / 断开时产生<5μs 的振荡

软件设计:从消抖算法到 4 倍频计数

1. 状态机消抖实现(C51 代码)

// 编码器状态定义
#define ENCODER_STABLE   0
#define ENCODER_MAYBE_CW 1  // 疑似顺时针
#define ENCODER_MAYBE_CCW 2 // 疑似逆时针

unsigned char encoder_state = ENCODER_STABLE;

void EX0_ISR() interrupt 0 {
  static unsigned char last_A = 1;
  unsigned char current_A = P3_2;

  if(last_A != current_A) {if(current_A && !P3_3) { // A 上升沿且 B 为低
      encoder_state = ENCODER_MAYBE_CCW;
    } 
    else if(current_A && P3_3) { // A 上升沿且 B 为高
      encoder_state = ENCODER_MAYBE_CW;
    }
    last_A = current_A;
  }

  // 50ms 后确认有效动作(定时器代码略)if(encoder_timeout) {if(encoder_state == ENCODER_MAYBE_CW) {counter++;} else if(encoder_state == ENCODER_MAYBE_CCW) {counter--;}
    encoder_state = ENCODER_STABLE;
  }
}

2. 4 倍频计数原理

通过检测 A / B 相的 所有跳变沿(上升 + 下降),可将分辨率提高 4 倍:

  1. A 相上升沿:B= 0 则减计数,B= 1 则加计数
  2. A 相下降沿:B= 1 则减计数,B= 0 则加计数
  3. B 相跳变沿同理(需交换 AB 判断逻辑)

避坑指南:血泪经验总结

1. 中断服务函数优化

  • 避免在中断内进行 浮点运算 长循环
  • 标志位检查改用 静态变量 + 主循环处理 模式

2. 机械安装校准

  • 编码器轴与转轴 同轴度误差 <0.1mm
  • 联轴器推荐使用 弹性尼龙材质 吸收振动

3. PCB 抗干扰设计

  • 信号线走 差分对(若空间允许)
  • 电源入口放置 100μF+0.1μF 去耦电容
  • 单片机 IO 口配置为 准双向模式

进阶思考:Z 相零点校准

工业编码器的 Z 相脉冲每转产生一次,思考:

  1. 如何通过 外部中断 + 定时器 捕捉零点信号?
  2. 怎样设计 EEPROM 存储 实现掉电位置记忆?
  3. 多圈计数时的 32 位变量溢出 如何防范?

(提示:可结合 T2 定时器的捕获功能实现)

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