它有18個通道,可測量16個外部和2個內部信號源。各通道的A/D轉換可以單次、連續、掃描或間斷模式執行
● 單次:即只轉換一遍,如果是一個通道,即只轉換一次,如果是一組通道,即所有通道掃描一遍。
● 連續:通道循環轉換,分爲單通道連續,多通道掃描連續
● 掃描:從通道0到通道n的自動掃描模式。單獨掃描和連續(循環)掃描
● 間斷:如果有1-8個通道要轉換,可以分成1-2,3-5,6-8等小組,每次觸發,轉換一個小組,這叫間斷
一、ADC開關
通過設置ADC_CR2寄存器的ADON位可給ADC上電。當第一次設置ADON位時,它將ADC從斷電狀態下喚醒。
ADC上電延遲一段時間後(tSTAB),再次設置ADON位時開始進行轉換。也可以通過置位CR2的SWSTART或SWSTARTJ位開始規則通道或注入通道的轉換。
通過清除ADON位可以停止轉換,並將ADC置於斷電模式。
hal庫是通過HAL_ADC_Start/HAL_ADC_Start_IT/HAL_ADC_Start_DMA函數中的-------> tmp_hal_status = ADC_Enable(hadc);
來喚醒ADC的。
二、通道選擇
● 規則組:通道和轉換順序在ADC_SQRx寄存器中選擇。轉換的總數寫入ADC_SQR1寄存器的L[3:0]位中,在初始化函數HAL_ADC_Init(&hadc1)
中設置。先轉換哪個通道(即轉換順充),在HAL_ADC_ConfigChannel(&hadc1, &sConfig)
中設置SQR3寄存器,用5bit表示一個通道編號,最低的5bit表示最先轉換的通道號,次低的5bit表示第二個轉換的通道號。
● 注入組:由多達4個轉換組成。轉換順序在ADC_JSQR寄存器中選擇。轉換總數目必須寫入ADC_JSQR寄存器的JL[1:0]位中
STM32的ADC模塊通過內部多路模擬開關,可以切換到不同的輸入通道並進行轉換。加入了多種成組轉模式,由程序設定好以後,對多個通道逐個採樣轉換。
有2種分組的方式:規則通道組和注入通道組。通常規則通道組中可以安排最多16個通道,而注入通道組可以安排最多4個通道。
在執行規則通道組掃描轉換時,如有例外處理則可啓用注入通道組的轉換。
舉個例子:
你家院子內放了5個溫度探頭,室內放了3個溫度探頭;你需要時刻監視室外溫度即可,但偶爾你想看看室內的溫度;因此你可以使用規則通道組循環掃描室外的5個探頭並顯示AD轉換結果,當你想看室內溫度時,通過一個按鈕啓動注入轉換組(3個室內探頭)並暫時顯示室內溫度,當你放開這個按鈕後,系統又會回到規則通道組繼續檢測室外溫度。
從系統設計上,測量並顯示室內溫度的過程中斷了測量並顯示室外溫度的過程,但程序設計上可以在初始化階段分別設置好不同的轉換組,系統運行中不必再變更循環轉換的配置,從而達到兩個任務互不干擾和快速切換的結果。可以設想一下,如果沒有規則組和注入組的劃分,當你按下按鈕後,需要從新配置AD循環掃描的通道,然後在施放按鈕後需再次配置AD循環掃描的通道。
一、轉換模式
● 單次轉換模式–單通道: 轉換結果存入ADC_DR/ADC_DRJ1 寄存器中。
● 連續轉換模式–單通道: 轉換結果存入ADC_DR/ADC_DRJ1 寄存器中,轉換結束EOC置位,軟件清除EOC後自動啓動另一次轉換
在STM32的ADC庫函數中主要由 ADC_InitStructure.ADC_ScanConvMode = DISABLE;
來決定AD採集工作在單次轉換模式(DISABLE)或者是連續轉換模式(ENABLE)
● 掃描模式:逐個轉換所有被ADC_SQRX/ADC_JSQR寄存器選擇通道,如果設置了CR1的SCAN位,則循環掃描,需要使用DMA把結果傳輸到SRAM中。
二、間斷模式
例如規則組有0,1,2,3,6,7,9,10八個通道需要轉換,可以設置n=3,那麼第一次觸發只轉換0,1,2通道,第二次觸發轉換3,6,7通道,第三次觸發轉換9,10通道,並生產結束EOC事件。第四次觸發跟第一次觸發一樣轉換0,1,2通道。
規則組和注入組只能有一個使用間斷模式。
三、採樣時間+轉換時間
每通道採樣時間間隔1.5週期或可設置更大的值,轉換時間爲12.5週期,所以一個通道需要14週期,如果一個組裏有2個通道,則需要28週期,所以觸發的時間間隔要大於28週期。
Cube MX配置完成生成工程後,在轉換前需要添加 HAL_ADCEx_Calibration_Start(&hadc1)函數,用於ADC的自校驗,如果不校驗,結果會有偏差;
規則通道轉換的值儲存在一個唯一的數據寄存器ADC_DR中,所以當轉換多個規則通道時需要使用DMA
1、單通道----中斷模式
調用HAL_ADC_Start_IT(&hadc1)函數,啓用ADC轉換。在回調函數
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
ADC_ConvertedValue=HAL_ADC_GetValue(&hadc1);
}
裏獲取轉換後的數字值。
2、單通道----DMA模式
調用HAL_ADC_Start_DMA(&hadcx,&ADC_ConvertedValue,1);
啓動ADC,並開始DMA轉換,轉換結束會保存到ADC_ConvertedValue中,注意它是uint32_t類型的變量。
3、多通道----DMA模式
調用HAL_ADC_Start_DMA(&hadcx,ADC_ConvertedValue,num_ch);
啓動DMA轉換。
參考:https://www.cnblogs.com/yangxuli/p/6379474.html
參考:https://blog.csdn.net/apple_2333/article/details/96962574
掃描模式(想採集多通道必須開啓):是一次對所選中的通道進行轉換,比如開了ch0,ch1,ch4,ch5。Ch0轉換完以後就會自動轉換通道1,4,5直到轉換完。但是這種連續性並不是不能被打斷。這就引入了間斷模式,可以說是對掃描模式的一種補充。它可以把0,1,4,5這四個通道進行分組。可以分成0,1一組,4,5一組。也可以每個通道配置爲一組。這樣每一組轉換之前都需要先觸發一次。
Stm32 ADC的單次模式和連續模式。這兩中模式的概念是相對應的。這裏的單次模式並不是指一個通道。假如你同時開了ch0,ch1,ch4,ch5這四個通道。單次模式轉換模式下會把這四個通道採集一邊就停止了。而連續模式就是這四個通道轉換完以後再循環過來再從ch0開始。
如果有多個通道,又不想使用DMA,則可以使用間斷模式,間斷配置必須每個通道分爲1組,即觸發一次,只轉換1組即1個通道。讀取結果後,再觸發下一次。程序如下:
for(i=1;i<5;i++)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,0xffff);//等待ADC轉換完成
adcBuf[i]=HAL_ADC_GetValue(&hadc1);
printf("------ch:%d--%d-------\r\n",i,adcBuf[i]);
}
HAL_ADC_Stop(&hadc1);
HAL_Delay(1000);
參考:https://www.cnblogs.com/xingboy/p/10212308.html