【STM32】ADC功能-單通道多通道(學習筆記)

本章結合上一節內容復習更好理解【江協科技STM32】ADC數模轉換器-學習筆記-CSDN博客

一、ADC單通道

?接線圖

ADC初始化??

①RCC開啟時鐘,包括ADC和GPIO的時鐘,另外ADCCLK的分頻器也要配置

②配置GPIO,,把需要用的GPIO配置成模擬輸入模式(GPIO_Mode_AIN模式下GPIO無效,即斷開GPIO,防止GPIO輸入輸出對我模擬電壓造成干擾),所以AIN模式就是ADC專屬模式

?③配置多路開關,把左邊通道接入到右邊的規則組列表里

④配置ADC轉換器(初始化ADC),一個結構體可以配置完ADC轉換器和AD數據寄存器

⑤開關控制,調用ADC_Cmd()函數,開啟ADC?

代碼:?

void AD_Init(void)
{/*開啟時鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);	//開啟ADC1的時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//開啟GPIOA的時鐘/*設置ADC時鐘*/RCC_ADCCLKConfig(RCC_PCLK2_Div6);						//選擇時鐘6分頻,ADCCLK = 72MHz / 6 = 12MHz/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);					//將PA0引腳初始化為模擬輸入/*規則組通道配置*/ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);		//規則組序列1的位置,配置為通道0/*ADC初始化*/ADC_InitTypeDef ADC_InitStructure;						//定義結構體變量ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;		//模式,選擇獨立模式,即單獨使用ADC1ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;	//數據對齊,選擇右對齊ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	//外部觸發,使用軟件觸發,不需要外部觸發ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;		//連續轉換,失能,每轉換一次規則組序列后停止ADC_InitStructure.ADC_ScanConvMode = DISABLE;			//掃描模式,失能,只轉換規則組的序列1這一個位置ADC_InitStructure.ADC_NbrOfChannel = 1;					//通道數,為1,僅在掃描模式下,才需要指定大于1的數,在非掃描模式下,只能是1ADC_Init(ADC1, &ADC_InitStructure);						//將結構體變量交給ADC_Init,配置ADC1/*ADC使能*/ADC_Cmd(ADC1, ENABLE);									//使能ADC1,ADC開始運行/*ADC校準*/ADC_ResetCalibration(ADC1);								//固定流程,內部有電路會自動執行校準while (ADC_GetResetCalibrationStatus(ADC1) == SET);ADC_StartCalibration(ADC1);while (ADC_GetCalibrationStatus(ADC1) == SET);
}

函數解釋:?

void RCC_ADCCLKConfig(uint32_t RCC_PCLK2)?//配置ADC時鐘(ADCCLK)

參數說明
RCC_PCLK2定義ADC時鐘分頻器。這個鐘是由APB2時鐘(PCLK2)

void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct)//根據指定的參數初始化ADCx外設在ADC_InitStruct

參數說明
ADCx其中x可為1、2或3,選擇ADC外設
ADC_InitStruct指向ADC_InitTypeDef結構體的指針指定ADC外設的配置信息

?ADC初始化結構定義

參數說明
ADC_Mode將ADC配置為獨立或操作雙模式
ADC_ScanConvMode指定轉換是在Scan(多通道)模式還是Single(單通道)模式下執行,可選“ENABLE”或“DISABLE”,“ENABLE”是掃描,“DISABLE”是非掃描?
ADC_ContinuousConvMode指定轉換是在連續模式還是單模式下執行,可選“ENABLE”或“DISABLE”,“ENABLE”是連續轉換模式,“DISABLE”是單次轉換模式
ADC_ExternalTrigConv定義用于啟動模擬的外部觸發器對常規信道進行數字轉換
ADC_DataAlign指定ADC數據是左對齊還是右對齊
ADC_NbrOfChannel指定要轉換的ADC通道的數量使用順序器為常規通道組,取值范圍為1 ~ 16

void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)//啟用或禁用所選ADC軟件啟動轉換

參數說明
ADCx其中x可以是1、2或3來選擇ADC外設
NewState所選ADC軟件啟動轉換的新狀態,取值為:ENABLE或DISABLE

void ADC_ResetCalibration(ADC_TypeDef* ADCx);//重置所選ADC校準寄存器
FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);//獲取所選ADC復位校準寄存器狀態
void ADC_StartCalibration(ADC_TypeDef* ADCx);啟動選定的ADC校準過程
FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);獲取所選ADC校準狀態

使用方法:固定流程,內部有電路會自動執行校準
?? ?ADC_ResetCalibration(ADC1);?? ??? ??? ??? ??? ??? ??? ??? ?
?? ?while (ADC_GetResetCalibrationStatus(ADC1) == SET);//如果SET(1)一直循環,如果RESET(0)校準完成,跳出循環
?? ?ADC_StartCalibration(ADC1);
?? ?while (ADC_GetCalibrationStatus(ADC1) == SET);?

?FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG)//檢查是否設置了指定的ADC標志

作用:想知道轉換是否結束就調用此函數,后一個參數給EOC標志位,判斷是不是置1,如果轉換結束,跳出循環,標志位置1;否則一直在循環中轉換。

參數說明
ADCx其中x可以是1、2或3來選擇ADC外設
ADC_FLAG指定要檢查的標志

返回值:ADC_FLAG的新狀態(SET或RESET)?1或0

返回的SET或RESET和轉換是否完成的對應關系如下:

?具體等待多長時間:用最后一條公式算

void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime)//為所選ADC配置其對應的常規通道排序器和它的采樣時間

參數說明
ADCx

其中x可以是1、2或3來選擇ADC外設

Rank常規組測序器中的秩。取值范圍為1 ~ 16
ADC_Channel要配置的ADC通道
ADC_SampleTime要為所選通道設置的采樣時間值

?Rank對應:?

?ADC_Channel:?

?ADC_SampleTime:

?uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx)//返回常規通道的最后一次ADCx轉換結果數據

寫入參數:?可以是1、2或3來選擇ADC外設

返回值:Data轉換值

?獲取AD轉換的值

uint16_t AD_GetValue(void)
{ADC_SoftwareStartConvCmd(ADC1, ENABLE);					//軟件觸發AD轉換一次while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);	//等待EOC標志位,即等待AD轉換結束return ADC_GetConversionValue(ADC1);					//讀數據寄存器,得到AD轉換的結果
}

?main函數

讀取電壓值:只需要對數據進行一個線性變換,用AD值?/ 4095 * 3.3?,就可以將0~4095轉換為0~3V電壓,這里的ADValue是個整數值,在除以4095后會舍棄掉小數值,會導致計算錯誤,所以要將ADValue做一個類型強制轉換。

?(uint16_t)(Voltage * 100) % 100, 2) //Voltage*100擴大100倍,1.23變成123,然后對100取余,123對100取余就是23,這就把小數部分取出來了。由于浮點數不能取余,所以要做強制類型轉換變成整數。

uint16_t ADValue;			//定義AD值變量
float Voltage;				//定義電壓變量int main(void)
{/*模塊初始化*/OLED_Init();			//OLED初始化AD_Init();				//AD初始化/*顯示靜態字符串*/OLED_ShowString(1, 1, "ADValue:");OLED_ShowString(2, 1, "Voltage:0.00V");while (1){ADValue = AD_GetValue();					//獲取AD轉換的值Voltage = (float)ADValue / 4095 * 3.3;		//將AD值線性變換到0~3.3的范圍,表示電壓OLED_ShowNum(1, 9, ADValue, 4);				//顯示AD值OLED_ShowNum(2, 9, Voltage, 1);				//顯示電壓值的整數部分OLED_ShowNum(2, 11, (uint16_t)(Voltage * 100) % 100, 2);	//顯示電壓值的小數部分Delay_ms(100);			//延時100ms,手動增加一些轉換的間隔時間}
}

?二、ADC多通道

ADC初始化?

也是用單次轉換非掃描模式,只需要在每次觸發轉換之前手動修改列表第一個位置的通道就可以了。比如在第一次轉換寫入通道0,之后觸發、等待、讀值;然后在第二次轉換寫入通道1,之后觸發、等待、讀值;然后在第三次轉換寫入通道2,之后觸發、等待、讀值;在轉換前指定一下通道,在啟動轉換,就可以實現多通道功能了。

void AD_Init(void)
{/*開啟時鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);	//開啟ADC1的時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//開啟GPIOA的時鐘/*設置ADC時鐘*/RCC_ADCCLKConfig(RCC_PCLK2_Div6);						//選擇時鐘6分頻,ADCCLK = 72MHz / 6 = 12MHz/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);					//將PA0、PA1、PA2和PA3引腳初始化為模擬輸入/*不在此處配置規則組序列,而是在每次AD轉換前配置,這樣可以靈活更改AD轉換的通道*//*ADC初始化*/ADC_InitTypeDef ADC_InitStructure;						//定義結構體變量ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;		//模式,選擇獨立模式,即單獨使用ADC1ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;	//數據對齊,選擇右對齊ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	//外部觸發,使用軟件觸發,不需要外部觸發ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;		//連續轉換,失能,每轉換一次規則組序列后停止ADC_InitStructure.ADC_ScanConvMode = DISABLE;			//掃描模式,失能,只轉換規則組的序列1這一個位置ADC_InitStructure.ADC_NbrOfChannel = 1;					//通道數,為1,僅在掃描模式下,才需要指定大于1的數,在非掃描模式下,只能是1ADC_Init(ADC1, &ADC_InitStructure);						//將結構體變量交給ADC_Init,配置ADC1/*ADC使能*/ADC_Cmd(ADC1, ENABLE);									//使能ADC1,ADC開始運行/*ADC校準*/ADC_ResetCalibration(ADC1);								//固定流程,內部有電路會自動執行校準while (ADC_GetResetCalibrationStatus(ADC1) == SET);ADC_StartCalibration(ADC1);while (ADC_GetCalibrationStatus(ADC1) == SET);
}

獲取AD轉換值?

uint16_t AD_GetValue(uint8_t ADC_Channel)
{ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5);	//在每次轉換前,根據函數形參靈活更改規則組的通道1ADC_SoftwareStartConvCmd(ADC1, ENABLE);					//軟件觸發AD轉換一次while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);	//等待EOC標志位,即等待AD轉換結束return ADC_GetConversionValue(ADC1);					//讀數據寄存器,得到AD轉換的結果
}

main函數

uint16_t AD0, AD1, AD2, AD3;	//定義AD值變量int main(void)
{/*模塊初始化*/OLED_Init();				//OLED初始化AD_Init();					//AD初始化/*顯示靜態字符串*/OLED_ShowString(1, 1, "AD0:");OLED_ShowString(2, 1, "AD1:");OLED_ShowString(3, 1, "AD2:");OLED_ShowString(4, 1, "AD3:");while (1){AD0 = AD_GetValue(ADC_Channel_0);		//單次啟動ADC,轉換通道0AD1 = AD_GetValue(ADC_Channel_1);		//單次啟動ADC,轉換通道1AD2 = AD_GetValue(ADC_Channel_2);		//單次啟動ADC,轉換通道2AD3 = AD_GetValue(ADC_Channel_3);		//單次啟動ADC,轉換通道3OLED_ShowNum(1, 5, AD0, 4);				//顯示通道0的轉換結果AD0OLED_ShowNum(2, 5, AD1, 4);				//顯示通道1的轉換結果AD1OLED_ShowNum(3, 5, AD2, 4);				//顯示通道2的轉換結果AD2OLED_ShowNum(4, 5, AD3, 4);				//顯示通道3的轉換結果AD3Delay_ms(100);			//延時100ms,手動增加一些轉換的間隔時間}
}

?代碼源自學習江協科技

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

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

相關文章

基于YOLO11深度學習的運動品牌LOGO檢測與識別系統【python源碼+Pyqt5界面+數據集+訓練代碼】

《------往期經典推薦------》 一、AI應用軟件開發實戰專欄【鏈接】 項目名稱項目名稱1.【人臉識別與管理系統開發】2.【車牌識別與自動收費管理系統開發】3.【手勢識別系統開發】4.【人臉面部活體檢測系統開發】5.【圖片風格快速遷移軟件開發】6.【人臉表表情識別系統】7.【…

當前主流的大模型訓練與推理框架的全面匯總

以下是當前主流的大模型訓練與推理框架的全面匯總 以下是更新后包含 SGLang 的大模型訓練與推理框架列表,并對分類和示例進行了優化: 一、通用深度學習推理框架 TensorRT-LLM 特點:NVIDIA推出的針對Transformer類模型的優化框架,支…

Linux學習(八)(服務管理(檢查服務狀態,開始/停止服務,檢查服務日志,創建新服務))

服務管理 Linux 中的服務管理是指控制 Linux 在啟動和關閉計算機的過程中啟動和停止的服務(或“守護程序”)的系統。這些服務執行各種功能,并提供未附加到用戶界面的進程。 Linux 系統,尤其是系統管理員,通常需要管理…

ElasticSearch 分詞器介紹及測試:Standard(標準分詞器)、English(英文分詞器)、Chinese(中文分詞器)、IK(IK 分詞器)

ElasticSearch 分詞器介紹及測試:Standard(標準分詞器)、English(英文分詞器)、Chinese(中文分詞器)、IK(IK 分詞器) ElasticSearch 分詞器介紹及測試1. Standard Analyz…

【計算機網絡】確認家庭網絡是千兆/百兆帶寬并排查問題

要確認你的帶寬是千兆(1000Mbps)還是百兆(100Mbps),可以通過以下方法逐步排查: 一、檢查物理設備 1. 查看路由器和光貓的網口 千兆網口:路由器或光貓的網口旁通常會標注 “10/100/1000M” 或 …

[數據分享第七彈]全球洪水相關數據集

洪水是一種常見的自然災害,在全球范圍內造成了極為嚴重的威脅。近年來,針對洪水事件的檢測分析,以及對于洪水災害和災后恢復能力的研究日漸增多,也產生了眾多洪水數據集。今天,我們一起來收集整理一下相關數據集。&…

深入探討AI-Ops架構 第一講 - 運維的進化歷程以及未來發展趨勢

首先,讓我們一起回顧運維的進化之路,然后再深入探討AI-Ops架構的細節。 運維的進化歷程 1. AI 大范圍普及前的運維狀態 (傳統運維) 在AI技術尚未廣泛滲透到運維領域之前,我們稱之為傳統運維,其主要特點是: 人工驅動…

Hive-數據傾斜優化

數據傾斜的原因 1)key分布不均勻,本質上就是業務數據有可能會存在傾斜 2)某些SQL語句本身就有數據傾斜 關鍵詞 情形 后果 Join A、其中一個表較小,但是key集中; B、兩張表都是大表,key不均 分發到…

番外篇 - Docker的使用

一、Docker的介紹 Docker 是一個開源的應用容器引擎,基于 Go 語言 并遵從Apache2.0協議開源。 Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。 容器是完…

深度學習與普通神經網絡有何區別?

深度學習與普通神經網絡的主要區別體現在以下幾個方面: 一、結構復雜度 普通神經網絡:通常指淺層結構,層數較少,一般為2-3層,包括輸入層、一個或多個隱藏層、輸出層。深度學習:強調通過5層以上的深度架構…

RuleOS:區塊鏈開發的“新引擎”,點燃Web3創新之火

RuleOS:區塊鏈開發的“新引擎”,點燃Web3創新之火 在區塊鏈技術的浪潮中,RuleOS宛如一臺強勁的“新引擎”,為個人和企業開發去中心化應用(DApp)注入了前所未有的動力。它以獨特的設計理念和強大的功能特性&…

c# MimeEntity修改郵件附件名稱

在C#中,當你使用如MimeKit庫來處理電子郵件時,你可以通過修改MimeEntity的ContentDisposition屬性來更改郵件附件的名稱。以下是如何做到這一點的步驟: 1. 添加MimeKit引用 首先,確保你的項目中已經添加了MimeKit庫。如果你使用…

Windows編譯環境搭建(MSYS2\MinGW\cmake)

我的音視頻/流媒體開源項目(github) 一、基礎環境搭建 1.1 MSYS2\MinGW 參考:1. 基于MSYS2的Mingw-w64 GCC搭建Windows下C開發環境_msys2使用mingw64編譯 在Widndows系統上,使用gcc工具鏈(g)進行C程序開發?可以的&a…

TikTok美國戰略升級:聚焦美食旅行,本地化服務如何重塑市場格局

平臺深耕本土內容生態,餐飲旅游創作者迎流量紅利,算法推薦機制激發地域經濟新活力 過去一年,TikTok在美國市場的動作頻頻引發行業關注。從早期以娛樂、舞蹈為主的全球化內容,到如今將資源向美食、旅行兩大垂類傾斜,這…

Unity Dots環境配置

文章目錄 前言環境配置1.新建Unity 工程2.安裝Entities包2.安裝EntitiesGraphics包3.安裝URP渲染管線 Dots窗口 前言 DOTS(Data-Oriented Technology Stack)是Unity推出的一種用于開發高性能游戲和應用的數據導向技術棧,包含三大核心組件&am…

manus對比ChatGPT-Deep reaserch進行研究類學術相關數據分析!誰更勝一籌?

沒有賬號,只能挑選一個案例 一夜之間被這個用全英文介紹全華班出品的新爆款國產AI產品的小胖刷頻。白天還沒有切換語言的選項,晚上就加上了。簡單看了看團隊夠成,使用很長實踐的Monica創始人也在其中。逐漸可以理解,重心放在海外產…

Python項目-基于Django的在線教育平臺開發

1. 項目概述 在線教育平臺已成為現代教育的重要組成部分,特別是在后疫情時代,遠程學習的需求顯著增加。本文將詳細介紹如何使用Python的Django框架開發一個功能完善的在線教育平臺,包括系統設計、核心功能實現以及部署上線等關鍵環節。 本項…

【自學筆記】Numpy基礎知識點總覽-持續更新

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 Numpy基礎知識點總覽目錄1. 簡介Numpy是什么為什么使用Numpy 2. 數組對象(ndarray)創建數組數組的屬性數組的形狀操作 3. 數組的基本操作數組…

Kubernetes中的 iptables 規則介紹

#作者:鄧偉 文章目錄 一、Kubernetes 網絡模型概述二、iptables 基礎知識三、Kubernetes 中的 iptables 應用四、查看和調試 iptables 規則五、總結 在 Kubernetes 集群中,iptables 是一個核心組件, 用于實現服務發現和網絡策略。iptables 通…

.NET Core全屏截圖,C#全屏截圖

.NET Core全屏截圖,C#全屏截圖 使用框架: WPF.NET 8 using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Linq; using System.Text; using System.Threading.Tasks; using System.W…