STM32旋转编码器驱动指南:方向判断、卡死处理与代码深度解析——零基础入门STM32第48步详解

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

师从洋桃电子,杜洋老师


📑文章目录

  • 一、旋转编码器原理与驱动结构
  • 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)
  • 作者:触角01010001

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32旋转编码器驱动指南:方向判断、卡死处理与代码深度解析——零基础入门STM32第48步详解

    发表回复