基于HAL庫的STM32-ADC學習(附帶代碼)

1.前言

STM32ADC是一種模擬/數字轉換器,可以將模擬信號轉換為數字信號。STM32ADC有多個通道,可以選擇不同的輸入源、轉換模式、觸發方式和采樣時間。STM32ADC的轉換結果可以通過中斷、DMA或者寄存器讀取。

在本文中,我將介紹如何使用STM32CubeMX和HAL庫配置和使用STM32ADC,以及如何編寫一個簡單的ADC轉換的代碼實例。我將使用STM32F103C8T6開發板作為硬件平臺,使用PC0作為ADC1的通道10輸入,使用ADC1的通道16作為內部溫度傳感器輸入。我將使用Keil uVision5作為編譯器和調試器。

2.STM32CubeMX配置

1.首先,我們需要使用STM32CubeMX工具來生成初始化代碼和配置文件。STM32CubeMX是一個圖形化的軟件配置工具,可以幫助我們快速設置STM32的外設和時鐘。

2.打開STM32CubeMX后,我們選擇New Project,然后在MCU Selector中搜索并選擇STM32F103C8T6芯片。

3.然后,我們在Pinout & Configuration選項卡中,配置ADC1的通道10和通道16。我們將PC0設置為模擬輸入模式,即ADC_IN10。我們將ADC1的通道16設置為內部溫度傳感器

4.接下來,我們在ADC1選項卡中,配置ADC1的參數。我們將ADC1的時鐘設置為PCLK2/6,即10MHz,因為ADC1的最大時鐘不能超過14MHz。我們將ADC1的分辨率設置為12位,即最高精度。我們將ADC1的數據對齊方式設置為右對齊,即低位有效。我們將ADC1的轉換模式設置為連續轉換,即轉換結束后自動開始下一次轉換。我們將ADC1的掃描模式設置為使能,即掃描所有被選擇的通道。我們將ADC1的DMA模式設置為使能,即使用DMA傳輸轉換結果。我們將ADC1的規則通道組的轉換順序設置為通道10和通道16,即先轉換PC0的輸入,再轉換溫度傳感器的輸入。我們將ADC1的規則通道組的采樣時間設置為239.5個周期,即最長的采樣時間,以提高轉換精度。我們將ADC1的注入通道組的轉換順序和采樣時間設置為默認值,因為我們不使用注入通道組。我們將ADC1的中斷設置為禁止,因為我們使用DMA模式。我們將ADC1的模擬看門狗設置為禁止,因為我們不需要監測輸入電壓的閾值。

5.最后,我們在Project Manager選項卡中,設置工程的名稱、位置、工具鏈等信息。我們選擇Keil uVision5作為IDE,選擇STM32F1xx_HAL_Driver作為硬件抽象層,選擇NoRTOS作為操作系統,選擇Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral作為代碼生成選項。我

點擊GENERATE CODE按鈕,STM32CubeMX就會為我們生成初始化代碼和配置文件,并自動打開Keil uVision5。

3.Keil uVision5編譯和調試

在Keil uVision5中,我們可以看到STM32CubeMX生成的工程結構,我們主要關注的是main.c文件,這里是我們的主程序代碼。我們可以看到STM32CubeMX已經為我們生成了一些函數,包括:

  • SystemClock_Config():配置系統時鐘,使用外部8MHz晶振,使得HCLK為72MHz,PCLK1為36MHz,PCLK2為72MHz。
  • MX_GPIO_Init():初始化GPIO,設置PC0為模擬輸入模式。
  • MX_DMA_Init():初始化DMA,設置DMA1通道1為ADC1的傳輸通道,傳輸方向為外設到內存,傳輸模式為循環模式,傳輸數據寬度為半字,傳輸數據長度為2,傳輸優先級為高,傳輸地址遞增模式為內存遞增。
  • MX_ADC1_Init():初始化ADC1,設置時鐘為PCLK2/6,分辨率為12位,數據對齊方式為右對齊,轉換模式為連續轉換,掃描模式為使能,DMA模式為使能,規則通道組的轉換順序為通道10和通道16,規則通道組的采樣時間為239.5個周期。

我們只需要在USER CODE區域添加我們自己的代碼即可。我們的主要任務是:

  • 定義一個數組,用于存儲DMA傳輸的ADC轉換結果。
  • 啟動DMA傳輸。
  • 啟動ADC轉換。
  • 計算溫度傳感器的溫度值。
  • 在調試窗口顯示溫度值。

我們的代碼如下:

/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes *//* Private variables ---------------------------------------------------------*/
ADC_HandleTypeDef hadc1;
DMA_HandleTypeDef hdma_adc1;/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint16_t adc_value[2]; //定義一個數組,用于存儲DMA傳輸的ADC轉換結果
float temperature; //定義一個浮點變量,用于存儲溫度值
/* USER CODE END PV *//* USER CODE BEGIN 0 */
//重定向printf函數到ITM調試窗口
int fputc(int ch, FILE *f)
{ITM_SendChar(ch);return(ch);
}
/* USER CODE END 0 */int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_ADC1_Init();/* USER CODE BEGIN 2 */HAL_ADCEx_Calibration_Start(&hadc1); //啟動ADC校準HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_value, 2); //啟動DMA傳輸,傳輸地址為adc_value數組,傳輸長度為2/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */temperature = ((float)adc_value[1]) / 4095 * 3.3; //計算溫度傳感器的電壓值,單位為Vtemperature = (temperature - 0.76) / 0.0025 + 25; //計算溫度值,單位為攝氏度printf("The temperature is %.2f C\r\n", temperature); //在調試窗口打印溫度值,保留兩位小數HAL_Delay(1000); //延時1秒}/* USER CODE END 3 */
}

4.STM32ADC的應用場景

STM32ADC可以用于測量模擬信號的電壓值,例如傳感器的輸出、電池的電壓、電位器的位置等。STM32ADC還可以用于測量內部的溫度傳感器、參考電壓和電流。STM32ADC的轉換結果可以用于控制、顯示、存儲或者傳輸等目的。

STM32ADC的應用場景有很多,例如:

  • 溫度控制:我們可以使用STM32ADC測量溫度傳感器的輸出電壓,然后根據溫度值來控制風扇、加熱器或者空調等設備,實現溫度的調節和保持。
  • 電壓檢測:我們可以使用STM32ADC測量電池或者電源的電壓,然后根據電壓值來判斷電池的剩余電量或者電源的穩定性,實現電源的管理和保護。
  • 信號處理:我們可以使用STM32ADC采樣模擬信號,然后對采樣結果進行數字信號處理,實現信號的濾波、放大、調制、解調等功能。
  • 數據采集:我們可以使用STM32ADC采集多個模擬信號,然后將采集結果存儲在內存或者外部存儲器中,實現數據的記錄和分析。
  • 人機交互:我們可以使用STM32ADC測量電位器或者滑動變阻器的位置,然后根據位置值來控制LED、LCD或者音頻等設備,實現人機的交互和反饋。

以上只是STM32ADC的一些常見的應用場景,實際上STM32ADC的應用范圍是非常廣泛的,只要有模擬信號的存在,就可以使用STM32ADC來進行轉換和處理。

5.STM32ADC的注意事項

在使用STM32ADC時,我們需要注意以下幾點:

  • STM32ADC的輸入電壓范圍是0V到VREF+,其中VREF+是參考電壓,通常是3.3V或者內部的1.2V。如果輸入電壓超過VREF+,會導致ADC的損壞或者轉換結果的不準確。
  • STM32ADC的轉換精度和分辨率有關,分辨率越高,精度越高,但是轉換時間越長。STM32ADC的分辨率可以選擇6位、8位、10位或者12位,我們需要根據應用的需求來選擇合適的分辨率。
  • STM32ADC的轉換速度和采樣時間有關,采樣時間越長,轉換速度越慢,但是轉換精度越高。STM32ADC的采樣時間可以選擇1.5個周期到239.5個周期,我們需要根據輸入信號的特性來選擇合適的采樣時間。
  • STM32ADC的轉換模式可以選擇單次轉換、連續轉換、掃描轉換或者注入轉換,我們需要根據應用的需求來選擇合適的轉換模式。單次轉換只轉換一次,需要軟件或者硬件觸發;連續轉換不斷地重復轉換,無需觸發;掃描轉換按照設定的順序轉換多個通道,需要觸發;注入轉換可以在規則轉換的間隙插入轉換特定的通道,需要觸發。
  • STM32ADC的觸發方式可以選擇軟件觸發、外部觸發或者內部觸發,我們需要根據應用的需求來選擇合適的觸發方式。軟件觸發是通過寫入寄存器來啟動轉換;外部觸發是通過外部的信號來啟動轉換,例如定時器、外部中斷等;內部觸發是通過內部的事件來啟動轉換,例如模擬看門狗、注入結束等。
  • STM32ADC的數據傳輸方式可以選擇中斷、DMA或者寄存器讀取,我們需要根據應用的需求來選擇合適的數據傳輸方式。中斷方式是通過中斷服務程序來處理轉換結果,適合低速或者低頻的轉換;DMA方式是通過DMA控制器來傳輸轉換結果,適合高速或者高頻的轉換;寄存器讀取方式是通過讀取寄存器來獲取轉換結果,適合單次或者簡單的轉換。

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

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

相關文章

第九屆大數據與計算國際會議 (ICBDC 2024) 即將召開!

2024年第九屆大數據與計算國際會議&#xff08;ICBDC 2024&#xff09;將于2024年5月24至26日在泰國曼谷舉行。本次會議由朱拉隆功大學工程學院工業工程系主辦。ICBDC 2024的宗旨是展示大數據和計算主題相關科學家的最新研究和成果&#xff0c;為來自不同地區的專家代表們提供一…

嵌入式學習筆記總結Day23----minshell項目總結

今天進行了linux系統高級編程io階段學習的結尾&#xff0c;完成了一個minshell的小項目。 一、項目介紹 利用Linux中IO接口實現MiniShell&#xff0c;實現常用的shell指令的實現。 項目想要實現需要思考的地方有&#xff1a; 1.如何打印終端命令 2.如何接受終端命令 3.實現對…

Sora - 探索AI視頻模型的無限可能-官方報告解讀與思考

一、引言 最近SORA火爆刷屏&#xff0c;我也忍不住找來官方報告分析了一下&#xff0c;本文將深入探討OpenAI最新發布的Sora模型。Sora模型不僅僅是一個視頻生成器&#xff0c;它代表了一種全新的數據驅動物理引擎&#xff0c;能夠在虛擬世界中模擬現實世界的復雜現象。本文將重…

[力扣 Hot100]Day33 排序鏈表

題目描述 給你鏈表的頭結點 head &#xff0c;請將其按 升序 排列并返回 排序后的鏈表 。 出處 思路 歸并排序即可。 代碼 class Solution { public:ListNode* merge(ListNode *h1,ListNode *h2) {ListNode *head nullptr;if(h1->val<h2->val){head h1;h1h1-…

2024.2.22 C++QT 作業

思維導圖 練習題 1>完善對話框&#xff0c;點擊登錄對話框&#xff0c;如果賬號和密碼匹配&#xff0c;則彈出信息對話框&#xff0c;給出提示”登錄成功“&#xff0c;提供一個Ok按鈕&#xff0c;用戶點擊Ok后&#xff0c;關閉登錄界面&#xff0c;跳轉到其他界面。如果賬…

Stream、Collections、Collectors用法

當涉及Java編程中的集合處理時&#xff0c;Stream、Collections和Collectors是三個常用的工具。以下是它們各自的主要功能和使用的一些方法的概要&#xff1a; Stream&#xff1a; 概要&#xff1a;Stream 是 Java 8 引入的一個強大工具&#xff0c;用于處理集合數據的流式操作…

Vue響應式狀態ref()與reactive()

1. ref()聲明響應式狀態 <template><!--在DOM元素調用變量時,不需要指定輸出變量的value,因為Vue會幫你輸出.value但是注意,這個幫助只會幫助頂級的ref屬性才會被解包--><div>{{ count }}</div><div>{{ object }}</div><div>{{ arr…

git切換倉庫地址

已有git倉庫&#xff0c;要切換提交的倉庫地址&#xff0c;用以下命令 git remote set-url origin 自己的倉庫地址 用以下命令&#xff0c;查看當前倉庫地址&#xff1a; git remote show origin 切換倉庫后&#xff0c;用以下命令初始化提交倉庫&#xff1a; git push -u o…

數據庫增刪改查

DDL: 數據定義語言&#xff0c;用來定義數據庫對象&#xff08;數據庫、表、字段&#xff09;DML: 數據操作語言&#xff0c;用來對數據庫表中的數據進行增刪改DQL: 數據查詢語言&#xff0c;用來查詢數據庫中表的記錄DCL: 數據控制語言&#xff0c;用來創建數據庫用戶、控制數…

c++11:可調用對象

文章目錄 引言1.普通函數2.函數指針3.函數對象(仿函數)4.Lambda表達式(匿名函數)5.function6.bind 引言 可調用對象是C11引入的新概念&#xff0c;可以像函數調用方式的觸發調用的對象就是可調用對象。 c98可調用對象(普通函數&#xff0c;函數指針&#xff0c;仿函數) c11可調…

Java設計模式【代理模式】

一、前言 1.1 背景 在不改變原有代碼的基礎上&#xff0c;對方法進行功能性的增強&#xff1b; 1.2 簡介 代理模式是一種結構型模式&#xff0c;為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下&#xff0c;一個對象不想或者不能直接引用另一個對象&#xff0…

axure9.0 工具使用思考

原型設計軟件【AxureRP】快速原型設計工具原型設計軟件【AxureRP】快速原型設計工具原型設計軟件【AxureRP】快速原型設計工具原型設計軟件【AxureRP】快速原型設計工具原型設計軟件【AxureRP】快速原型設計工具原型設計軟件【AxureRP】快速原型設計工具原型設計軟件【AxureRP】…

CentOS使用Docker搭建Halo網站并實現無公網ip遠程訪問

&#x1f525;博客主頁&#xff1a; 小羊失眠啦. &#x1f3a5;系列專欄&#xff1a;《C語言》 《數據結構》 《C》 《Linux》 《Cpolar》 ??感謝大家點贊&#x1f44d;收藏?評論?? 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&…

【華為OD機試真題 C++語言】483、中文分詞模擬器 | 機試真題+思路參考+代碼解析(C卷)

文章目錄 一、題目??題目描述??輸入輸出??樣例1??樣例2??樣例3二、思路參考三、代碼參考作者:KJ.JK??個人博客首頁: KJ.JK ??專欄介紹: 華為OD機試真題匯總,定期更新華為OD各個時間階段的機試真題,每日定時更新,本專欄將使用C++語言進行更新解答,包含真…

創紀錄:英偉達市值一日增 2770 億美元;Xiaomi 14 Ultra 正式發布丨 RTE 開發者日報 Vol.150

開發者朋友們大家好&#xff1a; 這里是 「RTE 開發者日報」 &#xff0c;每天和大家一起看新聞、聊八卦。我們的社區編輯團隊會整理分享 RTE &#xff08;Real Time Engagement&#xff09; 領域內「有話題的 新聞 」、「有態度的 觀點 」、「有意思的 數據 」、「有思考的 文…

mysql 用戶權限管理

mysql使用系統庫mysql的user表來存儲用戶信息。mysql.user表詳細的記錄了用戶名&#xff0c;對應的允許連接的主機信息還有各種全局權限標識位。 用戶管理 創建用戶 CREATE USER 用戶名host主機 IDENTIFIED BY 密碼;上面是創建用的基本命令&#xff0c;指定了用戶名&#xf…

Selenium基礎知識

一、環境搭建&#xff08;以java為例&#xff09; 1.下載chrome瀏覽器 https://www.google.cn/intl/zh-CN/chrome/ 2.查看chrome瀏覽器版本 設置關于chrome 3.下載chrome瀏覽器驅動 下載瀏覽器對應版本的 ChromeDriver - WebDriver for Chrome - Downloads 120以上版本&…

WordPress使用

WordPress功能菜單 儀表盤 可以查看網站基本信息和內容。 文章 用來管理文章內容&#xff0c;分類以及標簽。編輯文章以及設置分類標簽&#xff0c;分類和標簽可以被添加到 外觀-菜單 中。 分類名稱自定義&#xff1b;別名為網頁url鏈接中的一部分&#xff0c;最好別設置為中文…

概率密度函數(PDF)與神經網絡中的激活函數

原創:項道德(daode3056,daode1212) 在量子力學中&#xff0c;許多現象都是統計的結果&#xff0c;基本上用的是正態分布&#xff0c;然而&#xff0c;從本質上思考&#xff0c;應該還存在低階的分布&#xff0c;標準的正態分布是它的極限&#xff0c;這樣一來&#xff0c;或許在…

python中多線程使用

前言 記錄下Python中多線程使用 標題 前言簡介使用demo 簡介 Python 中的多線程主要通過 threading 模塊來實現。多線程是一種并發編程的方式&#xff0c;允許程序在同一時間執行多個線程&#xff0c;每個線程執行不同的任務。然而需要注意的是&#xff0c;在 Python 中由于 …