STC32G12K128-旋轉編碼器-軟件去抖

STC32G12K128-旋轉編碼器-軟件去抖

  • 簡介
  • 代碼

簡介

EC11旋轉編碼器是一種可以連續旋轉的器件A,B,C為旋轉編碼引腳,帶按鍵的有D,E引腳。引腳功能:

  • A:編碼器A相;
  • B:編碼器B相;
  • C:公共端-一般接到GND;
  • D/E:按鍵,按下時D,E導通,和普通按鍵功能相似;

當旋轉編碼器時:A,B兩個端子的開關相繼導通。 內部機械結構的設計保證了:順時針旋轉時A超前于B的相位。逆時針旋轉時B超前于A的相位。
在這里插入圖片描述

在這里插入圖片描述

解碼原理:

  • A相接單片機外部中斷引腳,設為下降沿觸發;
  • B相接單片機GPIO引腳,設置為輸入引腳;
  • 旋轉編碼器時A相下降沿觸發中斷,中斷服務程序里延時50us判斷A相是否為電平(去抖操作)
  • A相下降去抖后延時100us判斷B相電平,低電平是順時針旋轉,高電平是逆時針旋轉;
  • 兩個延時時間根據實際情況耐心微調,可以達到很好的去抖效果,本例實測超慢速度~超快速度,均能連續正確解碼旋轉方向值;

代碼

drv_encoder.h

#ifndef __DRV_ENCODER_H__
#define __DRV_ENCODER_H__enum {E_ENCODER_N=0,E_ENCODER_L=1,E_ENCODER_R
};void drv_encoder_init(void);uint8_t drv_encoder_value(void);void drv_encoder_notify(void);#endif

drv_encoder.c


#include "STC32G_Timer.h"
#include "STC32G_GPIO.h"
#include "STC32G_NVIC.h"
#include "STC32G_Exti.h"
#include "STC32G_Delay.h"#include "app_config.h"
#include "drv_encoder.h"
#include "debug.h"#if TCFG_DRV_ENCODER_SUPPORT#define D_ENCIO_A   P33     // 編碼器A相
#define D_ENCIO_B   P34     // 編碼器B相
static uint8_t encoder_value = E_ENCODER_N;void delay_us(unsigned int us)
{unsigned char data i;while(--us) {_nop_();_nop_();i = 3;while (--i);}
}void drv_encoder_init(void)
{EXTI_InitTypeDef	Exti_InitStructure;P3_SPEED_LOW(GPIO_Pin_3|GPIO_Pin_4);// P3_SPEED_HIGH(GPIO_Pin_3|GPIO_Pin_4);P3_DRIVE_MEDIUM(GPIO_Pin_3|GPIO_Pin_4);// P3_DRIVE_HIGH(GPIO_Pin_3|GPIO_Pin_4);// P3_PULL_UP_ENABLE(GPIO_Pin_3|GPIO_Pin_4);P3_PULL_UP_DISABLE(GPIO_Pin_3|GPIO_Pin_4);// P3_MODE_IO_PU(GPIO_Pin_3|GPIO_Pin_4);P3_MODE_IN_HIZ(GPIO_Pin_3|GPIO_Pin_4);P3_DIGIT_IN_ENABLE(GPIO_Pin_3|GPIO_Pin_4);Exti_InitStructure.EXTI_Mode      = EXT_MODE_Fall;//中斷模式,   EXT_MODE_RiseFall,EXT_MODE_FallExt_Inilize(EXT_INT1, &Exti_InitStructure);				//初始化NVIC_INT1_Init(ENABLE,Priority_1);		//中斷使能, ENABLE/DISABLE; 優先級(低到高) Priority_0,Priority_1,Priority_2,Priority_3}/*** @brief   旋轉編碼器 通知* @param   無* @note    * @return  無
*/
void drv_encoder_notify(void)
{encoder_value = E_ENCODER_N;
}/*** @brief   獲取旋轉編碼器值* @param   無* @note    同時設置編碼器值為none* @return  0:無操作,1:左旋轉(逆時針),2:右旋轉(順時針)
*/
uint8_t drv_encoder_value(void)
{uint8_t enc_value = encoder_value;    drv_encoder_notify();return enc_value;
}/*** @brief   編碼器A相中斷處理函數* @note    下降沿觸發* @return  無
*/
void INT1_ISR_Handler (void) interrupt INT1_VECTOR		//進中斷時已經清除標志
{// TODO: 旋轉編碼器去抖,A相中斷下降沿觸發,延時50us判斷A相是否為低電平,為低延時100us判斷B相電平 0=右旋轉(順時針),1=左旋轉(逆時針)D_ENCIO_A = 1;delay_us(50);if (0 == D_ENCIO_A) {D_ENCIO_B = 1;delay_us(100);if (D_ENCIO_B == 0) {encoder_value = E_ENCODER_R;} else {encoder_value = E_ENCODER_L;}}    
}#endif //TCFG_DRV_ENCODER_SUPPORT

main.c

#include "drv_encoder.h"void main(void)
{uint8_t enc_value;// 系統初始化// ......// 旋轉編碼器drv_encoder_init();enc_value = drv_encoder_value();if (E_ENCODER_N != enc_value) {			if (E_ENCODER_L == enc_value) {log_d("E_ENCODER_L\n");} else if (E_ENCODER_R == enc_value) {log_d("E_ENCODER_R\n");}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/82399.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82399.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/82399.shtml

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

相關文章

配置Jupyter Notebook環境及Token認證(Linux服務器)

配置Jupyter Notebook環境及Token認證(Linux服務器) 背景 在Ubuntu 18.04.6 LTS服務器(IP: 39.105.167.2)上,基于虛擬環境pytorch_env,通過Mac終端(SSH)配置Jupyter Notebook環境&…

從零開始學Flink:開啟實時計算的魔法之旅

在凌晨三點的數據監控大屏前,某電商平臺的技術負責人突然發現一個異常波動:支付成功率驟降15%。傳統的數據倉庫此時還在沉睡,而基于Flink搭建的實時風控系統早已捕捉到這個信號,自動觸發預警機制。當運維團隊趕到時,系…

基于k8s的Jenkins CI/CD平臺部署實踐(三):集成ArgoCD實現持續部署

基于k8s的Jenkins CI/CD平臺部署實踐(三):集成ArgoCD實現持續部署 文章目錄 基于k8s的Jenkins CI/CD平臺部署實踐(三):集成ArgoCD實現持續部署一、Argocd簡介二、安裝Helm三、Helm安裝ArgoCD實戰1. 添加Arg…

[C++類和對象]類和對象的引入

面向過程和面向對象 C語言是面向過程的,關注的是過程,分析出求解問題的步驟,通過函數調用來逐步解決問題 C是基于面向對象的,關注的是對象,將一件事情分成不同的對象,靠對象之間完成交互 類的引入 C語言結構體中只能定義變量,在C中,結構體不僅僅可以定義變量,而且可以定義函…

AWS之存儲服務

目錄 一、傳統存儲術語 二、傳統存儲與云存儲的關系 三、云存儲之AWS 使用場景 文件存儲 數據塊存儲 對象存儲 EBS、EFS、S3對比 EBS塊存儲 S3對象存儲 S3 使用案例 S3 存儲類 EFS文件存儲 一、傳統存儲術語 分類 接口/技術類型 應用場景特點 關系及區別 機械硬…

WPDRRC 模型:構建動態閉環的信息安全防御體系

WPDRRC 模型是一種信息安全整體架構設計模型,由預警(Warning)、保護(Protection)、檢測(Detection)、反應(Reaction)、恢復(Recovery)和反擊&…

Redis 數據類型詳解(二):Hash 類型全解析

文章目錄 一、什么是 Redis 的 Hash 類型?二、Hash為什么在有些時候比String好用三、常見命令1.HSET key field value2.HGET key field3.HMSET4.HMGET5.HGETALL6.HKEYS7.HVALS8.HINCRBY9.HSETNX 四、應用場景五、性能優勢六、注意事項總結 提示:以下是本…

Go Modules 的基本使用

在 Go Modules 項目中,首次運行時下載依賴包的正確流程需要根據項目情況區分處理。以下是詳細步驟和最佳實踐: 一、首次初始化項目的標準流程 1.1 創建項目目錄并初始化模塊 mkdir myproject && cd myproject go mod init github…

RISC-V AIA SPEC學習(五)

第六章 Interrupts for Virtual Machines(VS Level) 核心內容 1.VS級別外部中斷支持:?? ??客戶中斷文件(Guest Interrupt File)??:虛擬機的每個vCPU擁有獨立的IMSIC中斷文件,允許直接接收設備MSI。??vstopi CSR??:類似stopei,用于虛擬機內部處理最高優先級中…

【Python-Day 11】列表入門:Python 中最靈活的數據容器 (創建、索引、切片)

Langchain系列文章目錄 01-玩轉LangChain:從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊:四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain:從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…

【AXI總線專題】-AXI-LITE總線解讀

【AXI總線專題】-AXI-LITE總線解讀 1.axi-lite概述2.信號定義Write address channelWrite data channelWrite response channelRead address channelRead data channel 3.測試4.仿真波形5.工程文件 參考手冊 《3-2-03米聯客2022版AXI4總線專題-20211123.pdf》 《IHI0022E_amba_…

在企業級項目中高效使用 Maven-mvnd

1、引言 1.1 什么是 Maven-mvnd? Maven-mvnd 是 Apache Maven 的一個實驗性擴展工具(也稱為 mvnd),基于守護進程(daemon)模型構建,目標是顯著提升 Maven 構建的速度和效率。它由 Red Hat 推出,通過復用 JVM 進程來減少每次構建時的啟動開銷。 1.2 為什么企業在構建過…

網絡字節序 - 大端

回顧主機字節序 - 大小端 發送主機將發送緩沖區中的數據按內存地址從低到高的順序發出接收主機把從網絡上接收到的數據按內存地址從底到高的順序依次保存到接收緩沖區TCP/IP 規定,網絡數據流應采用大端字節序,即低地址高字節,也就是說&#…

《被討厭的勇氣》書摘

阿德勒心理學考慮的不是過去的“原因”,而是現在的“目的”。你的朋友并不是因為不想到外面去,才制造出不安的情緒。是先有了“不出去”這個目的,之后才會為了達到這個目的而制造出不安或者恐懼之類的情緒。 個人見解:這是阿德勒…

打造專屬AI好友:小智AI聊天機器人詳解

打造專屬AI好友:小智AI聊天機器人詳解 在當下的科技熱潮中,AI正迅速改變著我們的生活,成為了科技領域的新寵。而今,借助開源項目的力量,你可以親手打造一個智能小助手——小智AI聊天機器人。它不僅是一個技術探索的窗…

如何利用爬蟲獲得1688商品詳情:實戰指南

在電商運營和市場分析中,獲取1688商品詳情數據是一項重要任務。本文將詳細介紹如何利用爬蟲技術獲取1688商品詳情,包括準備工作、爬蟲實現步驟以及注意事項。 一、準備工作 (一)注冊1688開放平臺賬號 在1688開放平臺注冊開發者…

如何優化系統啟動時間--基于米爾瑞薩MYD-YG2LX開發板

1.概述 MYD-YG2LX采用瑞薩RZ/G2L作為核心處理器,該處理器搭載雙核Cortex-A551.2GHzCortex-M33200MHz處理器,其內部集成高性能3D加速引擎Mail-G31 GPU(500MHz)和視頻處理單元(支持H.264硬件編解碼),16位的DDR4-1600 / DDR3L-1333內…

QML 圖像變換(縮放、平移、旋轉)

目錄 引言相關閱讀基礎知識工程結構核心代碼解析示例1:圖像縮放(ImageScale.qml)代碼說明運行效果 示例2:圖像平移(ImageTransform.qml)代碼說明運行效果 示例3:圖像旋轉(ImageRotat…

Linux 系統命令使用指南1

適用于 Red Hat / CentOS / Rocky Linux 等系統的基本初始化配置操作。 🔒 1. 關閉 SELinux(臨時生效) setenforce 0?? 注意:此命令僅臨時關閉 SELinux,重啟后可能恢復。要永久關閉,請修改 /etc/selinux…

1.2.1 Linux音頻系統發展歷程簡介

Linux音頻系統的發展經歷了從最初的簡單驅動到今天多層次、模塊化音頻架構。簡要梳理其主要歷程: 早期的OSS(Open Sound System) 在90年代及2000年代初,Linux主要使用OSS來支持音頻。OSS直接為硬件設備(如聲卡&#…