stm32F103之ADC模數轉換
一、ADC簡介
通常是指一個將模擬信號轉變為數字信號的電子元件。通常的模數轉換器是把經過與標準量比較處理後的模擬量轉換成以二進制數值表示的離散信號的轉換器。
12位ADC是一種逐次逼近型模擬數字轉換器。它有多達18個通道,可測量16個外部和2個內部信號源。各通道的A/D轉換可以單次、連續、掃描或間斷模式執行。ADC的結果可以左對齊或右對齊方式存儲在16位數據寄存器中。 模擬看門狗特性允許應用程序檢測輸入電壓是否超出用戶定義的高/低閥值。
二、ADC功能框圖
掌握了ADC 的功能框圖,就可以對ADC 有一個整體的把握,在編程的時候可以做到了然如胸,不會一知半解。框圖講解采用從左到右的方式,跟ADC 采集數據,轉換數據,傳輸數據的方向大概一致。
三、ADC功能描述
1、電壓輸入範圍
ADC 輸入範圍為:VREF- ≤ VIN ≤ VREF+。由VREF-、VREF+ 、VDDA 、VSSA、這四個外部引腳決定。
設計原理圖的時候一般把VSSA和VREF-接地,把VREF+和VDDA 接3V3,得到ADC的輸入電壓範圍為:0~3.3V。
2、輸入通道
我們確定好ADC 輸入電壓之後,那麽電壓怎麽輸入到ADC?這裏我們引入通道的概念,STM32 的ADC 多達18 個通道,其中外部的16 個通道就是框圖中的ADCx_IN0、ADCx_IN1...ADCx_IN5。這16 個通道對應著不同的IO 口,具體是哪一個IO 口可以從手冊查詢到。其中ADC1/2/3 還有內部通道:ADC1的通道16連接到了芯片內部的溫度傳感器,Vrefint 連接到了通道17。ADC2 的模擬通道16 和17 連接到了內部的VSS。ADC3 的模擬通道9、14、15、16 和17 連接到了內部的VSS。
我們在編程的時候需要根據使用的IO引腳來確定具體的通道。外部的16 個通道在轉換的時候又分為規則通道和註入通道,其中規則通道最多有16路,註入通道最多有4 路。那這兩個通道有什麽區別?在什麽時候使用?
規則通道
規則通道:顧名思意,規則通道就是很規矩的意思,我們平時一般使用的就是這個通道。
註入通道
註入,可以理解為插入,插隊的意思,是一種不安分的通道。它是一種在規則通道轉換的時候強行插入要轉換的一種。如果在規則通道轉換過程中,有註入通道插隊,那麽就要先轉換完註入通道,等註入通道轉換完成後,再回到規則通道的轉換流程。這點跟中斷程序很像,都是不安分的主。所以,註入通道只有在規則通道存在時才會出現。
3、轉換順序
規則序列
規則序列寄存器有3 個,分別為SQR3、SQR2、SQR1。SQR3 控制著規則序列中的第一個到第六個轉換,對應的位為:SQ1[4:0]~SQ6[4:0],第一次轉換的是位4:0 SQ1[4:0],如果通道16 想第一次轉換,那麽在SQ1[4:0]寫16 即可。SQR2 控制著規則序列中的第7 到第12 個轉換,對應的位為:SQ7[4:0]~SQ12[4:0],如果通道1 想第8 個轉換,則SQ8[4:0]寫1即可。SQR1 控制著規則序列中的第13 到第16 個轉換,對應位為:SQ13[4:0]~SQ16[4:0],如果通道6 想第10 個轉換,則SQ10[4:0]寫6 即可。具體使用多少個通道,由SQR1 的位L[3:0]決定,最多16 個通道。
註入序列
註入序列寄存器JSQR 只有一個,最多支持4 個通道,具體多少個由JSQR 的JL[2:0]決定。如果JL 的 值小於4 的話,則JSQR 跟SQR決定轉換順序的設置不一樣,第一次轉換的不是JSQR1[4:0],而是JCQRx[4:0] ,x = (4-JL),跟SQR 剛好相反。如果JL=00(1 個轉換),那麽轉換的順序是從JSQR4[4:0]開始,而不是從JSQR1[4:0]開始,這個要註意,編程的時候不要搞錯。當JL 等於4 時,跟SQR 一樣。
4、觸發源
通道選好了,轉換的順序也設置好了,那接下來就該開始轉換了。ADC 轉換可以由ADC 控制寄存器2: ADC_CR2 的ADON 這個位來控制,寫1 的時候開始轉換,寫0 的時候停止轉換,這個是最簡單也是最好理解的開啟ADC 轉換的控制方式,理解起來沒啥技術含量。
除了這種庶民式的控制方法,ADC 還支持觸發轉換,這個觸發包括內部定時器觸發和外部IO 觸發。觸發源有很多,具體選擇哪一種觸發源,由ADC 控制寄存器2:ADC_CR2 的EXTSEL[2:0] 和JEXTSEL[2:0]位來控制。EXTSEL[2:0]用於選擇規則通道的觸發源,JEXTSEL[2:0]用於選擇註入通道的觸發源。選定好觸發源之後,觸發源是否要激活,則由ADC 控制寄存器2:ADC_CR2 的EXTTRIG 和JEXTTRIG 這兩位來激活。其中ADC3 的規則轉換和註入轉換的觸發源與ADC1/2 的有所不同,在框圖上已經表示出來。
5、數據寄存器
一切準備就緒後,ADC 轉換後的數據根據轉換組的不同,規則組的數據放在ADC_DR寄存器,註入組的數據放在JDRx。
規則數據寄存器
ADC 規則組數據寄存器ADC_DR 只有一個,是一個32 位的寄存器,低16 位在單ADC時使用,高16 位是在ADC1 中雙模式下保存ADC2 轉換的規則數據,雙模式就是ADC1 和ADC2 同時使用。在單模式下,ADC1/2/3 都不使用高16 位。因為ADC 的精度是12 位,無論ADC_DR 的高16 或者低16 位都放不滿,只能左對齊或者右對齊,具體是以哪一種方式存放,由ADC_CR2 的11 位ALIGN 設置。
規則通道可以有16 個這麽多,可規則數據寄存器只有一個,如果使用多通道轉換,那轉換的數據就全部都擠在了DR 裏面,前一個時間點轉換的通道數據,就會被下一個時間點的另外一個通道轉換的數據覆蓋掉,所以當通道轉換完成後就應該把數據取走,或者開啟DMA 模式,把數據傳輸到內存裏面,不然就會造成數據的覆蓋。最常用的做法就是開啟DMA 傳輸。
註入數據寄存器
ADC 註入組最多有4 個通道,剛好註入數據寄存器也有4 個,每個通道對應著自己的寄存器,不會跟規則寄存器那樣產生數據覆蓋的問題。ADC_JDRx 是32 位的,低16 位有效,高16 位保留,數據同樣分為左對齊和右對齊,具體是以哪一種方式存放,由ADC_CR2 的11 位ALIGN 設置。
6、中斷
轉換結束中斷
數據轉換結束後,可以產生中斷,中斷分為三種:規則通道轉換結束中斷,註入轉換通道轉換結束中斷,模擬看門狗中斷。其中轉換結束中斷很好理解,跟我們平時接觸的中斷一樣,有相應的中斷標誌位和中斷使能位,我們還可以根據中斷類型寫相應配套的中斷服務程序。
模擬看門狗中斷
當被ADC 轉換的模擬電壓低於低閾值或者高於高閾值時,就會產生中斷,前提是我們開啟了模擬看門狗中斷,其中低閾值和高閾值由ADC_LTR 和ADC_HTR 設置。例如我們設置高閾值是2.5V,那麽模擬電壓超過2.5V 的時候,就會產生模擬看門狗中斷,反之低閾值也一樣。
DMA 請求
規則和註入通道轉換結束後,除了產生中斷外,還可以產生DMA 請求,把轉換好的數據直接存儲在內存裏面。要註意的是只有ADC1 和ADC3 可以產生DMA 請求。有關DMA請求需要配合《STM32F10X-中文參考手冊》DMA控制器這一章節來學習。一般我們在使用ADC 的時候都會開啟DMA 傳輸。
stm32F103之ADC模數轉換