当前位置: 首页 > article >正文

STM32旋转编码器驱动详解:方向判断、卡死处理与代码分析 | 零基础入门STM32第四十八步

主题内容教学目的/扩展视频
旋转编码器电路原理,跳线设置,结构分析。驱动程序与调用。熟悉电路和驱动程序。

师从洋桃电子,杜洋老师


📑文章目录

    • 一、旋转编码器原理与驱动结构
      • 1.1 旋转编码器工作原理
      • 1.2 驱动程序结构
    • 二、方向判断方法深度解析
      • 2.1 核心判断逻辑
      • 2.2 两种判断方法对比
    • 三、卡死问题解决方案
      • 3.1 卡死检测机制
      • 3.2 卡死恢复流程
    • 四、关键代码解析
      • 4.1 初始化函数
      • 4.2 核心读取函数
    • 五、项目开发注意事项
    • 六、扩展应用方向
    • 七、相关资源


▲ 回顾上期🔍旋转编码器原理与应用详解:从结构到实战 | 零基础入门STM32第四十七步


(图1:开发板与旋转编码器连接示意图)
(图2:旋转编码器结构示意图)

一、旋转编码器原理与驱动结构

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:方向判断时序图---边沿检测法)
(图4:方向判断时序图---状态机法)


(时序图:左右旋转时的信号变化)

三、卡死问题解决方案

3.1 卡死检测机制

while(!K2 && cou<60000){
    cou++; 
    KUP=1; // 设置卡死标志
    delay_us(20);
}
  • 循环计数器:cou统计等待时间
  • 标志位:KUP=1时禁止新操作

3.2 卡死恢复流程

检测K2低电平
是否卡死?
置位KUP标志
正常处理
等待物理复位
K2高电平清除KUP

四、关键代码解析

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 方向值;
}

五、项目开发注意事项

  1. 消抖处理:实测机械抖动约5-10ms,代码中采用100us+3ms双重消抖
  2. 显示冲突:避免在旋转检测中调用耗时显示函数
  3. 中断优化:高精度场景建议改用外部中断检测

六、扩展应用方向

  1. 长按/短按识别
  2. 旋转加速检测
  3. 多级菜单控制
  4. 结合PID实现精密控制

附录:完整代码流程图

按下
Start
初始化GPIO
While
ENCODER_READ
检测K2?
消抖处理
读取K3状态
标记右转
标记左转
Right/Left
等待释放
超时?
标记卡死
返回方向值

七、相关资源

[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)

http://www.kler.cn/a/578135.html

相关文章:

  • 算法系列之深度优先搜索寻找妖怪和尚过河问题的所有方式
  • 自执行函数(Self-Invoking Function)
  • Vue2使用jsts,将wkt转为geojson
  • 计算机网络篇:基础知识总结与基于长期主义的内容更新
  • 【问题解决】Jenkins使用File的exists()方法判断文件存在,一直提示不存在的问题
  • webshell一些上传心得
  • 代理IP与反爬技术的博弈
  • mysql经典试题共34题
  • UDP协议和报文格式
  • Redis | 哨兵 Sentinel
  • Java高频面试之集合-07
  • LeetCode 90: 子集 II
  • 【后端开发】go-zero微服务框架实践(goland框架对比,go-zero开发实践,文件上传问题优化等等)
  • Docker基础-项目部署流程解析
  • 07 HarmonyOS NEXT 仿uv-ui Tag组件开发教程系列(一)
  • VUE3开发-9、axios前后端跨域问题解决方案
  • K8s 1.27.1 实战系列(三)安装网络插件
  • spring Web Mvc 介绍
  • SpireCV荣获Gitee 最有价值开源项目称号
  • 中国嵌入式单片机就业形势分析