共计 1395 个字符,预计需要花费 4 分钟才能阅读完成。
核心概念
1. 旋转编码器类型差异
-
增量式编码器 :通过 A / B 两相脉冲信号输出相对位置变化,断电后位置信息丢失。特点是成本低、接口简单,适合速度测量和相对定位。

-
绝对式编码器 :每个位置对应唯一二进制编码,直接输出绝对角度信息。抗干扰强但价格高,多用于精密仪器。
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
软件消抖逻辑 :
- 检测到边沿变化后启动 10ms 计时
- 在此期间忽略新边沿
- 超时后确认有效信号
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;
}
避坑指南
- 接地环路干扰 :
- 使用屏蔽双绞线连接编码器
-
在信号线靠近 MCU 端加磁珠
-
脉冲宽度差异 :
- 通过示波器测量实际脉冲宽度
-
调整输入捕获滤波参数(如 STM32 的 ICx_FILTER)
-
低功耗唤醒 :
- 配置编码器中断唤醒 MCU
- 休眠前保存计数器值
验证测试
测试数据(1000RPM 下)
| 理论脉冲数 | 实际测得 | 误差率 |
|---|---|---|
| 600 | 598 | 0.33% |
| 1200 | 1195 | 0.42% |
示波器波形示例
______ ______
A 相 ______/ \____/ \____
______ ______
B 相 ________/ \____/ \__
思考题
- 如何用万用表快速判断编码器的 A / B 相线序?
- 当编码器转速超过 MCU 检测能力时,硬件上可以如何改进?
- 为什么四倍频技术能提高分辨率但不会增加精度?
通过本文的实战方法,我在电机控制项目中成功实现了 0.5°的角度分辨率。关键点在于硬件消抖和滤波参数的精细调整,希望这些经验能帮助到正在入门的朋友们。
正文完

