STM32F103RCT 包含有 3 個(gè) ADC火欧。STM32 的 ADC 最大的轉(zhuǎn)換速率為 1Mhz,也就是轉(zhuǎn)換時(shí)間為 1us(在 ADCCLK=14M,采樣周期為 1.5 個(gè) ADC 時(shí)鐘下得到)咕村,不要讓 ADC 的時(shí)鐘超過 14M啡省,否則將導(dǎo)致結(jié)果準(zhǔn)確度下降的圆。STM32 的 ADC 是 12 位逐次逼近型的模擬數(shù)字轉(zhuǎn)換器贮配。它有 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ù)寄存器中陡舅。 模擬看門狗特性允許應(yīng)用程序檢測(cè)輸入電壓是否超出用戶定義的高/低閥值伴挚。
● 12-位分辨率
● 轉(zhuǎn)換結(jié)束,注入轉(zhuǎn)換結(jié)束和發(fā)生模擬看門狗事件時(shí)產(chǎn)生中斷
● 單次和連續(xù)轉(zhuǎn)換模式
● 從通道 0 到通道 n 的自動(dòng)掃描模式
● 自校準(zhǔn)
● 帶內(nèi)嵌數(shù)據(jù)一致的數(shù)據(jù)對(duì)齊
● 通道之間采樣間隔可編程
● 規(guī)則轉(zhuǎn)換和注入轉(zhuǎn)換均有外部觸發(fā)選項(xiàng)
● 間斷模式
● 雙重模式(帶 2 個(gè) ADC 的器件)
● ADC 供電要求:2.4V 到 3.6V
● ADC 輸入范圍:V REF- ≤ V IN ≤ V REF+
● 規(guī)則通道轉(zhuǎn)換期間有 DMA 請(qǐng)求產(chǎn)生茎芋。
stm32把ADC轉(zhuǎn)換分成2個(gè)通道組:規(guī)則通道組相當(dāng)于正常運(yùn)行的程序;注入通道組相當(dāng)于中斷田弥。程序初始化階段設(shè)置好不同的轉(zhuǎn)換組,系統(tǒng)運(yùn)行中不用變更循環(huán)轉(zhuǎn)換的配置偷厦,從而達(dá)到任務(wù)互不干擾和快速切換。
● 規(guī)則組由多達(dá)16個(gè)轉(zhuǎn)換組成沪哺。規(guī)則通道和它們的轉(zhuǎn)換順序在ADC_SQRx寄存器中選擇。 規(guī)則組中轉(zhuǎn)換的總數(shù)應(yīng)寫入ADC_SQR1寄存器的L[3:0]位中辜妓。
● 注入組由多達(dá)4個(gè)轉(zhuǎn)換組成忌怎。注入通道和它們的轉(zhuǎn)換順序在ADC_JSQR寄存器中選擇。 注入組里的轉(zhuǎn)換總數(shù)目應(yīng)寫入ADC_JSQR寄存器的L[1:0]位中榴啸。如果ADC_SQRx或ADC_JSQR寄存器在轉(zhuǎn)換期間被更改孽惰,當(dāng)前的轉(zhuǎn)換被清除,一個(gè)新的啟動(dòng)脈沖將發(fā)送到ADC以轉(zhuǎn)換新選擇的組鸥印。
CONT=0勋功,SCAN=0 單次轉(zhuǎn)換模式(Single conversion mode)單次掃描1通道
CONT=1坦报,SCAN=0 連續(xù)轉(zhuǎn)換模式(Continuous conversion mode) 連續(xù)掃描1通道
CONT=0,SCAN=1 掃描轉(zhuǎn)換模式(Scan mode):所有ADC_SQR序列通道轉(zhuǎn)換一次后停止狂鞋。(單次掃描組)
CONT=1片择,SCAN=1 掃描轉(zhuǎn)換模式(Scan mode):所有ADC_SQR序列通道轉(zhuǎn)換一次后,再從第一個(gè)通道循環(huán)骚揍。連續(xù)掃描一組
ADC在采用規(guī)則通道組采集的時(shí)候必須啟用掃描模式字管,并且啟用DMA傳輸支持。
寄存器介紹:
ADC_CR1 的 SCAN 位信不,該位用于設(shè)置掃描模式嘲叔,由軟件設(shè)置和清除,如果設(shè)置為 1抽活,則使用掃描模式硫戈,如果為 0,則關(guān)閉掃描模式下硕。在掃描模式下丁逝,由 ADC_SQRx 或 ADC_JSQRx 寄存器選中的通道被轉(zhuǎn)換。如果設(shè)置了 EOCIE 或 JEOCIE卵牍,只在最后一個(gè)通道轉(zhuǎn)換完畢后才會(huì)產(chǎn)生 EOC 或 JEOC 中斷果港。
ADC_CR1[19:16]用于設(shè)置 ADC 的操作模式,詳細(xì)的對(duì)應(yīng)關(guān)系如圖
ADON 位用于開關(guān) AD 轉(zhuǎn)換器糊昙。而 CONT 位用于設(shè)置是否進(jìn)行連續(xù)轉(zhuǎn)換辛掠,我們使用單次轉(zhuǎn)換,所以 CONT 位必須為 0释牺。CAL 和 RSTCAL 用于AD 校準(zhǔn)萝衩。ALIGN 用于設(shè)置數(shù)據(jù)對(duì)齊,我們使用右對(duì)齊没咙,該位設(shè)置為 0猩谊。
這里使用的是軟件觸發(fā)(SWSTART),所以設(shè)置這 3 個(gè)位為 111祭刚。ADC_CR2 的SWSTART 位用于開始規(guī)則通道的轉(zhuǎn)換牌捷,我們每次轉(zhuǎn)換(單次轉(zhuǎn)換模式下)都需要向該位寫 1。AWDEN 為用于使能溫度傳感器和 Vrefint涡驮。
對(duì)于每個(gè)要轉(zhuǎn)換的通道,采樣時(shí)間建議盡量長(zhǎng)一點(diǎn)捉捅,以獲得較高的準(zhǔn)確度,但是這樣會(huì)降低 ADC 的轉(zhuǎn)換速率寄月。ADC 的轉(zhuǎn)換時(shí)間可以由以下公式計(jì)算:
Tcovn=采樣時(shí)間+12.5 個(gè)周期
其中:Tcovn 為總轉(zhuǎn)換時(shí)間,采樣時(shí)間是根據(jù)每個(gè)通道的 SMP 位的設(shè)置來決定的厂抖。例如初橘,當(dāng) ADCCLK=14Mhz 的時(shí)候,并設(shè)置 1.5 個(gè)周期的采樣時(shí)間耕蝉,則得到:Tcovn=1.5+12.5=14 個(gè)周
期=1us垒在。
ADC 規(guī)則序列寄存器(ADC_SQR1~3),該寄存器總共有 3 個(gè)扔亥。
L[3:0]用于存儲(chǔ)規(guī)則序列的長(zhǎng)度旅挤,我們這里只用了 1 個(gè),所以設(shè)置這幾個(gè)位的值為 0签舞。其他的 SQ13~16 則存儲(chǔ)了規(guī)則序列中第 13~16 通道的編號(hào)(編號(hào)范圍:0~17)儒搭。另外兩個(gè)規(guī)則序列寄存器同 ADC_SQR1 大同小異芙贫。選擇的是單次轉(zhuǎn)換,所以只有一個(gè)通道在規(guī)則序列里面魂仍,這個(gè)序列就是 SQ1拣挪,通過 ADC_SQR3 的最低 5位(也就是 SQ1)設(shè)置。
ADC 規(guī)則數(shù)據(jù)寄存器(ADC_DR)。規(guī)則序列中的 AD 轉(zhuǎn)化結(jié)果都將被存在這個(gè)寄存器里面闸英,而注入通道的轉(zhuǎn)換結(jié)果被保存在 ADC_JDRx 里面。
步驟:
1 ) 開啟 PA 口時(shí)鐘出吹,設(shè)置 PA1 為模擬輸入辙喂。
STM32F103RCT6 的 ADC 通道 1 在 PA1 上巍耗,所以,我們先要使能 PORTA 的時(shí)鐘灸蟆,然后設(shè)置 PA1 為模擬輸入亲族。
2 ) 使能 ADC1 時(shí)鐘霎迫,并設(shè)置分頻因子。
要使用 ADC1瓤帚,第一步就是要使能 ADC1 的時(shí)鐘炼鞠,在使能完時(shí)鐘之后,進(jìn)行一次 ADC1 的復(fù)位朝扼。接著我們就可以通過 RCC_CFGR 設(shè)置 ADC1 的分頻因子霎肯。分頻因子要確保 ADC1 的時(shí)鐘(ADCCLK)不要超過 14Mhz。
3 ) 設(shè)置 ADC1 的工作模式搂捧。
在設(shè)置完分頻因子之后允跑,我們就可以開始 ADC1 的模式配置了,設(shè)置單次轉(zhuǎn)換模式索烹、觸發(fā)方式選擇百姓、數(shù)據(jù)對(duì)齊方式等都在這一步實(shí)現(xiàn)况木。
4 ) 設(shè)置 ADC1 規(guī)則序列的相關(guān)信息。
接下來我們要設(shè)置規(guī)則序列的相關(guān)信息求类,我們這里只有一個(gè)通道仑嗅,并且是單次轉(zhuǎn)換的张症,所以設(shè)置規(guī)則序列中通道數(shù)為 1(ADC_SQR1[23:20]=0000),然后設(shè)置通道 1 的采樣周期(通過ADC_SMPR2[5:3]置)脖捻。
5 ) 開啟 AD 轉(zhuǎn)換器地沮,并校準(zhǔn)羡亩。
在設(shè)置完了以上信息后,我們就開啟 AD 轉(zhuǎn)換器雷袋,執(zhí)行復(fù)位校準(zhǔn)和 AD 校準(zhǔn)楷怒,注意這兩步是必須的瓦灶!不校準(zhǔn)將導(dǎo)致結(jié)果很不準(zhǔn)確。
6 ) 讀取 ADC 值刃泡。
在上面的校準(zhǔn)完成之后,ADC 就算準(zhǔn)備好了家卖。接下來我們要做的就是設(shè)置規(guī)則序列 1 里面的通道(通過 ADC_SQR3[4:0]設(shè)置)庙楚,然后啟動(dòng) ADC 轉(zhuǎn)換馒闷。在轉(zhuǎn)換結(jié)束后纳账,讀取 ADC1_DR 里面的值就是了捺疼。