主题 | 内容 | 教学目的/扩展视频 |
---|---|---|
旋转编码器 | 电路原理,跳线设置,结构分析。驱动程序与调用。 | 熟悉电路和驱动程序。 |
师从洋桃电子,杜洋老师
📑文章目录
- 一、旋转编码器原理与驱动结构
- 1.1 旋转编码器工作原理
- 1.2 驱动程序结构
- 二、方向判断方法深度解析
- 2.1 核心判断逻辑
- 2.2 两种判断方法对比
- 三、卡死问题解决方案
- 3.1 卡死检测机制
- 3.2 卡死恢复流程
- 四、关键代码解析
- 4.1 初始化函数
- 4.2 核心读取函数
- 五、项目开发注意事项
- 六、扩展应用方向
- 七、相关资源
▲ 回顾上期🔍旋转编码器原理与应用详解:从结构到实战 | 零基础入门STM32第四十七步


一、旋转编码器原理与驱动结构
1.1 旋转编码器工作原理
旋转编码器通过两个正交脉冲信号(K2/K3)判断方向。旋转时两个引脚依次产生低电平,相位差90度:
- 右旋:K2先低电平 → K3后低电平
- 左旋:K3先低电平 → K2后低电平
1.2 驱动程序结构
// 驱动核心函数
void ENCODER_Init(void); // 初始化GPIO
u8 ENCODER_READ(void); // 读取旋转值
二、方向判断方法深度解析
2.1 核心判断逻辑
通过检测K2下降沿时K3的电平状态:
if(!K2 && KUP==0) {delay_us(100);kt = K3_State; // 记录K3状态if(kt==0) a=1; // 右转else a=2; // 左转
}
2.2 两种判断方法对比
方法 | 优点 | 缺点 |
---|---|---|
边沿检测法(本文) | 实现简单 | 依赖旋转速度 |
状态机法 | 抗干扰强 | 代码复杂度高 |


(时序图:左右旋转时的信号变化)
三、卡死问题解决方案
3.1 卡死检测机制
while(!K2 && cou<60000){cou++; KUP=1; // 设置卡死标志delay_us(20);
}
- 循环计数器:cou统计等待时间
- 标志位:KUP=1时禁止新操作
3.2 卡死恢复流程
四、关键代码解析
4.1 初始化函数
void ENCODER_Init(void){GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入模式GPIO_Init(ENCODER_PORT_A, &GPIO_InitStructure);
}
配置引脚为上拉输入,增强抗干扰能力
4.2 核心读取函数
u8 ENCODER_READ(void){if(K2下降沿){delay_us(100); // 消抖kt = 读取K3状态;if(kt==0) 右转;else 左转;while(等待旋钮释放){cou++; // 卡死检测if(cou>阈值) KUP=1;}}return 方向值;
}
五、项目开发注意事项
- 消抖处理:实测机械抖动约5-10ms,代码中采用100us+3ms双重消抖
- 显示冲突:避免在旋转检测中调用耗时显示函数
- 中断优化:高精度场景建议改用外部中断检测
六、扩展应用方向
- 长按/短按识别
- 旋转加速检测
- 多级菜单控制
- 结合PID实现精密控制
附录:完整代码流程图
七、相关资源
[1] 洋桃电子B站课程-STM32入门100步
[2] STM32F103xx官方数据手册
[3] STM32F103X8-B数据手册(中文)
[4] STM32F103固件函数库用户手册(中文)
[5] 旋转编码器数码管显示程序
[6] 旋转编码器介绍(中文)
💬 技术讨论(请在评论区留言~)
📌 下期预告:下一期将探讨I2C总线介绍,欢迎持续关注!
点击查阅🔍往期【STM32专栏】文章
版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
实测开发版:洋桃1号开发版(基于STM32F103C8T6)
更新日志:
- v1.0 初始版本(2025-03-06)