主題 | 內容 | 教學目的/擴展視頻 |
---|---|---|
旋轉編碼器 | 電路原理,跳線設置,結構分析。驅動程序與調用。 | 熟悉電路和驅動程序。 |
師從洋桃電子,杜洋老師
📑文章目錄
- 一、旋轉編碼器原理與驅動結構
- 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)