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