STM32LL庫編程系列第八講——ADC模數轉換

系列文章目錄

`往期文章
STM32LL庫編程系列第一講——Delay精準延時函數(詳細,適合新手)
STM32LL庫編程系列第二講——藍牙+USART串口通信(步驟詳細、原理清晰)
STM32LL庫編程系列第三講——USART+DMA通信
STM32LL庫編程系列第四講——定時器輸入捕獲+超聲波測距
STM32LL庫編程系列第五講——定時器PWM輸出+DS3115舵機控制
STM32LL庫編程系列第六講——定時器編碼器模式+電機驅動
STM32LL庫編程系列番外——DMA常用編程
STM32LL庫編程系列第七講——SPI通信(W25Q128)
STM32的SPI通信的NSS引腳設置原理


文章目錄

  • 系列文章目錄
  • 前言
  • 一、ADC是什么?
  • 二、使用STM32cubeMX配置工程
    • 1.ADC配置
  • 三、keil工程編寫
    • 1.adc.c
    • 2.adc_read.c
  • 總結


前言

ADC模數轉換這個字眼大家都已經習以為常了,但是在STM32中有很多關于ADC工作的配置大家可能還不是那么清楚,這里借助藍橋杯嵌入式的開發板,利用STM32cubemx對ADC的配置進行一個全面的介紹。


一、ADC是什么?

ADC的主要功能是將模擬信號轉換為數字信號,以便微控制器進行數據處理,整個轉換的機制大致為采樣——量化——編碼。
STM32 ADC是12 位逐次趨近型模數轉換器。它具有多達 19 個復用通道,可測量來自 16 個外部 源、兩個內部源和 VBAT通道的信號。這些通道的 A/D 轉換可在單次、連續、掃描或不連續 采樣模式下進行。ADC 的結果存儲在一個左對齊或右對齊的 16 位數據寄存器中。


二、使用STM32cubeMX配置工程

這里只說明關于ADC部分的配置介紹,其他外設配置說明見往期文章

1.ADC配置

在這里插入圖片描述
在進入ADC1配置界面,IN5通道有IN5 differential和IN5 single-ended兩個選項。區別如下:
單端輸入(IN5 single - ended):單端輸入模式是指 ADC 僅對一個輸入信號進行采樣。在這種模式下,以地(GND)作為參考電位,ADC 測量的是輸入信號與地之間的電壓差。當選擇IN5 single - ended時,ADC 會測量連接到 ADC 通道 IN5 引腳的信號相對于地的電壓值。
差分輸入(IN5 differential):差分輸入模式下,ADC 測量的是兩個輸入信號之間的電壓差。當選擇IN5 differential時,ADC 會測量正輸入信號(連接到 IN5 引腳)和負輸入信號(此時會產生選通一個ADC通道連接此信號,注意看右側圖示就能找到)之間的差值。
這里我們只需要測量IN5通道電壓值,所以選擇單端輸入。
下拉還有三項勾選對應的就是兩個內部源和 VBAT通道的信號,這里不需要。
在這里插入圖片描述
Clock Prescaler
預分頻器分頻的時鐘,其中有同步時鐘分頻和異步時鐘分頻兩個選項。
同步時鐘分頻是ADC 的時鐘源與 APB(通常APB2)時鐘是同步的, ADC 的時鐘是由 APB 總線時鐘經過分頻得到。
異步時鐘分頻是ADC 的時鐘源獨立于 APB 總線時鐘,通常是由專用的時鐘源(如 PLL、sysclk 等)經過分頻得到。
盡量使用同步時鐘分頻,這樣ADC 與其他基于 APB 總線的外設之間的通信和數據交互更加方便。因為它們的時鐘是同步的,所以在數據傳輸和處理過程中,不容易出現時鐘不同步導致的數據錯誤或丟失問題。另外, APB 總線時鐘更加穩定。但是同步時鐘分頻能力有限,當頻率無法滿足工作要求時使用異步時鐘分頻。
這里4次分頻后得到42MHz可以使用,故用同步時鐘分頻。

Resolution
ADC轉換的分辨率,一個 x位的 ADC 可以將滿量程范圍分為2^x個離散的量化級別,分辨率越高精度越高。從而能夠測量的最大信號與最小信號的寬度更大,同時高分辨率需要更高的成本和時間,按實際需要選擇就好。

Data Alignment
選擇轉換后存儲的數據的對齊方式,右對齊好取用,所以選擇Right alignment
在這里插入圖片描述

Gain Compensation
ADC 的實際增益往往與理想增益存在偏差。ADC 的理想增益是將輸入信號按照 1:1 的比例進行轉換,但實際中可能會出現將輸入信號放大或縮小的情況,導致轉換結果不準確。增益補償系數可以對這種增益誤差進行校準。通過測量 ADC 的實際增益與理想增益的比值,得到一個補償系數。在進行數據處理時,將 ADC 轉換得到的數字值乘以這個補償系數,就可以將實際的轉換結果調整到接近理想值,從而提高測量的準確性。這里選擇0,也就是不補償。

Scan Conversion Mode
當轉換次數大于1時會自動使能,無需我們配置
在這里插入圖片描述
End Of Conversion Selection
設置 ADC 轉換結束標志(EOC)的觸發時機,有 “End Of Single Conversion”(單次轉換結束)和 “End Of Sequence Of Conversion”(序列轉換結束)等選項,具體如下:
End Of Single Conversion:選擇該選項時,ADC 在每次完成單個通道的轉換后,就會置位 EOC 標志。適用于只需要對單個通道進行單次采樣的情況,例如在特定時刻對某個傳感器的信號進行一次性采集。此時,一旦單個通道的轉換完成,相關的中斷或事件就會被觸發,通知處理器可以讀取轉換結果。
End Of Sequence Of Conversion:若選擇此選項,ADC 會在完成整個轉換序列后才置位 EOC 標志。當使用多個通道進行連續采樣,并且希望在整個采樣序列完成后再進行統一的處理時,就可以選擇這個選項。比如在需要同時采集多個傳感器數據,并在所有數據都采集完成后進行分析或處理的場景中,使用 “End Of Sequence Of Conversion” 可以減少中斷次數,提高數據處理的效率。
但是序列轉換結束模式下DR(數據寄存器)在整個轉換序列中會不斷被新的轉換結果覆蓋,最終只保留最后一個通道的轉換數據。若想保存每一次的數據可使用如下方法:
使用DMA: DMA 能夠在不經過 CPU 干預的情況下,直接將 ADC 轉換的數據從 DR 寄存器傳輸到內存中。在 ADC 完成每個通道的轉換后,DMA 會立即將轉換結果搬運到預先指定的內存地址,這樣就避免了數據被后續轉換結果覆蓋的問題。
為了方便,這里就使用End Of Single Conversion。

Low Power Auto Wait
指定低功耗自動等待模式的使用:只有當用戶軟件處理了之前的轉換(針對常規組)或之前的序列(針對注射組)后,才開始新的轉換。在低功耗狀態下,ADC 會持續監測轉換觸發信號。當檢測到新的轉換觸發信號時,ADC 會從低功耗狀態中喚醒,重新啟動轉換操作。觸發信號可以是軟件觸發、定時器觸發或外部事件觸發等。

Continuous Conversion Mode
在連續轉換模式下,ADC 完成一次模擬信號到數字信號的轉換后,不會停止工作,而是緊接著自動開始下一次轉換,如此循環不斷,只要不手動停止該模式或者發生異常情況,ADC 就會持續對輸入的模擬信號進行轉換。
需要一個初始的觸發信號來啟動連續轉換過程。這個觸發信號可以是軟件觸發(通過代碼向 ADC 控制寄存器寫入特定的值來觸發),也可以是硬件觸發(如定時器溢出、外部中斷等)。一旦觸發信號到來,ADC 開始對輸入的模擬信號進行轉換,將其轉換為數字值并存儲在數據寄存器中。轉換完成后,ADC 會自動重新開始下一次轉換,無需額外的觸發信號。每次轉換完成后,數據寄存器中的值都會被新的轉換結果覆蓋。因此,在使用連續轉換模式時,需要及時讀取數據寄存器中的值,以獲取最新的轉換結果。

Discontinuous Conversion Mode
間斷轉換模式下,ADC 并非持續不斷地對模擬信號進行轉換,而是將整個轉換序列分割成多個子序列,每個子序列包含一定數量的轉換通道。ADC 會按照設定,依次完成每個子序列的轉換,在完成一個子序列后暫停,等待下一次觸發信號后再繼續進行下一個子序列的轉換。

DMA Continuous Requests
不使用DMA時不配置此項,本示例沒有用到DMA,故暫時不解釋。

Overrun behaviour
Overrun behaviour(溢出行為)主要是指在 ADC(模擬 - 數字轉換器)的數據處理過程中,當新的轉換結果產生時,前一次轉換結果還未被及時讀取,從而導致數據被覆蓋的情況。
Overrun data preserved(溢出數據保留)
當 ADC 發生溢出時,即新的轉換結果已經產生,但之前的轉換結果還未被系統(如 CPU 或 DMA)從數據寄存器中讀取,這種模式會保留原有的數據,不允許新的轉換結果覆蓋舊數據。同時,ADC 可能會暫停后續的轉換操作,直到舊數據被讀取,才會繼續進行新的轉換。
Overrun data overwritten(溢出數據覆蓋)
當 ADC 發生溢出時,新的轉換結果會直接覆蓋數據寄存器中尚未被讀取的舊數據。ADC 會繼續進行后續的轉換操作,不會因為數據未被讀取而暫停。
我們需要讀取最新數據,所以選擇覆蓋

Enable Regular Conversions
在 STM32 的 ADC 中,轉換通道可分為規則通道(Regular Channels)和注入通道(Injected Channels)兩類。規則通道是最常用的轉換通道組,Enable Regular Conversions 的作用是開啟對規則通道的模擬信號到數字信號的轉換功能。開啟此功能后,ADC 就會依據設定好的規則對指定的規則通道進行轉換操作。這一項是幾乎一定要啟用的。

Enable Regular Oversampling
Enable Regular Oversampling 就是開啟規則通道的過采樣功能,允許 ADC 在規則轉換過程中運用過采樣技術來提升轉換精度。當啟用規則通道過采樣后,ADC 會對規則通道的模擬信號進行多次采樣,每次采樣得到的數字值會被累加起來,累加完成后,根據過采樣倍率,對累加和進行右移操作,將多次采樣的結果進行平均,得到一個最終的轉換結果,相當于提高了 ADC 的分辨率。

Number Of Conversion
有多少個采樣通道,就設為多少。

External Trigger Conversion Source
External Trigger Conversion Source 就是指定用于觸發 ADC 轉換的外部信號來源。除了軟件觸發外,定時器溢出、比較匹配等事件可以作為外部觸發源。例如,定時器在計數達到設定值時產生溢出事件,該事件可以觸發 ADC 開始轉換。這種方式適用于需要按照一定時間間隔進行數據采集的應用,如周期性的傳感器數據采集。

External Trigger Conversion Edge
當外部觸發信號出現上升沿時,ADC 會立即啟動轉換操作。這種觸發方式適用于需要在外部信號開始變化的瞬間進行數據采集的場景。

Sampling Time
在這里插入圖片描述
大致的介紹就到這里了


三、keil工程編寫

1.adc.c

在生成的程序最后需要加上一下幾句。

  /* USER CODE BEGIN ADC1_Init 2 */LL_ADC_StartCalibration(ADC1,LL_ADC_SINGLE_ENDED);while(LL_ADC_IsCalibrationOnGoing(ADC1));LL_ADC_Enable(ADC1);/* USER CODE END ADC1_Init 2 */

*void LL_ADC_StartCalibration(ADC_TypeDef ADCx, uint32_t SingleDiff)
ADC 在將模擬信號轉換為數字信號的過程中,可能會受到各種因素的影響,例如內部電路的偏移、增益誤差等,這些因素會導致轉換結果產生偏差。校準就是為了減少這些誤差,提高 ADC 轉換結果的準確性。該函數的主要作用就是觸發指定 ADC 的校準操作,通過特定的算法和流程來調整 ADC 的內部參數,從而使轉換結果更加精確。
*uint32_t LL_ADC_IsCalibrationOnGoing(const ADC_TypeDef ADCx)
獲取ADC的校準狀態,0-校準完成,1-校準正在進行。
最后就可以使能adc了。

2.adc_read.c

想要讀取ADC還需要編寫讀取函數,如下

void ADC1_read(uint16_t *pusbuf)
{LL_ADC_REG_StartConversion(ADC1);while(LL_ADC_IsActiveFlag_EOC(ADC1) == 0);pusbuf[0] = LL_ADC_REG_ReadConversionData10(ADC1);while(LL_ADC_IsActiveFlag_EOC(ADC1) == 0);pusbuf[1] = LL_ADC_REG_ReadConversionData10(ADC1);
}

*void LL_ADC_REG_StartConversion(ADC_TypeDef ADCx)
啟動 ADC 組的規則通道轉換。在該 STM32 系列中,此功能與內部觸發(軟件啟動)和外部觸發都相關。如果 ADC 觸發已設置為軟件啟動,則 ADC 轉換會立即開始, 如果 ADC 觸發已設置為外部觸發,則 ADC 轉換將在 ADC 啟動轉換命令之后的下一個觸發事件(在選定的觸發邊沿)開始。
*uint32_t LL_ADC_IsActiveFlag_EOC(const ADC_TypeDef ADCx)
獲取EOC標志位,從而獲取轉換完成標志
*uint16_t LL_ADC_REG_ReadConversionData10(const ADC_TypeDef ADCx)
獲取分辨率為10的轉換數據。

前面開啟了ADC1的IN5和IN10兩個通道,且配置成“End Of Single Conversion”(單次轉換結束),所以每個通道的轉換都需要運行一個轉換開啟函數LL_ADC_REG_StartConversion。通道11在前,所以pusbuf[0]得到的就是通道11的數值,pusbuf[1]得到的就是通道5的數值了。

得到采樣數值后使用的時候進行一步轉換就可以得到實際采樣值。比如所我要采樣滑動變阻器電壓,量程是0-3.3V;采樣分辨率為10,則采樣量程為0-1024.那么實際采樣電壓值 = 采樣數值*3.3/1024


總結

ADC的配置比較復雜,但是熟練之后使用起來還是比較方便的,還有更多其他用法等待發掘。

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

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

相關文章

網絡5 TCP/IP 虛擬機橋接模式、NAT、僅主機模式

TCP/IP模型 用于局域網和廣域網;多個協議;每一層呼叫下一層;四層;通用標準 TCP/IP模型 OSI七層模型 應用層 應用層 表示層 會話層 傳輸層 傳輸層 網絡層 網絡層 鏈路層 數據鏈路層 物理層 鏈路層:傳數據幀&#xff0…

【C語言】預處理(下)(C語言完結篇)

一、#和## 1、#運算符 這里的#是一個運算符,整個運算符會將宏的參數轉換為字符串字面量,它僅可以出現在帶參數的宏的替換列表中,我們可以將其理解為字符串化。 我們先看下面的一段代碼: 第二個printf中是由兩個字符串組成的&am…

【高性能緩存Redis_中間件】一、快速上手redis緩存中間件

一、鋪墊 在當今的軟件開發領域,消息隊列扮演著至關重要的角色。它能夠幫助我們實現系統的異步處理、流量削峰以及系統解耦等功能,從而提升系統的性能和可維護性。Redis 作為一款高性能的鍵值對數據庫,不僅提供了豐富的數據結構,…

Java如何獲取文件的編碼格式?

Java獲取文件的編碼格式 在計算機中,文件編碼是指將文件內容轉換成二進制形式以便存儲和傳輸的過程。常見的文件編碼格式包括UTF-8、GBK等。不同的編碼使用不同的字符集和字節序列,因此在讀取文件時需要正確地確定文件的編碼格式 Java提供了多種方式以獲…

客戶端負載均衡與服務器端負載均衡詳解

客戶端負載均衡與服務器端負載均衡詳解 1. 客戶端負載均衡(Client-Side Load Balancing) 核心概念 定義:負載均衡邏輯在客戶端實現,客戶端主動選擇目標服務實例。典型場景:微服務內部調用(如Spring Cloud…

Quartus II的IP核調用及仿真測試

目錄 第一章 什么是IP核?第二章 什么是LPM?第一節 設置LPM_COUNTER模塊參數第二節 仿真 第三章 什么是PLL?第一節 設置ALTPLL(嵌入式鎖相環)模塊參數第二節 仿真 第四章 什么是RAM?第一節 RAM_1PORT的調用第…

各地物價和生活成本 東歐篇

東歐地區的物價差異相對較大,一些國家的物價較高,而另一些國家則相對便宜。這些差異主要受當地經濟發展水平、工資水平、旅游業發展以及國際關系等因素影響。以下是一些典型的東歐國家,按物價高低進行分類: 🌍 物價較高…

改進神經風格遷移

改進神經風格遷移(Neural Style Transfer, NST)可以從多個方向入手,包括模型結構優化、損失函數設計、計算效率提升、應用場景擴展等。以下是一些關鍵的改進方向及具體方法: 1. 模型結構優化 (1)輕量化網絡…

1、從零搭建魔法工坊:React 19 新手村生存指南

一、開篇:新世界的入場券 "你好,年輕的魔法學徒!歡迎來到React魔法世界。我是你的向導赫敏韋斯萊,今天我們將用React 19這根全新魔杖,搭建屬于你的第一座魔法工坊。" ——以對話形式開場,消除技…

基于 Redis 實現一套動態配置中心 DCC 服務與反射基礎知識講解

目錄 動態配置中心核心價值 輕量級 Redis 方案與 ZooKeeper 的對比分析 為什么選擇自定義 Redis 方案? 1. 技術決策背景 一、活動降級攔截 1. 定義與作用 2. 實現原理 二、活動切量攔截 1. 定義與作用 2. 實現原理 三、兩者的核心區別 四、實際應用案例 1. 電商大促…

如何從項目目標到成功標準:構建可量化、可落地的項目評估體系

引言 在項目管理領域,"項目成功"的定義往往比表面看起來更復雜。根據PMI的行業報告,67%的項目失敗源于目標與成功標準的不匹配。當項目團隊僅關注"按時交付"或"預算達標"時,常會忽視真正的價值創造。本文將通…

深度學習基礎--CNN經典網絡之分組卷積與ResNext網絡實驗探究(pytorch復現)

🍨 本文為🔗365天深度學習訓練營 中的學習記錄博客🍖 原作者:K同學啊 前言 ResNext是分組卷積的開始之作,這里本文將學習ResNext網絡;本文復現了ResNext50神經網絡,并用其進行了猴痘病分類實驗…

SQL 全文檢索原理

全文檢索(Full-Text Search)是SQL中用于高效搜索文本數據的技術,與傳統的LIKE操作或簡單字符串比較相比,它能提供更強大、更靈活的文本搜索能力。 基本概念 全文檢索的核心思想是將文本內容分解為可索引的單元(通常是詞或詞組),然后建立倒排…

【Linux】Orin NX編譯 linux 內核及內核模塊

1、下載交叉編譯工具:gcc 1)下載地址:https://developer.nvidia.com/embedded/jetson-linux 選擇TOOLS中的交叉編譯工具:gcc 11.3 2)解壓 將gcc編譯器解壓到指定目錄中,如:/home/laoer/nvidia/gcc 3)配置環境變量 創建: ~/nvidia/gcc/env.sh添加: #!/bin/bash e…

Transformers 是工具箱,BERT 是工具。

Transformers 是工具箱,BERT 是工具。 🔍 詳細解釋: 名稱作用比喻理解舉例🤖 transformers(庫)一個框架,提供很多 NLP 模型的“使用方式”,包括文本分類、問答、摘要等相當于一個“…

k8s之Service類型詳解

1.ClusterIP 類型 2.NodePort 類型 3.LoadBalancer 類型 4.ExternalName 類型 類型為 ExternalName 的 Service 將 Service 映射到 DNS 名稱,而不是典型的選擇算符, 例如 my-service 或者 cassandra。你可以使用 spec.externalName 參數指定這些服務…

find指令中使用正則表達式

linux查找命令能結合正則表達式嗎 find命令要使用正則表達式需要結合-regex參數 另,-type參數可以指定查找類型(f為文件,d為文件夾) rootlocalhost:~/regular_expression# ls -alh 總計 8.0K drwxr-xr-x. 5 root root 66 4月 8日 16:26 . dr-xr-…

《穿透表象,洞察分布式軟總線“無形”之奧秘》

分布式系統已成為眾多領域的關鍵支撐技術,而分布式軟總線作為實現設備高效互聯的核心技術,正逐漸走入大眾視野。它常被描述為一條“無形”的總線,這一獨特屬性不僅是理解其技術內涵的關鍵,更是把握其在未來智能世界中重要作用的切…

Ubuntu虛擬機連不上網

橋接 虛擬機Ubuntu系統必須能連接到外網,不然不能更新軟件安裝包 配置虛擬機網絡(關機或者掛起狀態) 第一步1.重啟虛擬機網絡編輯器(還原配置) 第二步2.重啟虛擬機網絡適配器(移除再添加) 啟…

rom定制系列------紅米9A批量線刷原生安卓14雙版 miui系統解鎖可登陸線刷固件

紅米9A。聯發科Helio G25芯片。該處理器支持64位運算?,但此機miui系統運行環境是32位的,這意味著盡管處理器本身支持64位計算,但miui系統限制在32位環境下運行?。官方miui系統穩定版最終為12.5.21安卓11的版本。 原生安卓14批量線刷功能固…