ADC簡(jiǎn)介
12位ADC是一種逐次逼近型模擬數(shù)字轉(zhuǎn)換器,它有多達(dá)18個(gè)通道,可以測(cè)量16個(gè)外部和2個(gè)內(nèi)部信號(hào)源。各通道的A/D轉(zhuǎn)換可以單次、連續(xù)、掃描或間斷模式執(zhí)行.ADC的結(jié)果可以是左對(duì)齊或者是右對(duì)齊方式存儲(chǔ)在16位數(shù)據(jù)寄存器中。
模擬看門(mén)狗特性允許應(yīng)用程序檢測(cè)輸入電壓是否超出用戶定義的高/低閾值。
ADC的輸入時(shí)鐘不得超過(guò)14MHZ,它是由PCLK2經(jīng)分頻產(chǎn)生。
ADC主要特征
12位分辨率
轉(zhuǎn)換結(jié)束、注入轉(zhuǎn)換結(jié)束和發(fā)生模擬看門(mén)狗事件時(shí)產(chǎn)生中斷
單次和連續(xù)轉(zhuǎn)換模式
從通道0到通道n的自動(dòng)掃描模式
自校準(zhǔn)
帶內(nèi)嵌數(shù)據(jù)一致性的數(shù)據(jù)對(duì)齊
采樣間隔時(shí)間可以按通道分別編程
規(guī)則轉(zhuǎn)換和注入轉(zhuǎn)換均有外部觸發(fā)選項(xiàng)
間斷模式
雙重模式(帶2個(gè)或以上ADC的器件)
ADC轉(zhuǎn)換時(shí)間
ADC供電要求:2.4V到3.6v
ADC輸入范圍:Vref-
規(guī)則通道轉(zhuǎn)換期間有DMA請(qǐng)求產(chǎn)生
ADC功能框圖
注意:1、ADC3的規(guī)則轉(zhuǎn)換和注入轉(zhuǎn)換觸發(fā)與ADC1和ADC2的不同
2、TIM8_CH4和TIM8_TRGO及他們的重映射位只存在于大容量產(chǎn)品中
ADC引腳
VDDA和VSSA應(yīng)該分別連接到VDD和VSS。
電壓輸入范圍
ADC輸入范圍為Vref-
通道選擇
有16個(gè)通道,可以把轉(zhuǎn)換組織分成兩組:規(guī)則組和注入組。在任意多個(gè)通道上以任意順序進(jìn)行的一系列轉(zhuǎn)換構(gòu)成成組轉(zhuǎn)換。例如,可以如下順序完成轉(zhuǎn)換:通道3、通道8、通道2、通道0、通道2、通道15。
規(guī)則組:由多達(dá)16個(gè)轉(zhuǎn)換組成,規(guī)則通道和它們的轉(zhuǎn)換順序在ADC_SQRx寄存器中選擇,規(guī)則組中轉(zhuǎn)換的總數(shù)應(yīng)寫(xiě)入ADC_SQR1寄存器的了L[3:0]位中
注入組:由多達(dá)4個(gè)轉(zhuǎn)換組成,注入通道和它們的轉(zhuǎn)換順序在ADC_JSQR寄存器中選擇,注入組里的轉(zhuǎn)換總數(shù)目應(yīng)寫(xiě)入ADC_JSQR寄存器的L[1:0]中
如果 ADC_SQRx 或 ADC_JSQR 寄存器在轉(zhuǎn)換期間被更改,當(dāng)前的轉(zhuǎn)換被清除,一個(gè)新的啟動(dòng)脈
沖將發(fā)送到 ADC 以轉(zhuǎn)換新選擇的組。
溫度傳感器/Vrefint內(nèi)部通道
溫度傳感器和通道ADC_IN16相連接,內(nèi)部參照電壓Vrefint和ADC_IN17相連接??梢园醋⑷牖蛞?guī)則通道對(duì)這兩個(gè)內(nèi)部通道進(jìn)行轉(zhuǎn)換
單次轉(zhuǎn)換模式
單次轉(zhuǎn)換模式下,ADC只執(zhí)行一次轉(zhuǎn)換,該模式下即可通過(guò)設(shè)置ADC_CR2寄存器的ADON位(只適用于規(guī)則通道)啟動(dòng)也可通過(guò)外部觸發(fā)啟動(dòng)(適用于規(guī)則通道或注入通道),這時(shí)CONT位為0.
一旦選擇通道的轉(zhuǎn)換完成:
如果一個(gè)規(guī)則通道被轉(zhuǎn)換:
-轉(zhuǎn)換數(shù)據(jù)被存儲(chǔ)在16位ADC_DR寄存器中
-EOC(轉(zhuǎn)換結(jié)束)標(biāo)志被設(shè)置
-如果設(shè)置了EOCIE,則產(chǎn)生中斷
如果一個(gè)注入通道被轉(zhuǎn)換
-轉(zhuǎn)換數(shù)據(jù)被存儲(chǔ)在16位的ADC_DRJ1寄存器中
-JEOC(注入轉(zhuǎn)換結(jié)束)標(biāo)志被設(shè)置
-如果設(shè)置了JEOCIE位,則產(chǎn)生中斷
連續(xù)轉(zhuǎn)換模式
在連續(xù)轉(zhuǎn)換模式中,當(dāng)前面ADC轉(zhuǎn)換一結(jié)束馬上就啟動(dòng)另一次轉(zhuǎn)換。此模式可通過(guò)外部觸發(fā)啟動(dòng)或通過(guò)設(shè)置ADC_CR2寄存器上的ADON位啟動(dòng),此時(shí)的CONT位是1.
每個(gè)轉(zhuǎn)換后:
如果一個(gè)規(guī)則通道被轉(zhuǎn)換
-規(guī)則數(shù)據(jù)被存儲(chǔ)在16位的ADC_DR寄存器中
-EOC(轉(zhuǎn)換結(jié)束)標(biāo)志被設(shè)置
-如果設(shè)置了EOCIE,則產(chǎn)生中斷
如果一個(gè)注入通道被轉(zhuǎn)換:
-轉(zhuǎn)換數(shù)據(jù)被存儲(chǔ)在16位的ADC_DRJ1寄存器中
-JEOC(注入轉(zhuǎn)換結(jié)束)標(biāo)志被設(shè)置
-如果設(shè)置了JEOCIE位,則產(chǎn)生中斷
規(guī)則通道:顧名思義,規(guī)則就是規(guī)矩的意思,我們平時(shí)一般使用的就是這個(gè)通道,或者應(yīng)該說(shuō)我們用到的就是這個(gè)通道,沒(méi)有什么要特別注意的。
注入通道:注入,可以理解為插入,插隊(duì)的意思,就是一種不安分的意思,它是一種在規(guī)則通道轉(zhuǎn)換的時(shí)候強(qiáng)行插入的一種轉(zhuǎn)換通道,如果在規(guī)則通道轉(zhuǎn)換過(guò)程中,有注入通道插隊(duì),那么就要先轉(zhuǎn)換完注入通道,等注入通道完成之后,再回到規(guī)則通道的轉(zhuǎn)換流程。這點(diǎn)跟中斷程序很像,都是不安分的主,所以注入通道只有在規(guī)則通道存在時(shí)才會(huì)出現(xiàn)。
轉(zhuǎn)換順序
規(guī)則序列
規(guī)則序列寄存器有3個(gè),分別為SQR3、SQR2、SQR1。SQR3控制著規(guī)則序列中的第一個(gè)到第六個(gè)轉(zhuǎn)換,對(duì)應(yīng)的位為:SQ1[4:0]~SQ6[4:0],第一次轉(zhuǎn)換的是位 4:0 SQ1[4:0],如果通道 16 想第一 次轉(zhuǎn)換,那么在 SQ1[4:0] 寫(xiě) 16 即可。SQR2 控制著規(guī)則序列中的第 7 到第 12 個(gè)轉(zhuǎn)換,對(duì)應(yīng)的位 為:SQ7[4:0]~SQ12[4:0],如果通道 1 想第 8 個(gè)轉(zhuǎn)換,則 SQ8[4:0] 寫(xiě) 1 即可。SQR1 控制著規(guī)則序 列中的第 13 到第 16 個(gè)轉(zhuǎn)換,對(duì)應(yīng)位為:SQ13[4:0]~SQ16[4:0],如果通道 6 想第 10 個(gè)轉(zhuǎn)換,則 SQ10[4:0] 寫(xiě) 6 即可。具體使用多少個(gè)通道,由 SQR1 的位 L[3:0] 決定,最多 16 個(gè)通道。
注入序列
注入序列寄存器JSQR只有一個(gè),最多支持4個(gè)通道,具體多少個(gè)由JSQR的JL[2:0]決定。如果JL的值小于4的話,則JSQR跟SQR決定轉(zhuǎn)換順序的設(shè)置不一樣,第一次轉(zhuǎn)換的不是JSQR1[4:0];而是JCQRx[4:0],x=4-JL,跟SQR剛好相反,如果 JL=00(1 個(gè)轉(zhuǎn)換),那么轉(zhuǎn)換的順序是從 JSQR4[4:0] 開(kāi)始,而不是從 JSQR1[4:0] 開(kāi)始,這個(gè)要注意,編程的時(shí)候不要搞錯(cuò)。當(dāng) JL 等于 4 時(shí),跟 SQR 一樣。
觸發(fā)源
通道選好了,轉(zhuǎn)換的順序也設(shè)置好了,那接下來(lái)就開(kāi)始轉(zhuǎn)換了,ADC的轉(zhuǎn)換可以由ADC控制寄存器2:ADC_CR2的ADON這個(gè)位來(lái)控制,寫(xiě)1的時(shí)候開(kāi)始轉(zhuǎn)換,寫(xiě)0的時(shí)候停止轉(zhuǎn)換,這個(gè)是最簡(jiǎn)單也是最好理解的開(kāi)啟ADC轉(zhuǎn)換的控制方式。
除了這種控制方法,ADC還支持觸發(fā)轉(zhuǎn)換,這個(gè)觸發(fā)包括內(nèi)部定時(shí)器觸發(fā)和外部IO觸發(fā)。觸發(fā)源有很多,具體選擇哪一種觸發(fā)源,由ADC控制寄存器2:ADC_CR2的EXTSEL[2:0]和JEXTSEL [2:0]位來(lái)控制。EXTSEL[2:0]用于選擇規(guī)則通道的觸發(fā)源JEXTSEL [2:0]用于選擇注入通道的觸發(fā)源。選定好觸發(fā)源之后,觸發(fā)源是否要激活,則由 ADC控制寄存器2:ADC_CR2 的
EXTTRIG 和 JEXTTRIG 這兩位來(lái)激活。其中 ADC3 的規(guī)則轉(zhuǎn)換和注入轉(zhuǎn)換的觸發(fā)源與 ADC1/2
的有所不同,在框圖上已經(jīng)表示出來(lái).
轉(zhuǎn)換時(shí)間
ADC時(shí)鐘
ADC輸入時(shí)鐘ADC_CLK由PCLK2經(jīng)過(guò)分頻產(chǎn)生,最大是14MHZ,分頻因子由RCC時(shí)鐘配置寄存器RCC_CFGR的位15:14設(shè)置,可以是2/4/6/8分頻,注意這里沒(méi)有1分頻。一般我們?cè)O(shè)置PCLK2=HCLK=72M。
采樣時(shí)間
ADC使用若干個(gè)ADC_CLK周期對(duì)輸入的電壓進(jìn)行采樣,采樣的周期數(shù)可通過(guò)ADC采樣時(shí)間寄存器ADC_SMPR1控制的是通道10~17.每個(gè)通道可以分別使用不同的時(shí)間采樣,其中采樣周期最小是1.5個(gè)。
ADC 的轉(zhuǎn)換時(shí)間跟 ADC 的輸入時(shí)鐘和采樣時(shí)間有關(guān),公式為: Tconv = 采樣時(shí)間 + 12.5 個(gè)周期。 當(dāng) ADCLK = 14MHZ (最高),采樣時(shí)間設(shè)置為 1.5 周期(最快),那么總的轉(zhuǎn)換時(shí)間(最短) Tconv = 1.5 周期 + 12.5 周期 = 14 周期 = 1us 。
一般我們?cè)O(shè)置 PCLK2=72M ,經(jīng)過(guò) ADC 預(yù)分頻器能分頻到最大的時(shí)鐘只能是 12M ,采樣周期設(shè)
置為 1.5 個(gè)周期,算出最短的轉(zhuǎn)換時(shí)間為 1.17us ,這個(gè)才是最常用的。
中斷
轉(zhuǎn)換結(jié)束中斷
數(shù)據(jù)轉(zhuǎn)換結(jié)束后可以產(chǎn)生中斷,中斷分為3種:規(guī)則通道轉(zhuǎn)換結(jié)束中斷,注入轉(zhuǎn)換通道轉(zhuǎn)換結(jié)束中斷,模擬看門(mén)狗中斷。其中轉(zhuǎn)換結(jié)束很好理解,跟我們平時(shí)接觸的中斷一樣,有相應(yīng)的中斷標(biāo)志位和中斷使能位,我們還可以根據(jù)中斷類(lèi)型寫(xiě)相應(yīng)的中斷服務(wù)程序。
模擬看門(mén)狗中斷
當(dāng)被ADC轉(zhuǎn)換的模擬電壓低于閾值或者高于閾值時(shí),就會(huì)產(chǎn)生中斷,前提是我們開(kāi)起了模擬看門(mén)狗中斷,其中低閾值和高閾值由ADC_LTR和ADC_HTR設(shè)置。例如我們?cè)O(shè)置高閾值是2.5V,那么模擬電壓超過(guò)2.5V的時(shí)候,就會(huì)產(chǎn)生模擬看門(mén)狗中斷,反之低閾值也一樣。
DMA請(qǐng)求
規(guī)則和注入通道轉(zhuǎn)換結(jié)束后,除了產(chǎn)生中斷外,還可以產(chǎn)生DMA請(qǐng)求,把轉(zhuǎn)換好的數(shù)據(jù)直接存儲(chǔ)在內(nèi)存里面。要注意的是只有ADC1和ADC3可以產(chǎn)生DMA請(qǐng)求。
ADC_Mode :配置 ADC 的模式,當(dāng)使用一個(gè) ADC 時(shí)是獨(dú)立模式,使用兩個(gè) ADC 時(shí)是雙模式,
在雙模式下還有很多細(xì)分模式可選,我們一般使用一個(gè) ADC 的獨(dú)立模式。
ScanConvMode :可選參數(shù)為 ENABLE 和 DISABLE ,配置是否使用掃描。如果是單通道 AD 轉(zhuǎn)換
使用 DISABLE ,如果是多通道 AD 轉(zhuǎn)換使用 ENABLE 。
ADC_ContinuousConvMode :可選參數(shù)為 ENABLE 和 DISABLE ,配置是啟動(dòng)自動(dòng)連續(xù)轉(zhuǎn)換還是單
次轉(zhuǎn)換。使用 ENABLE 配置為使能自動(dòng)連續(xù)轉(zhuǎn)換;使用 DISABLE 配置為單次轉(zhuǎn)換,轉(zhuǎn)換一次后
停止需要手動(dòng)控制才重新啟動(dòng)轉(zhuǎn)換。一般設(shè)置為連續(xù)轉(zhuǎn)換。
ADC_ExternalTrigConv :外部觸發(fā)選擇,圖 單個(gè) ADC 功能框圖 中列舉了很多外部觸發(fā)條件,可
根據(jù)項(xiàng)目需求配置觸發(fā)來(lái)源。實(shí)際上,我們一般使用軟件自動(dòng)觸發(fā)。
ADC_DataAlign :轉(zhuǎn)換結(jié)果數(shù)據(jù)對(duì)齊模式,可選右對(duì)齊 ADC_DataAlign_Right 或者左對(duì)齊
ADC_DataAlign_Left 。一般我們選擇右對(duì)齊模式。
ADC_NbrOfChannel : AD 轉(zhuǎn)換通道數(shù)目,根據(jù)實(shí)際設(shè)置即可。
其中實(shí)驗(yàn)可以分為4個(gè)實(shí)驗(yàn):獨(dú)立模式單通道采集實(shí)驗(yàn)(分為中斷存儲(chǔ)和DMA直接存儲(chǔ))、獨(dú)立模式多通道采集實(shí)驗(yàn)、雙重ADC同步規(guī)則模式采集實(shí)驗(yàn)
我直接以雙重ADC同步規(guī)則模式采集實(shí)驗(yàn)為例
宏定義:
main.c
個(gè)人總結(jié)
關(guān)于ADC程序驅(qū)動(dòng)的編寫(xiě),STM32官方的例程中有一些幫助,對(duì)于程序編寫(xiě)的步驟我總結(jié)如下:
1、初始ADC用到的GPIO
2、設(shè)置ADC的工作參數(shù)并初始化
3、設(shè)置ADC工作時(shí)鐘(在RCC文件的ADC設(shè)置)
4、設(shè)置ADC轉(zhuǎn)換通道順序和采樣時(shí)間
5、配置使能ADC轉(zhuǎn)換完成中斷,在中斷內(nèi)讀取轉(zhuǎn)換數(shù)據(jù)
6、如果是DMA讀取數(shù)據(jù),需要配置ADC的響應(yīng)DMA
7、使能軟件觸發(fā)ADC轉(zhuǎn)換
評(píng)論
查看更多