STM32 對射式紅外傳感器配置

這次用的是STM32F103的開發板(這里面的exti.c文件沒有how to use this driver 配置說明)

對射式紅外傳感器

由一個紅外發光二極管和NPN光電三極管組成,M3固定安裝孔,有輸出狀態指示燈,輸出高電平燈滅,輸出低電平燈亮。有遮擋,輸出高電平。無遮擋,輸出低電平。使用3.3-5VDC 寬電壓LM393比較器輸出,信號干凈,波形好,驅動能力強,超過15mA。輸出形式:數字開關量輸出(0和1)。廣泛用于電機轉速檢測,脈沖計數,位置限位等。

引腳:

VCC:接電源正極3.3V-5V

GND:接電源負極

DO:TTL開關信號輸出

AO:此模塊不起作用

操作說明:

1、接好VCC和GND,模塊電源指示燈會亮
2、模塊槽中無遮擋時,接收管導通,模塊DO輸出低電平,開關指示燈亮;遮擋時,DO輸出高電平,開關指示燈滅。
3、模塊DO可與繼電器相連,組成限位開關等功能,也可以與有源蜂鳴器模塊相連,組成報警器。
4、DO輸出接口可以與單片機10口直接相連,一般接外部中斷,檢測傳感器是否有遮檔,如用電機碼盤則可檢測電機的轉速。

原理:

測距離: 測速傳感器輸出為脈沖信號,一個脈沖中斷一次;紅外射線導通的時候是低電平,所以我們設置中斷為低電平觸法模式。一般碼盤上有整數格子,無論是多少格其實原理一樣,例如10格碼盤,也就是有10個空格子,電機轉一圈后便是射線導通10次,外部低電平觸法10次;安裝上面的思路,我們的測速傳感器就可以發揮出效果了,我們知道一圈就有10個中斷,于是我們計算中斷次數,得到的總次數除于10也就是電機轉動次數了,然后按照輪子的周長,計算輪子一圈是多長,就可以推算出小車已經跑多遠了。

測速度: 按照測距離的思路,我們用一個MCU定時器計算,1秒內接收多少個外部中斷,例如一秒內接收了20個外部中斷,我們就可以判斷小車速度為1秒小車輪子轉兩圈,然后再計算出小車輪子的周長,就可得知小車1秒行駛的速度。

接線圖:

代碼配置:

分為GPIO配置、中斷線與GPIO引腳的連接、EXTI配置、NVIC配置(與上一章的按鍵中斷一樣)

EXTI函數解析:

//調用它,就可以把EXTI的配置都清除,恢復成上電的默認的狀態
void EXTI_DeInit(void);//調用這個函數,就可以根據這個結構體里的參數配置EXTI外設,初始化EXTI要用到這個函數
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);//調用這個函數,可以把參數傳遞的結構體變量賦一個默認值
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);//這個函數是用來軟件觸發外部中斷的,調用這個函數,參數給一個指定的中斷線,就能軟件觸發一次外部中斷
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);

在外設運行的過程中,會產生一些狀態標志位 ? 比如外部中斷來了,會有一個掛起的寄存器置了一個標志位,對于其他外設,如串口收到數據,會置標志位,定時器時間到也會置標志位,這些標志位都是放在狀態寄存器的,當程序想要看這些標志位時,就會用到這四個函數

FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);//可以獲取指定的標志位是否被置1void EXTI_ClearFlag(uint32_t EXTI_Line);//可以對置1的標志位進行清除//在中斷函數里,如果你想查看標志位和清除標志位,用下面兩個函數
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);//獲取中斷標志位是否被置1void EXTI_ClearITPendingBit(uint32_t EXTI_Line);//清除中斷掛起標志位

總結:如果想要在主程序里查看和清除標志位,就用上面兩個函數。

???????????如果想要在中斷函數里查看和清除標志位,就用下面兩個函數。

NVIC函數解析:

//這個函數是用來中斷分組的,參數是中斷分組的方式
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);//根據結構體里面指定的參數初始化NVIC
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);//設置中斷向量表
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);//系統低功耗配置
void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState);

代碼:

void CountSensor_Init(void)
{//------------------------定義結構體變量-----------------------------------GPIO_InitTypeDef GPIO_InitStructure;								//定義GPIO結構體變量EXTI_InitTypeDef EXTI_InitStructure;								//定義EXTI結構體變量NVIC_InitTypeDef NVIC_InitStructure;								//定義NVIC結構體變量RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//開啟GPIO的時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);	//開啟AFIO的時鐘//---------------------GPIO配置--------------------------------------GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;			//模式選擇上拉輸入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;   			//配置引腳GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       //速率GPIO_Init(GPIOB,&GPIO_InitStructure);	                //GPIO初始化//---------------------GPIO配置--------------------------------------GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);//將中斷線與GPIO引腳連接//---------------------EXTI配置--------------------------------------EXTI_InitStructure.EXTI_Line = EXTI_Line14; 					//配置中斷線EXTI_InitStructure.EXTI_LineCmd =  ENABLE;  					//中斷使能EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; 	        //選擇中斷模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;         //下降沿觸發EXTI_Init(&EXTI_InitStructure);//---------------------EXTI配置--------------------------------------NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中斷分組,這里放到模塊函數里了,一般情況放在主函數第一行(如上一章按鍵中斷)//---------------------NVIC配置--------------------------------------NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;				//選擇中斷通道NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;					    //使能中斷通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;		    //搶占優先級配置NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;					//響應優先級配置NVIC_Init(&NVIC_InitStructure);//---------------------NVIC配置--------------------------------------}

中斷函數:

uint16_t CountSensor_Count;
//中斷函數
void EXTI15_10_IRQHandler(void)
{//判斷中斷標志位是否為 1 EXTI_GetITStatus的返回值為 SET(1)  或者RESET(0)if(EXTI_GetITStatus(EXTI_Line14) == SET){//判斷電平,以免發生抖動if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14) == 0){CountSensor_Count++;}//中斷標志位置1,程序就會跳轉到中斷函數,//如果不清除中斷標志位,就會一直申請中斷,這樣就會不斷響應中斷,執行中斷函數,//程序就會卡死在中斷函數里,所以每次中斷程序結束后,都應該清除一下中斷標志位EXTI_ClearITPendingBit(EXTI_Line14);}}//返回值
uint16_t CountSensor_Get(void)
{return CountSensor_Count;
}

主函數:

功能:擋住傳感器模塊槽,OLDE顯示數字變化+1

#include "CountSensor.h"
int main(void)
{LED_Init();OLED_Init();CountSensor_Init();OLED_ShowString(1, 1, "Count:");while(1){OLED_ShowNum(1, 7, CountSensor_Get(),5);}	}


?

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

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

相關文章

https數字簽名手動驗簽

以bing.com 為例 1. CA 層級的基本概念 CA 層級是一種樹狀結構,由多個層級的 CA 組成。每個 CA 負責為其下一層級的實體(如子 CA 或終端實體)頒發證書。層級結構的頂端是 根 CA(Root CA),它是整個 PKI 體…

【自然語言處理(NLP)】深度循環神經網絡(Deep Recurrent Neural Network,DRNN)原理和實現

文章目錄 介紹深度循環神經網絡(DRNN)原理和實現結構特點工作原理符號含義公式含義 應用領域優勢與挑戰DRNN 代碼實現 個人主頁:道友老李 歡迎加入社區:道友老李的學習社區 介紹 **自然語言處理(Natural Language Pr…

Niagara學習筆記

橙色 發射器 , 綠色 粒子, 紅色 渲染器 Emitter State 發射器狀態 Life Cycle Mode(生命周期模式) 選擇Self就是發射器自身管理生命周期 Loop Behavior 決定粒子發射次數 一次(Once):發射器只播放一次多次&#…

17 一個高并發的系統架構如何設計

高并發系統的理解 第一:我們設計高并發系統的前提是該系統要高可用,起碼整體上的高可用。 第二:高并發系統需要面對很大的流量沖擊,包括瞬時的流量和黑客攻擊等 第三:高并發系統常見的需要考慮的問題,如內存不足的問題,服務抖動的…

2025數學建模美賽|F題成品論文

國家安全政策與網絡安全 摘要 隨著互聯網技術的迅猛發展,網絡犯罪問題已成為全球網絡安全中的重要研究課題,且網絡犯罪的形式和影響日益復雜和嚴重。本文針對網絡犯罪中的問題,基于多元回歸分析和差異中的差異(DiD)思…

適配Android16

Android16新特性 Android 16帶來了許多新特性和改進,提升了系統的流暢度、用戶體驗和安全性。對于應用開發者來說,適配Android 16可以確保應用在該版本上的兼容性和性能,同時也可以利用其新特性為用戶提供更好的服務。以下是Android 16的一些…

【C++數論】880. 索引處的解碼字符串|2010

本文涉及知識點 數論:質數、最大公約數、菲蜀定理 LeetCode880. 索引處的解碼字符串 給定一個編碼字符串 s 。請你找出 解碼字符串 并將其寫入磁帶。解碼時,從編碼字符串中 每次讀取一個字符 ,并采取以下步驟: 如果所讀的字符是…

【MQ】如何保證消息隊列的高可用?

RocketMQ NameServer集群部署 Broker做了集群部署 主從模式 類型:同步復制、異步復制 主節點返回消息給客戶端的時候是否需要同步從節點 Dledger:要求至少消息復制到半數以上的節點之后,才給客戶端返回寫入成功 slave定時從master同步數據…

ESP32 I2S音頻總線學習筆記(二):I2S讀取INMP441音頻數據

簡介 在這個系列的上一篇文章中,我們介紹了ESP32 I2S音頻總線的相關知識,簡要了解了什么是I2S總線、它的通信格式,以及相關的底層API函數。沒有看過上篇文章的可以點擊文章進行回顧: ESP32 I2S音頻總線學習筆記(一&a…

EasyExcel使用詳解

文章目錄 EasyExcel使用詳解一、引言二、環境準備與基礎配置1、添加依賴2、定義實體類 三、Excel 讀取詳解1、基礎讀取2、自定義監聽器3、多 Sheet 處理 四、Excel 寫入詳解1、基礎寫入2、動態列與復雜表頭3、樣式與模板填充 五、總結 EasyExcel使用詳解 一、引言 EasyExcel 是…

objection的簡單使用

objection環境配置 下載以下版本 objection1.11.0 frida-tools9.2.4 python3.8.8 報錯的話看這里: 在這個網站下載frida-tools14.2.18的離線包Links for frida 然后放入C:\Users\Asus\frida-14.2.18-py3.8-win-amd64.egg文件夾下 執行poetry add frida-tools14.2.18 ob…

危機13小時:追蹤一場GitHub投毒事件

事件概要 自北京時間 2024.12.4 晚間6點起, GitHub 上不斷出現“幽靈倉庫”,倉庫中沒有任何代碼,只有誘導性的病毒文件。當天,他們成為了 GitHub 上 star 增速最快的倉庫。超過 180 個虛假僵尸賬戶正在傳播病毒,等待不…

【Redis】緩存+分布式鎖

目錄 緩存 Redis最主要的使用場景就是作為緩存 緩存的更新策略: 1.定期生成 2.實時生成 面試重點: 緩存預熱(Cache preheating): 緩存穿透(Cache penetration) 緩存雪崩 (Cache avalan…

記錄 | MaxKB創建本地AI智能問答系統

目錄 前言一、重建MaxKBStep1 復制路徑Step2 刪除MaxKBStep3 創建數據存儲文件夾Step4 重建 二、創建知識庫Step1 新建知識庫Step2 下載測試所用的txtStep3 上傳本地文檔Step4 選擇模型補充智譜的API Key如何獲取 Step5 查看是否成功 三、創建應用Step1 新建應用Step2 配置AI助…

C#新語法

目錄 頂級語句(C#9.0) using 全局using指令(C#10.0) using資源管理問題 using聲明(C#8.0) using聲明陷阱 錯誤寫法 正確寫法 文件范圍的命名空間聲明(C#10.0) 可空引用類型…

基于dlib/face recognition人臉識別推拉流實現

目錄 一.環境搭建 二.推拉流代碼 三.人臉檢測推拉流 一.環境搭建 1.下載RTSP服務器MediaMTX與FFmpeg FFmpeg是一款功能強大的開源多媒體處理工具,而MediaMTX則是一個輕量級的流媒體服務器。兩者結合,可以實現將本地視頻或者實時攝像頭畫面推送到RTSP流,從而實現視頻…

Couchbase UI: Analytics

Couchbase 的 Analytics 頁面是用于執行分析查詢的部分,允許用戶對存儲在 Couchbase 中的數據進行復雜的分析和聚合。Analytics 提供了 SQL-like 查詢語言(N1QL for Analytics),使得用戶能夠輕松地執行數據分析任務。以下是關于 C…

梯度下降優化算法-Adam

Adam(Adaptive Moment Estimation)是一種結合了動量法(Momentum)和 RMSProp 的自適應學習率優化算法。它通過計算梯度的一階矩(均值)和二階矩(未中心化的方差)來調整每個參數的學習率…

論文筆記(六十三)Understanding Diffusion Models: A Unified Perspective(六)(完結)

Understanding Diffusion Models: A Unified Perspective(六)(完結) 文章概括指導(Guidance)分類器指導無分類器引導(Classifier-Free Guidance) 總結 文章概括 引用: …

【PySide6快速入門】信號與槽的使用

文章目錄 前言什么是信號與槽信號與槽的功能最簡單的信號與槽控件連接信號與信號的連接總結 前言 在 PySide6 中,信號與槽機制是核心概念之一,它是 Qt 庫中事件通信的基礎。通過信號與槽,開發者能夠實現不同組件之間的解耦,從而使…