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

- 信号毛刺:机械触点抖动导致单个物理步进产生多个脉冲
- 方向误判: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 倍:
- A 相上升沿:B= 0 则减计数,B= 1 则加计数
- A 相下降沿:B= 1 则减计数,B= 0 则加计数
- B 相跳变沿同理(需交换 AB 判断逻辑)
避坑指南:血泪经验总结
1. 中断服务函数优化
- 避免在中断内进行 浮点运算 或长循环
- 标志位检查改用 静态变量 + 主循环处理 模式
2. 机械安装校准
- 编码器轴与转轴 同轴度误差 <0.1mm
- 联轴器推荐使用 弹性尼龙材质 吸收振动
3. PCB 抗干扰设计
- 信号线走 差分对(若空间允许)
- 电源入口放置 100μF+0.1μF 去耦电容
- 单片机 IO 口配置为 准双向模式
进阶思考:Z 相零点校准
工业编码器的 Z 相脉冲每转产生一次,思考:
- 如何通过 外部中断 + 定时器 捕捉零点信号?
- 怎样设计 EEPROM 存储 实现掉电位置记忆?
- 多圈计数时的 32 位变量溢出 如何防范?
(提示:可结合 T2 定时器的捕获功能实现)
正文完
