ADC(analog to digital converter)即模數(shù)轉換器,它可以將模擬信號轉換為數(shù)字信號。按照其轉換原理主要分為逐次逼近型、雙積分型、電壓頻率轉換型三種。STM32F1 的 ADC 就是逐次逼近型的模擬數(shù)字轉換器。
STM32F103 系列一般都有 3 個 ADC,這些 ADC 可以獨立使用,也可以使用雙重/三重模式(提高采樣率)。STM32F1 的 ADC 是 12 位逐次逼近型的模擬數(shù)字轉換器。它具有多達 18 個復用通道,可測量來自 16 個外部源、2 個內部信號源。 這些通道的 A/D 轉換可以單次、連續(xù)、掃描或間斷模式執(zhí)行。ADC 的結果可以左對齊或右對齊方式存儲在 16 位數(shù)據(jù)寄存器中。ADC 具有模擬看門狗特性,允許應用程序檢測輸入電壓是否超出用戶定義的閥值上限或者下限。
STM32F1 ADC 主要特性:
● 12 位分辨率
● 轉換結束、注入轉換結束和發(fā)生模擬看門狗事件時產(chǎn)生中斷
● 單次和連續(xù)轉換模式
● 從通道 0 到通道 n 的自動掃描模式
● 自校準
● 帶內嵌數(shù)據(jù)一致性的數(shù)據(jù)對齊
● 采樣間隔可以按通道分別編程
● 規(guī)則轉換和注入轉換均有外部觸發(fā)選項
● 間斷模式
● 雙重模式(帶 2 個或以上 ADC 的器件)
● ADC 轉換時間:
─ STM32F103xx 增強型產(chǎn)品:時鐘為 56MHz 時為 1μs(時鐘為 72MHz 為 1.17μs)
─ STM32F101xx 基本型產(chǎn)品:時鐘為 28MHz 時為 1μs(時鐘為 36MHz 為 1.55μs)
─ STM32F102xxUSB 型產(chǎn)品:時鐘為 48MHz 時為 1.2μs
─ STM32F105xx和STM32F107xx產(chǎn)品:時鐘為56MHz時為1μs(時鐘為72MHz為 1.17μs)
● ADC 供電要求: 2.4V 到 3.6V
● ADC 輸入范圍: VREF- ≤ VIN ≤ VREF+
● 規(guī)則通道轉換期間有 DMA 請求產(chǎn)生。
STM32F1 ADC 結構框圖
STM32F1 ADC 擁有這么多功能,是由 ADC 內部結構所決定。要更好地理解STM32F1 的 ADC,就需要了解它內部的結構。如圖 28.1.1 所示:
我們把 ADC 結構框圖分成 7 個子模塊,按照順序依次進行簡單介紹。
(1)標號 1:電壓輸入引腳
ADC 輸入電壓范圍為: VREF- ≤ VIN ≤ VREF+。由 VREF-、 VREF+ 、VDDA 、 VSSA 這四個外部引腳決定。通常我們把 VSSA 和 VREF-接地,把 VREF+和 VDDA 接 3.3V,因此 ADC 的輸入電壓范圍為:0~3.3V。我們使用的開發(fā)板 ADC輸入電壓范圍為 0~3.3V。
如果我們想讓 ADC 測試負電壓或者更高的正電壓,可以在外部加一個電壓調理電路,把需要轉換的電壓抬升或者降壓到 0~3.3V,這樣 ADC 就可以測量了。但一定記住,不要直接將高于 3.3V 的電壓接到 ADC 管腳上,那樣將可能燒壞芯片。
(2)標號 2:輸入通道
STM32 的 ADC 的輸入通道多達 18 個,其中外部的 16 個通道就是框圖中的 ADCx_IN0、ADCx_IN1.。.ADCx_IN5(x=1/2/3,表示 ADC 數(shù)),通過這 16 個外部通道可以采集模擬信號。這 16 個通道對應著不同的 IO 口, 具體是哪一個IO 口可以從數(shù)據(jù)手冊查詢到,也可以從圖 28.1.2 查看,同樣我們在開發(fā)板芯片原理圖內也給大家標注了。其中 ADC1 還有 2 個內部通道:ADC1 的通道 16 連接到了芯片內部的溫度傳感器,通道 17 連接到了內部參考電壓 VREFINT。ADC2 和ADC3 的通道 16、 17 全部連接到了內部的 VSS。
(3)標號 3:通道轉換順序
外部的 16 個通道在轉換的時候可分為 2 組通道:規(guī)則通道組和注入通道組,其中規(guī)則通道組最多有 16 路,注入通道組最多有 4 路。
規(guī)則通道組:從名字來理解,規(guī)則通道就是一種規(guī)規(guī)矩矩的通道,類似于正常執(zhí)行的程序。通常我們使用的都是這個通道。
注入通道組:從名字來理解,注入即為插入,是一種不安分的通道,類似于中斷。當程序正常往下執(zhí)行時,中斷可以打斷程序的執(zhí)行。同樣如果在規(guī)則通道轉換過程中,有注入通道插隊,那么就要先轉換完注入通道,等注入通道轉換完成后,再回到規(guī)則通道的轉換流程。
每個組包含一個轉換序列,該序列可按任意順序在任意通道上完成。例如,可按以下順序對序列進行轉換: ADC_IN3、ADC_IN8、 ADC_IN2、 ADC_IN2、ADC_IN0、 ADC_IN2、 ADC_IN2、 ADC_IN15。規(guī)則通道組序列寄存器有 3 個,分別是 SQR3、 SQR2、 SQR1。 SQR3 控制著規(guī)則序列中的第一個到第六個轉換,對應的位為:SQ1[4:0]~SQ6[4:0],第一次轉換的是位 4:0 SQ1[4:0],如果通道 3 想第一次轉換,那么在 SQ1[4:0]寫 3即可。SQR2 控制著規(guī)則序列中的第 7 到第 12 個轉換,對應的位為:SQ7[4:0]~SQ12[4:0],如果通道 1 想第 8 個轉換,則 SQ8[4:0]寫 1 即可。SQR1 控 制 著 規(guī) 則 序 列 中 的 第 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[1:0] = 3(有 4 次注入轉換)時, ADC 將按以下順序轉換通道:JSQ1[4:0]、JSQ2[4:0]、 JSQ3[4:0] 和 JSQ4[4:0]。
當 JL = 2 (有 3 次注入轉換)時,ADC 將按以下順序轉換通道:JSQ2[4:0]、JSQ3[4:0] 和 JSQ4[4:0]。
當 JL = 1 (有 2 次注入轉換)時,ADC 轉換通道的順序為:先是 JSQ3[4:0],而后是 JSQ4[4:0]。
當 JL = 0(有 1 次注入轉換)時, ADC 將僅轉換 JSQ4[4:0] 通道。
如果在轉換期間修改 ADC_SQRx 或 ADC_JSQR 寄存器,將復位當前轉換并向ADC 發(fā)送一個新的啟動脈沖,以轉換新選擇的通道組。
(4)標號 4:觸發(fā)源
選擇好輸入通道,設置好轉換順序,接下來就可以開始轉換。要開啟 ADC轉換,可以直接設置 ADC 控制寄存器 ADC_CR2 的 ADON 位為 1,即使能 ADC。當然 ADC 還支持外部事件觸發(fā)轉換,觸發(fā)源有很多,具體選擇哪一種觸發(fā)源,由 ADC控制寄存器 2:ADC_CR2 的 EXTSEL[2:0]和 JEXTSEL[2:0]位來控制。EXTSEL[2:0]用于選擇規(guī)則通道的觸發(fā)源,JEXTSEL[2:0]用于選擇注入通道的觸發(fā)源。選定好觸發(fā)源之后,觸發(fā)源是否要激活,則由 ADC 控制寄存器 ADC_CR2 的 EXTTRIG 和JEXTTRIG 這兩位來激活。
如果使能了外部觸發(fā)事件,我們還可以通過設置 ADC 控制寄存器2:ADC_CR2 的 EXTEN[1:0]和 JEXTEN[1:0]來控制觸發(fā)極性,可以有 4 種狀態(tài),分別是:禁止觸發(fā)檢測、上升沿檢測、下降沿檢測以及上升沿和下降沿均檢測。
(5)標號 5:ADC 時鐘
ADC 輸入時鐘 ADC_CLK 由 APB2 經(jīng)過分頻產(chǎn)生,最大值是 14MHz,分頻因子由 RCC 時鐘配置寄存器 RCC_CFGR 的位 15:14 ADCPRE[1:0]設置,可以是2/4/6/8 分頻,注意這里沒有 1 分頻。我們知道 APB2 總線時鐘為 72M,而 ADC最大工作頻率為 14M,所以一般設置分頻因子為 6,這樣 ADC 的輸入時鐘為 12M。
ADC 要完成對輸入電壓的采樣需要若干個 ADC_CLK 周期,采樣的周期數(shù)可通過 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 個周期
其中 Tconv 為 ADC 總轉換時間,當 ADC_CLK=14Mhz 的時候,并設置 1.5 個周期的采樣時間,則 Tcovn=1.5+12.5=14 個周期=1us。通常經(jīng)過 ADC 預分頻器能分頻到最大的時鐘只能是 12M,采樣周期設置為 1.5 個周期,算出最短的轉換時間為 1.17us,這個才是最常用的。
(6)標號 6:數(shù)據(jù)寄存器
ADC 轉換后的數(shù)據(jù)根據(jù)轉換組的不同,規(guī)則組的數(shù)據(jù)放在 ADC_DR 寄存器內,注入組的數(shù)據(jù)放在 JDRx 內。
因為 STM32F1 的 ADC 是 12 位轉換精度,而數(shù)據(jù)寄存器是 16 位,所以 ADC在存放數(shù)據(jù)的時候就有左對齊和右對齊區(qū)分。如果是左對齊,AD 轉換完成數(shù)據(jù)存放在 ADC_DR 寄存器的[4:15]位內;如果是右對齊,則存放在 ADC_DR 寄存器的[0:11]位內。具體選擇何種存放方式,需通過 ADC_CR2 的 11 位 ALIGN 設置。
在規(guī)則組中,含有 16 路通道,對應著存放規(guī)則數(shù)據(jù)的寄存器只有 1 個,如果使用多通道轉換,那么轉換后的數(shù)據(jù)就全部擠在 ADC_DR 寄存器內,前一個時間點轉換的通道數(shù)據(jù),就會被下一個時間點的另外一個通道轉換的數(shù)據(jù)覆蓋掉,所以當通道轉換完成后就應該把數(shù)據(jù)取走,或者開啟 DMA 模式,把數(shù)據(jù)傳輸?shù)絻却胬锩妫蝗痪蜁斐蓴?shù)據(jù)的覆蓋。 最常用的做法就是開啟 DMA 傳輸。如果沒有使用 DMA 傳輸,我們一般通過 ADC 狀態(tài)寄存器 ADC_SR 獲取當前 ADC 轉換的進度狀態(tài),進而進行程序控制。
而在注入組中,最多含有 4 路通道,對應著存放注入數(shù)據(jù)的寄存器正好有 4個,不會跟規(guī)則寄存器那樣產(chǎn)生數(shù)據(jù)覆蓋的問題。
(7)標號 7:中斷
當發(fā)生如下事件且使能相應中斷標志位時,ADC 能產(chǎn)生中斷。
1.轉換結束(規(guī)則轉換)與注入轉換結束
數(shù)據(jù)轉換結束后,如果使能中斷轉換結束標志位,轉換一結束就會產(chǎn)生轉換結束中斷。
2.模擬看門狗事件
當被 ADC 轉換的模擬電壓低于低閾值或者高于高閾值時,就會產(chǎn)生中斷,前提是我們開啟了模擬看門狗中斷,其中低閾值和高閾值由 ADC_LTR 和ADC_HTR 設置。
3.DMA 請求
規(guī)則和注入通道轉換結束后,除了產(chǎn)生中斷外,還可以產(chǎn)生 DMA 請求,把轉換好的數(shù)據(jù)直接存儲在內存里面。要注意的是只有 ADC1 和 ADC3 可以產(chǎn)生DMA 請求。一般我們在使用 ADC 的時候都會開啟 DMA 傳輸。我們知道 STM32F1 ADC 轉換模式有單次轉換與連續(xù)轉換區(qū)分。
在單次轉換模式下,ADC 執(zhí)行一次轉換。可以通過 ADC_CR2 寄存器的SWSTART 位(只適用于規(guī)則通道)啟動,也可以通過外部觸發(fā)啟動(適用于規(guī)則通道和注入通道),這時 CONT 位為 0。以規(guī)則通道為例,一旦所選擇的通道轉換完成,轉換結果將被存在 ADC_DR 寄存器中,EOC(轉換結束)標志將被置位,如果設置了 EOCIE,則會產(chǎn)生中斷。然后 ADC 將停止,直到下次啟動。
在連續(xù)轉換模式下,ADC 結束一個轉換后立即啟動一個新的轉換。CONT 位為 1 時,可通過外部觸發(fā)或將 ADC_CR2 寄存器中的 SWSTRT 位置 1 來啟動此模式(僅適用于規(guī)則通道)。需要注意的是:此模式無法連續(xù)轉換注入通道。連續(xù)模式下唯一的例外情況是,注入通道配置為在規(guī)則通道之后自動轉換(使用JAUTO 位)。
審核編輯 黃昊宇
-
單片機
+關注
關注
6039文章
44583瀏覽量
636483 -
adc
+關注
關注
98文章
6513瀏覽量
545041 -
STM32
+關注
關注
2270文章
10910瀏覽量
356600 -
模數(shù)轉換器
+關注
關注
26文章
3209瀏覽量
126884 -
stm32f1
+關注
關注
1文章
56瀏覽量
12223
發(fā)布評論請先 登錄
相關推薦
評論