12-STM32 ADC原理


STM32F1 ADC

STM32的ADC注意點:

(1)STM32f103 系列有 3 個 ADC,精度為 12 位,每個 ADC 最多有 16 個外部通道。其中ADC1 和 ADC2 都有 16 個外部通道,ADC3 根據CPU 引腳的不同通道數也不同,一般都有8 個外部通道。

(2)ADC的輸入時鍾規定不得超過14MHz,它是由PCLK2經分頻產生。
(3)單次:觸發一次轉換一次;單通道:每次觸發只轉換一條通道;單通道單次轉換,多通道單次轉換,單通道連續轉換,多通道連續轉換。

(4)在單模式下,ADC1/2/3 都不使用高 16 位,高 16 位是在 ADC1 中雙模式下保存 ADC2 轉換的規則數據

(5)規則通道可以有 16 個這么多,可規則數據寄存器只有一個,如果使用多通道轉換,那轉換的數據就全部都擠在了 DR 里面,前一個時間點轉換的通道數據,就會被下一個時間點的另外一個通道轉換的數據覆蓋掉,所以當通道轉換完成后就應該把數據取走,或者開啟 DMA 模式,把數據傳輸到內存里面,不然就會造成數據的覆蓋。最常用的做法就是開啟 DMA 傳輸。

(6)注入數據寄存器ADC_JDRx 是 32 位的,低 16 位有效,高 16 位保留,數據同樣分為左對齊和右對齊

(7)注入序列的轉換順序和規則組的不同(編程時需要注意)

(8)只有 ADC1 和 ADC3 可以產生 DMA 請求

(9)內部參照電壓VREFINT與參考電壓不是一回事

(10)用來做 ADC 輸入的 IO 不能被復用,否則會導致采集到的信號不准確

(11)DMA請求:ADC1對應DMA1通道1,ADC3對應DMA2通道5

 

ADC的三個電壓:(輸入電壓,參考電壓,供電電壓)

(1)輸入電壓
ADC 輸入范圍為:V REF- ≤ V IN ≤ V REF+ 。由 V REF- 、V REF+ 、V DDA 、VSSA 這四個外部引腳決定。

 

(2)供電電壓

F103系列單片機的內部高速RC 振盪器(HSI)由VDDA、VSSA 供電,故即使不使用單片機自帶的A/D 轉換器,也必須保證VDDA、VSSA 的供電,否則STM32F103單片機不能正常啟動。

  

 (3)參考電壓

如果有VREF-引腳(根據封裝而定),它必須連接到VSSA。
100腳和144腳封裝: 確保輸入為低壓時獲得更好精度,用戶可以連接一個獨立的外部參考電壓ADC到V REF+和V REF-腳上。在V REF+的電壓范圍為2.4V~V DDA。
64腳或更少封裝:     沒有V REF+和V REF-引腳,他們在芯片內部與ADC的電源(V DDA )和地(V SSA )相聯。
Ex:
V SSA 和V REF- 接地,把V REF+ 和V DDA 接3V3,得到ADC的輸入電壓范圍為:0~3.3V。
如果我們想讓輸入的電壓范圍變寬,去到可以測試負電壓或者更高的正電壓,我們可以在外部加一個電壓調理電路,把需要轉換的電壓抬升或者降壓到 0~3.3V,這樣 ADC 就可以測量了。

 

注意:內部參照電壓VREFINT與參考電壓不是一回事

ADC的參考電壓都是通過Vref+提供的並作為ADC轉換器的基准電壓。

根據數據手冊中的數據,這個參照電壓的典型值是1.20V,最小值是1.16V,最大值是1.24V。這個電壓基本不隨外部供電電壓的變化而變化。

注:VREFINT=1.2V,VREF為參考電壓值=3.3V

當我們使用的Vref+是直接取自用VCC電壓時,當VCC電壓波動比較大時或穩壓性能比較差時,可以借用STM32的內部參照電壓VREFINT校正測量精度。

以測量1通道的電壓值為例,先讀出參照電壓的ADC測量結果,記為Adre; 再讀出要測量通道1的ADC轉換結果,記為ADch1;
則要測量的電壓為:Vch1 = VREFINT* (((ADch1*(VREF/4096))/(ADre*(VREF/4096)))

公式簡化: Vch1 = VREFINT*(ADch1/ADre) 
這種方法等於變相將內部參照電壓VREFINT當成是ADC參考電壓,也就是說,此時Vref參考電壓的准確度已在此已對結果影響不大了,ADC的轉換結果基本由VREFINT的精度決定。

注:一般情況下,這種辦法只適合於當Vref+參考電壓(其實也就是VCC電壓)離散性實在太差的情況下使用。
 


輸入通道(將輸入電壓輸入進去ADC中進行采樣)

 

我們確定好 ADC 輸入電壓之后,那么電壓怎么輸入到 ADC?

STM32 的 ADC 多達 18 個通道,其中外部的 16 個通道就是框圖中的 ADCx_IN0...ADCx_IN5。這 16 個通道對應着不同的 IO 口
其中ADC1/2/3還有內部通道:ADC1的通道16連接到了芯片內部的溫度傳感器, Vrefint 連接到了通道 17
ADC2 的模擬通道 16 和 17 連接到了內部的 VSS。
ADC3 的模擬通道 9、14、15、16 和 17 連接到了內部的 VSS。

 


外部的 16 個通道在轉換的時候又分為規則通道和注入通道:

規則通道:就是很規矩的意思,我們平時一般用到的都是這個通道
注入通道: 注入,可以理解為插入,插隊的意思,是一種不安分的通道。如果在規則通道轉換過程中,有注入通道插隊,那么就要先轉換完注入通道,等注入通道轉換完成后,再回到規則通道的轉換流程(類似中斷)。所以,注入通道只有在規則通道存在時才會出現。

規則通道最多有 16路,注入通道最多有 4 路。

 

轉換順序
規則序列轉換順序:規則序列寄存器有 3 個,分別為 SQR3、SQR2、SQR1
SQR3 控制着規則序列中的第一個到第六次轉換,對應的位為:SQ1[4:0]~SQ6[4:0]
SQR2 控制着規則序列中的第7個到第12次轉換
SQR1 控制着規則序列中的第13個到第16次轉換
Ex: 如果通道 16 想第一次轉換,那么在 SQ1[4:0]寫 16 即可

★具體使用多少個通道,由 SQR1 的位SQL[3:0]決定,最多 16 個通道。

 

注入序列轉換順序:

注入序列寄存器 JSQR 只有一個,最多支持 4 個通道,具體多少個通道需要轉換由 JSQR 的JL[1:0]決定。
★如果JL的值小於4 的話,則 JSQR 跟 SQR 決定轉換順序的設置不一樣,第一次轉換的不是 JSQR1[4:0],而是 JCQRx[4:0] ,x = (4-JL);

如果 JL=00(1 個換),那么轉換的順序是從 JSQR4[4:0]開始,而不是從 JSQR1[4:0]開始,這個要注意,編程的時候不要搞錯

★當 JL 等於 4 時,跟 SQR 一樣

 

 

 

 

觸發源

通道選好了,轉換的順序也設置好了,那接下來就該開始轉換了。
①ADC 轉換可以由ADC控制寄存器2:ADC_CR2 的 ADON 這個位來控制。
ADON=1 --開始轉換
ADON=0 --停止轉換

②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 的有所不同。

 

 

轉換時間

 

ADC輸入時鍾 ADC_CLK 由 PCLK2 經過分頻產生,最大不超過 14M(數字量化需要時間,太快准確率會下降),分頻因子由 RCC 時鍾配置寄存器 RCC_CFGR 的位 15:14 ADCPRE[1:0]設置,可以是 2/4/6/8 分頻

采樣時間:(采樣周期越短,ADC轉換數據輸出周期就越短但數據精度也越低,采樣周期越長ADC轉換數據輸出周期就越長同時數據精度越高)   
ADC使用若干個ADC_CLK周期對輸入的電壓進行采樣,采樣的周期數可通過 ADC 采樣時間寄存器 ADC_SMPR1 和 ADC_SMPR2 中的 SMP[2:0]位設置:ADC_SMPR2 控制的是通道 0~9, ADC_SMPR1 控制的是通道 10~17。
每個通道可以分別用不同的時間采樣。其中采樣周期最小是 1.5 個,即如果我們要達到最快的采樣,那么應該設置采樣周期為 1.5 個周期,這里說的周期就是 1/ADC_CLK

ADC 的轉換時間:與 ADC 的輸入時鍾和采樣時間有關,公式為:Tconv=采樣時間 +12.5 個周期。當 ADCLK = 14MHZ(規定的最高),采樣時間設置為 1.5 周期(最快),那么總的轉換時間(最短)Tconv = 1.5 周期 + 12.5 周期 = 14 周期 = 14×1/ADC_CLK =1 us。

由於ADC時鍾不超過14M,則分頻系數只能設置為6和8,當設置為6時 ADC 預分頻器能分頻到最大的時鍾只能是 12M,采樣周期設置為 1.5 個周期,算出最短的轉換時間為 1.17us,這個才是最常用的。

 

 

數據寄存器


一切准備就緒后,ADC 轉換后的數據根據轉換組的不同,規則組的數據放在 ADC_DR寄存器,注入組的數據放在 JDRx。

規則數據寄存器
ADC 規則組數據寄存器 ADC_DR 只有一個,是一個 32 位的寄存器,低 16 位在單 ADC時使用(在單模式下,ADC1/2/3 都不使用高 16 位),高 16 位是在 ADC1 中雙模式下保存 ADC2 轉換的規則數據。
雙模式就是 ADC1 和ADC2 同時使用。

因為 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 設置。

 

 

中斷
利用 ADC 轉換完成中斷可以非常方便的保證我們讀取到的數據是轉換完成后的數據而不用擔心該數據可能是ADC正在轉換時“不穩定”的數據。


轉換結束中斷 :
數據轉換結束后,可以產生中斷,中斷分為三種:
1)規則通道轉換結束中斷
2)注入通道轉換結束中斷
3)模擬看門狗中斷
其中轉換結束中斷很好理解,跟我們平時接觸的中斷一樣,有相應的中斷標志位和中斷使能位,我們還可以根據中斷類型寫相應配套的中斷服務程序。

模擬看門狗中斷
當被 ADC 轉換的模擬電壓低於低閾值或者高於高閾值時,就會產生中斷,前提是我們開啟了模擬看門狗中斷,其中低閾值和高閾值由 ADC_LTR 和 ADC_HTR 設置。例如我們設置高閾值是 2.5V,那么模擬電壓超過 2.5V 的時候,就會產生模擬看門狗中斷,反之低閾值也一樣。

 

 

DMA 請求

規則和注入通道轉換結束后,除了產生中斷外,還可以產生 DMA 請求,把轉換好的數據直接存儲在內存里面。要注意的是只有 ADC1 和 ADC3 可以產生 DMA 請求。一般我們在使用 ADC 的時候都會開啟 DMA 傳輸。

ADC1對應DMA1通道1,ADC3對應DMA2通道5

 

 

 

 

 


https://blog.csdn.net/bianjingshan/article/details/56478999

 


電壓轉換
我們一般在設計原理圖的時候會把 ADC 的輸入電壓范圍設定在:0~3.3v,因為 ADC是 12 位的,那么 12 位滿量程對應的就是 3.3V,12 位滿量程對應的數字值是:2^12。

數值0 對應的就是 0V。如果轉換后的數值為 X ,X 對應的模擬電壓為 Y,那么會有這么一個等式成立: Y = (3.3 * X ) / 2^12。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM