基於DMA的ADC數據採集


嵌入式系統開發經常會遇到採集模擬量的功能需求,這時就會用到ADC,STM32系列MCU提供了強大的ADC功能,其提供的多通道採集和DMA方式極大的方便了ADC相關的開發流程,本文主要記錄一下,如何使用ADC實現基於DMA的多通道模擬量採集功能。

關於ADC的配置,同樣可以通過STM32CubeMX來實現,下面是STM32型號和STM32CubeMX的版本信息:

  • MCU:STM32F103C8T6
  • STM32CubeMX:5.5.0

下面是具體的配置步驟

系統基本配置

時鐘配置

首先,配置系統時鐘,本文基於STM32F103C8T6的一款開發板進行開發,其提供的外部晶振頻率爲8MHz,所以,對於時鐘我們的配置爲:

下面進行ClockConfiguration相關的配置,第一步選擇時鐘源爲HSE:8MHZ,第二步選擇APB2的時鐘源爲32MHz,最後一步選擇ADC1的時鐘頻率爲8MHz,最終的配置結果如下:

打開ST-Link調試

對於MCU的程序下載和調試,我們選用的是ST-Link,所以選擇系統的調試模式爲Serial Wire,配置如下:

。

注:對於通過ST-Link或JTAG下載、調試程序時,需要配置該選項,否則無法下載程序以及在線調試MCU。

配置ADC

功能需求是:

  • 使用ADC1實現模擬量的採集;
  • 兩路模擬量採集;
  • 基於DMA實現外設到內存的數據傳輸;

基本配置

首先是,基本配置選擇將要使用的ADC,這裏我們使用的是ADC1,其次是選擇用於模擬量採集的ADC通道,這裏我們選擇是ADC1的通道6和通道7,具體配置如下:

。

下面是關於ADC的參數配置,主要分爲兩部分:第一部分爲ADC_Setting,第二部分爲ADC_Regular_ConversionMode,下面分別解決一下:

  1. ADC_Setting:

    • Data Alignment:Right alignment。表示ADC的regular data register寄存器16bit數據的對齊方式爲向右對齊。
    • Scan Conversion Mode:Enable。當使用DMA採集多路模擬量時,使能該選項可以自動掃描ADC的模擬量數據通道,採集模擬量數據。
    • Continuous Conversion Mode:Enable。使能該項時,可以對各個模擬量通道進行循環、連續的數據採集。
  2. ADC_Regular_ConversionMode:

    • Enable Regular Conversions: Enable。打開Regular數據轉換模式。對於Regular Conversion和Injected Conversion兩種模式的區別可以簡單的理解爲:Regular Conversion爲輪詢採集的工作模式,Injected Conversion爲中斷採集工作模式,並且Injected Conversion比Regular Conversion的優先級高。
    • Nunber of Conversion:2。表示採集的通道數量。
    • Rank 1:表示第一個採集通道,即通道Channel 7,Sample Time爲1.5 Cycles,1個Cycle爲ADC驅動時鐘頻率的倒數,本文爲 1 Cycle = 1/8M s。
    • Rank 2:表示第二個採集通道,即通道Channel 6,Sample Time爲1.5 Cycles,同上。

。

DMA配置

進入ADC的DMA配置選項,關於ADC的DMA配置方式如下:

  1. 添加DMA Request:添加ADC1爲DMA Reuest,Channel爲DMA1 Channel 1,DMA的數據傳輸方向爲:peripheral To Memory(外設到內存),Priori爲Low。

  2. 配置DMA Requeset Settings:

  • Mode:Circular。表示DMA循環、連續採集各個ADC通道的模擬量。
  • Data Width爲Word。表示DMA傳輸的數據的基本大小爲Word,即四字節。

。

好了,配置基本完成了,下面是MCU的PinView,大家可以參考一下。點擊Generate Code生成工程代碼。

。

功能實現

基於STM32CubeMX生成的代碼,完善ADC採集代碼,主要就是調用HAL_ADC_Start_DMA啓動ADC採集,實現HAL_ADC_ConvCpltCallback接口,當DMA採集完一輪數據之後,會調用該接口通知APP,APP可以在這裏完成模擬量的轉換功能。

/*其中,pData表示DMA的目標內存地址,Length表示外設向內存傳輸的數據項的個數。*/

HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length);

/*處理DMA數據*/
uint32_t val[2];//保存外設通過DMA傳輸的過來的數據
float v[2];//保存當前採集到的模擬量

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
	for(int8_t i = 0; i < 2; i++) {
	v[i] = (val[i] / 4095.0) * 3.274; //參考電壓爲:3.274V	
}

好了,至此基本完成了基於DMA的ADC採集方式的功能需求。

測試

編譯程序,通過ST-Link下載到MCU,搭建好電路,在線監測實時採集到的模擬量數據,模擬量數據源爲兩路電壓模擬量。

。

發佈了122 篇原創文章 · 獲贊 132 · 訪問量 46萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章