系列文章目錄
`往期文章
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的配置比較復雜,但是熟練之后使用起來還是比較方便的,還有更多其他用法等待發掘。