1. 程式人生 > >stm32cubemx 多路adc採集

stm32cubemx 多路adc採集

採用的軟體是STM32CUBEMX+KEIL5

硬體為stm32F103C8T6

我與原文作者做的區別在於

External Trigger Conversion Edge,我在進行配置的時間沒有None選項,我選擇的是預設的Regular Conversion launched by software

原文地址:

實現功能:stm32cubeMX配置ADC多通道採集(非dma和中斷方式)

Stm32ADC的轉換模式還是很靈活,很強大,模式種類很多,那麼這也導致很多人使用的時候沒細心研究參考手冊的情況下容易混淆。不知道該用哪種方式來實現自己想要的功能。網上也可以搜到很多資料,但是大部分是針對之前老版本的標準庫的。昨天幫客戶解決這個問題,正好做個總結:使用stm32cubeMX配置生成多通道採集的例子。

硬體:eemaker板(基於stm32F103c8的)

在百度搜索ADC多通道採集,大部分的都是基於採用dma模式才實現的。而我講的使用非dma方法。首先有幾個概念要搞清楚:

掃描模式(想採集多通道必須開啟):是一次對所選中的通道進行轉換,比如開了ch0,ch1,ch4,ch5。Ch0轉換完以後就會自動轉換通道0,1,4,5直到轉換完。但是這種連續性並不是不能被打斷。這就引入了間斷模式,可以說是對掃描模式的一種補充。它可以把0,1,4,5這四個通道進行分組。可以分成0,1一組,4,5一組。也可以每個通道配置為一組。這樣每一組轉換之前都需要先觸發一次。

Stm32 ADC的單次模式和連續模式。這兩中模式的概念是相對應的。這裡的單次模式並不是指一個通道。假如你同時開了ch0,ch1,ch4,ch5這四個通道。單次模式轉換模式下會把這四個通道採集一邊就停止了。而連續模式就是這四個通道轉換完以後再迴圈過來再從ch0開始。

另外還有規則組和注入組的概念,因為我這個例程只用到了規則組,就不多介紹這兩個概念,想要弄清楚請自行查閱手冊。

下面進入正題,配置stm32cubeMX。

Stm32cubeMx配置ADC多通道採集

先使能幾個通道,我這裡設定為0、1、4、5.

然後就要配置ADC的引數:

Stm32cubeMx配置ADC多通道採集

目前經過我的測試,要想用非dma和中斷模式只有這樣配置可以正確進行多通道轉換:掃描模式+單次轉換模式+間斷轉換模式(每個間斷組一個通道)。

分析配置成這樣的模式,掃描模式是在配置為多個通道必須開啟的,stm32cubeMX上也預設好了,只能enable。單次轉換模式是我不需要不停的去採集每個通道值,而是把四個通道採集完以後就讓它停止。這裡間斷配置是關鍵,間斷模式可以讓掃描的四個通道進行分成四個組,stm32cubeMX引數裡面number of Discontinous Conversions是配置間斷組每個組有幾個通道的,這裡必須配置為1(否則在獲取ad值得時候只能讀取到每個間斷組最後一個通道)。

生成mdk工程程式碼。這時候還沒有完成,只是實現了ADC的初始化,需要採集這四個通道值得函式還要自己寫。下面這個是我main函式的while迴圈:

for(i=1;i<5;i++){

HAL_ADC_Start(&hadc1);

HAL_ADC_PollForConversion(&hadc1,0xffff);

adcBuf[i]=HAL_ADC_GetValue(&hadc1);

printf("------ch:%d--%d-------\r\n",i,adcBuf[i]);}

HAL_ADC_Stop(&hadc1);

HAL_Delay(1000);

呼叫hal庫介面函式也需要注意,HAL_ADC_Start一定要放在for裡面,即每一個通道都要觸發。四個通道都採集完了,再去呼叫HAL_ADC_Stop(&hadc1);結束本次ADC採集。

最後說下,這個是針對stm32F103系列的晶片,其他型號的配置可能略有不同,大體思路一樣。