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.pswp.cn/news/897246.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897246.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897246.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

elementplus的cascader級聯選擇器在懶加載且多選時的一些問題分析

1. 背景 在之前做的一個項目中使用到了element的級聯選擇器&#xff0c;并且是需要懶加載、多選、父子不關聯等等&#xff0c;在選的時候當然沒問題&#xff0c;但是回顯的時候就會回顯不出來&#xff0c;相信大部分伙伴都遇到過這個問題。我在以前出過一篇文章寫過關于級聯選…

【Python運維】用Python自動化AWS資源管理:利用boto3實現高效管理S3桶和EC2實例

《Python OpenCV從菜鳥到高手》帶你進入圖像處理與計算機視覺的大門! 解鎖Python編程的無限可能:《奇妙的Python》帶你漫游代碼世界 隨著云計算的普及,AWS(Amazon Web Services)已經成為許多企業和開發者首選的云平臺。為了提高工作效率,自動化管理AWS資源成為了一個熱…

淘寶關鍵字搜索接口爬蟲測試實戰指南

在電商數據分析和市場研究中&#xff0c;通過關鍵字搜索獲取淘寶商品信息是一項重要任務。淘寶開放平臺提供了 item_search 接口&#xff0c;允許開發者通過關鍵字搜索商品&#xff0c;并獲取商品列表及相關信息。本文將詳細介紹如何設計并測試一個基于該接口的爬蟲程序&#x…

【Linux實踐系列】:用c語言實現一個shell外殼程序

&#x1f525;本文專欄&#xff1a;Linux Linux實踐項目 &#x1f338;博主主頁&#xff1a;努力努力再努力wz 那么今天我們就要進入Linux的實踐環節&#xff0c;那么我們之前學習了進程控制相關的幾個知識點&#xff0c;比如進程的終止以及進程的等待和進程的替換&#xff0c;…

?算法OJ?N-皇后問題 II【回溯剪枝】(C++實現)N-Queens II

?算法OJ?N-皇后問題【回溯剪枝】&#xff08;C實現&#xff09;N-Queens 問題描述 The n-queens puzzle is the problem of placing n n n queens on an n n n \times n nn chessboard such that no two queens attack each other. Given an integer n, return the num…

03.06 QT

一、使用QSlider設計一個進度條&#xff0c;并讓其通過線程自己動起來 程序代碼&#xff1a; <1> Widget.h: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QThread> #include "mythread.h"QT_BEGIN_NAMESPACE namespace Ui {…

Spring WebFlux 中 WebSocket 使用 DataBuffer 的注意事項

以下是修改后的完整文檔&#xff0c;包含在多個多線程環境中使用 retain() 和 release() 方法的示例&#xff0c;且確保在 finally 塊中調用 release()&#xff1a; 在 Spring WebFlux 中&#xff0c;WebSocketMessage 主要用于表示 WebSocket 的消息載體&#xff0c;其中 getP…

【CSS】Tailwind CSS 與傳統 CSS:設計理念與使用場景對比

1. 開發方式 1.1 傳統 CSS 手寫 CSS&#xff1a;你需要手動編寫 CSS 規則&#xff0c;定義類名、ID 或元素選擇器&#xff0c;并為每個元素編寫樣式。 分離式開發&#xff1a;HTML 和 CSS 通常是分離的&#xff0c;HTML 中通過類名或 ID 引用 CSS 文件中的樣式。 示例&#…

2025華為OD機試真題E卷 - 螺旋數字矩陣【Java】

題目描述 疫情期間,小明隔離在家,百無聊賴,在紙上寫數字玩。他發明了一種寫法:給出數字個數 n (0 < n ≤ 999)和行數 m(0 < m ≤ 999),從左上角的 1 開始,按照順時針螺旋向內寫方式,依次寫出2,3,…,n,最終形成一個 m 行矩陣。小明對這個矩陣有些要求: 1、…

地下井室可燃氣體監測裝置:守護地下安全,防患于未“燃”!

在城市的地下&#xff0c;隱藏著無數的燃氣管道和井室&#xff0c;它們是城市基礎設施建設的重要部分&#xff0c;燃氣的使用&#xff0c;給大家的生活提供了極大的便利。在便利生活的背后&#xff0c;也存在潛在的城市安全隱患。 近年來&#xff0c;地下井室可燃氣體泄漏事故…

【使用hexo模板創建個人博客網站】

使用hexo模板創建個人博客網站 環境準備node安裝hexo安裝ssh配置 使用hexo命令搭建個人博客網站hexo命令 部署到github創建倉庫修改_config.yml文件 編寫博客主題擴展 環境準備 node安裝 進入node官網安裝node.js 使用node -v檢查是否安裝成功 安裝成功后應該出現如上界面 …

C# OPC DA獲取DCS數據(提前配置DCOM)

OPC DA配置操作手冊 配置完成后&#xff0c;訪問遠程ip&#xff0c;就能獲取到服務 C#使用Interop.OPCAutomation采集OPC DA數據&#xff0c;支持訂閱&#xff08;數據變化&#xff09;、單個讀取、單個寫入、斷線重連

發行思考:全球熱銷榜的頻繁變動

幾點雜感&#xff1a; 1、單機游戲銷量與在線人數的衰退是劇烈的&#xff0c;有明顯的周期性&#xff0c;而在線游戲則穩定很多。 如去年的某明星游戲&#xff0c;最高200多萬在線&#xff0c;如今在線人數是48名&#xff0c;3萬多。 而近期熱門的是MH&#xff0c;在線人數8…

Unity自定義區域UI滑動事件

自定義區域UI滑動事件 介紹制作1.創建一個Image2.創建腳本 總結 介紹 一提到滑動事件聯想到有太多的插件了比如EastTouchBundle&#xff0c;今天想單純通過UI去做一個滑動事件而不是基于Box2d或者Box去做滑動事件。 制作 1.創建一個Image 2.創建腳本 using UnityEngine; us…

taosd 寫入與查詢場景下壓縮解壓及加密解密的 CPU 占用分析

在當今大數據時代&#xff0c;時序數據庫的應用越來越廣泛&#xff0c;尤其是在物聯網、工業監控、金融分析等領域。TDengine 作為一款高性能的時序數據庫&#xff0c;憑借獨特的存儲架構和高效的壓縮算法&#xff0c;在存儲和查詢效率上表現出色。然而&#xff0c;隨著數據規模…

《UE5_C++多人TPS完整教程》學習筆記34 ——《P35 網絡角色(Network Role)》

本文為B站系列教學視頻 《UE5_C多人TPS完整教程》 —— 《P35 網絡角色&#xff08;Network Role&#xff09;》 的學習筆記&#xff0c;該系列教學視頻為計算機工程師、程序員、游戲開發者、作家&#xff08;Engineer, Programmer, Game Developer, Author&#xff09; Stephe…

K8s 1.27.1 實戰系列(七)Deployment

一、Deployment介紹 Deployment負責創建和更新應用程序的實例,使Pod擁有多副本,自愈,擴縮容等能力。創建Deployment后,Kubernetes Master 將應用程序實例調度到集群中的各個節點上。如果托管實例的節點關閉或被刪除,Deployment控制器會將該實例替換為群集中另一個節點上的…

Linux(Centos 7.6)命令詳解:vim

1.命令作用 vi/vim 是Linux 系統內置不可或缺的文本編輯命令&#xff0c;vim 是vi 的加強版本&#xff0c;兼容vi 的所有指令&#xff0c;不僅能編輯文本&#xff0c;而且還具有shell 程序編輯的功能&#xff0c;可以不同顏色的字體來辨別語法的正確性。 2.命令語法 usage: …

微信小程序引入vant-weapp組件教程

本章教程,介紹如何在微信小程序中引入vant-weapp。 vant-weapp文檔:https://vant-ui.github.io/vant-weapp/#/button 一、新建一個小程序 二、npm初始化 npm init三、安裝 Vant Weapp‘ npm i @vant/weapp -

C++ 作業 DAY5

作業 代碼 Widtget.h class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();private:Ui::Widget *ui;/************************ 起始終止坐標 ************************/QPoint end;QPoint start;QVector<QPoint> per_start_lis…