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