主题 | 内容 | 教学目的/扩展视频 |
---|---|---|
旋转编码器 | 电路原理,跳线设置,结构分析。驱动程序与调用。 | 熟悉电路和驱动程序。 |
师从洋桃电子,杜洋老师
▲ 回顾上期旋转编码器原理与应用详解:从结构到实战 | 零基础入门STM32第四十七步
旋转编码器通过两个正交脉冲信号(K2/K3)判断方向。旋转时两个引脚依次产生低电平,相位差90度:
// 驱动核心函数
void ENCODER_Init(void); // 初始化GPIO
u8 ENCODER_READ(void); // 读取旋转值
通过检测K2下降沿时K3的电平状态:
if(!K2 && KUP==0) {
delay_us(100);
kt = K3_State; // 记录K3状态
if(kt==0) a=1; // 右转
else a=2; // 左转
}
方法 | 优点 | 缺点 |
---|---|---|
边沿检测法(本文) | 实现简单 | 依赖旋转速度 |
状态机法 | 抗干扰强 | 代码复杂度高 |
(时序图:左右旋转时的信号变化)
while(!K2 && cou<60000){
cou++;
KUP=1; // 设置卡死标志
delay_us(20);
}
void ENCODER_Init(void){
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入模式
GPIO_Init(ENCODER_PORT_A, &GPIO_InitStructure);
}
配置引脚为上拉输入,增强抗干扰能力
u8 ENCODER_READ(void){
if(K2下降沿){
delay_us(100); // 消抖
kt = 读取K3状态;
if(kt==0) 右转;
else 左转;
while(等待旋钮释放){
cou++; // 卡死检测
if(cou>阈值) KUP=1;
}
}
return 方向值;
}
附录:完整代码流程图
[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)