STM32F103C8T6 ADC

  它有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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章