一、模數(shù)轉(zhuǎn)換器概述
??在STM32微控制器系列中,ADC(Analog-to-Digital Converter)是一個(gè)重要的外設(shè)模塊,它允許微控制器將模擬信號(hào)轉(zhuǎn)換成數(shù)字信號(hào)以進(jìn)行處理。模擬信號(hào)–>數(shù)字信號(hào)。
?? MCU只能處理數(shù)字量(10011001),如果需要MCU區(qū)分模擬輸入信號(hào)時(shí),MCU直接做不了,需要將模擬信號(hào)通過(guò)模數(shù)轉(zhuǎn)換器,轉(zhuǎn)成數(shù)字量供MCU處理。模數(shù)轉(zhuǎn)換器一般用在各類傳感器〈光敏電阻)上,還有部分用在音視頻處理上。
?
二、模數(shù)轉(zhuǎn)換器分類
(1)并聯(lián)比較型
(2)逐次逼近型(天平稱重原理類型)
??轉(zhuǎn)換開始前先將所有寄存器清零。開始轉(zhuǎn)換以后,時(shí)鐘脈沖首先將寄存器最高位置成1,使輸出數(shù)字為100···0。這個(gè)數(shù)碼被D/A轉(zhuǎn)換器轉(zhuǎn)換成相應(yīng)的模擬電壓Uo,送到比較器中與Ui進(jìn)行比較。
??若Ui<Uo,說(shuō)明數(shù)字過(guò)大了,故將最高位的1清除為0。將下一位置1,繼續(xù)進(jìn)行比較。(減/換砝碼)
??若Ui>Uo,說(shuō)明數(shù)字還不夠大,應(yīng)將這一位保留。然后,再按同樣的方式將下一次高位置成1 ,再繼續(xù)進(jìn)行比較。(加砝碼)
??并且經(jīng)過(guò)比較以后確定這個(gè)1是否應(yīng)該保留。這樣逐位比較下去,一直到最低位為止。比較完畢后,寄存器中的狀態(tài)就是所要求的數(shù)字量輸出。
?
三、模數(shù)轉(zhuǎn)換器主要參數(shù)
?? 分辨率:它表明A/D對(duì)模擬信號(hào)的分辨能力,由它確定能被A/D辨別的最小模擬量變化。通常為8,10,12,16位等。如電壓為0~3.3v,分辨率為4096,則可識(shí)別最小A/D模擬量變化為 3.3/ 4096 v。
?? 轉(zhuǎn)換時(shí)間:轉(zhuǎn)換時(shí)間是A/D完成一次轉(zhuǎn)換所需要的時(shí)間。一般轉(zhuǎn)換速度。越快越好。
?
四、STM32中的模數(shù)轉(zhuǎn)換器
??分辨率12位(最高)ADC是逐次趨近型模數(shù)轉(zhuǎn)換器。它具有多達(dá)19個(gè)復(fù)用通道,可測(cè)量來(lái)自16眾外部源、兩個(gè)內(nèi)部源和VBAT通道的信號(hào)。這些通道的A/D轉(zhuǎn)換可在單次、連續(xù)、掃描或不連續(xù)采樣模式下進(jìn)行。ADC的結(jié)果存儲(chǔ)在一個(gè)左對(duì)齊或右對(duì)齊的16位數(shù)據(jù)寄存器中。
??ADC具有模擬看門狗特性,允許應(yīng)用檢測(cè)輸入電壓是否超過(guò)了用戶自定義的閾值上限或下限。
1. 主要特性:
? ?●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的器件)
2. 框圖:
3. 功能分析:
(1) ADC開關(guān)控制
??可通過(guò)將 ADC_CR2寄存器中的 ADON位置1來(lái)為ADC供電。首次將ADON位置1時(shí),會(huì)將ADC 從掉電(低功耗)模式中喚醒。SWSTART或JSWSTART位置1時(shí),啟動(dòng)AD 轉(zhuǎn)換。
??可通過(guò)將 ADON位清零來(lái)停止轉(zhuǎn)換,并使ADC進(jìn)入掉電(低功耗)模式。在此模式下ADC 幾乎不耗電(只有幾A)。
(2) ADC時(shí)鐘
ADC具有兩個(gè)時(shí)鐘方案:
??用于數(shù)字接口的時(shí)鐘:(用于寄存器讀/寫訪問(wèn))此時(shí)鐘等效于APB2時(shí)鐘??梢酝ㄟ^(guò) RCC APB2外設(shè)時(shí)鐘使能寄存器(RCC_APB2ENR)分別為每個(gè)ADC使能/禁止數(shù)字接口時(shí)鐘。
??用于模擬電路的時(shí)鐘:ADCCLK,所有ADC共用此時(shí)鐘來(lái)自于經(jīng)可編程預(yù)分頻器分頻的APB2時(shí)鐘,該預(yù)分頻器允許ADC在fpclk2/2、/4、/6或/8下工作。有關(guān)ADCCLK的最大值,請(qǐng)參見數(shù)據(jù)手冊(cè)。
(3)通道選擇
??有16條復(fù)用通道??梢詫⑥D(zhuǎn)換分為兩組:規(guī)則轉(zhuǎn)換(規(guī)則組)和注入轉(zhuǎn)換(注入組)。每個(gè)組包含一個(gè)轉(zhuǎn)換序列,該序列可按任意順序在任意通道上完成。例如,可按以下順序?qū)π蛄羞M(jìn)行轉(zhuǎn)換: ADC_IN3、ADC_IN8、ADC_IN2、ADC_IN2、ADC_INO、ADC_IN2、ADC_IN2、ADC_IN15。
??一個(gè)規(guī)則轉(zhuǎn)換組最多由16個(gè)轉(zhuǎn)換構(gòu)成。必須在ADC_SQRx寄存器中選擇轉(zhuǎn)換序列的規(guī)則通道及其順序。規(guī)則轉(zhuǎn)換組中的轉(zhuǎn)換總數(shù)必須寫入ADC_SQR1寄存器中的 L[3:0]位。
??一個(gè)注入轉(zhuǎn)換組最多由4個(gè)轉(zhuǎn)換構(gòu)成。必須在 ADC_JSQR寄存器中選擇轉(zhuǎn)換序列的注入通道及其順序。注入轉(zhuǎn)換組中的轉(zhuǎn)換總數(shù)必須寫入ADC_JSQR寄存器中的L[1:0]位。
??如果在轉(zhuǎn)換期間修改 ADC_SQRx或 ADC_JSQR寄存器,將復(fù)位當(dāng)前轉(zhuǎn)換并向ADC發(fā)送一個(gè)新的啟動(dòng)脈沖,以轉(zhuǎn)換新選擇的組。
(4)轉(zhuǎn)換模式
●單次轉(zhuǎn)換模式:
在單次轉(zhuǎn)換模式下,ADC執(zhí)行一次轉(zhuǎn)換。CONT位為0時(shí),可通過(guò)以下方式啟動(dòng)此模式:
適用規(guī)則通道:將 ADC_CR2寄存器中的 SWSTART位置1。
適用注入通道:將JSWSTART位置1。
適用規(guī)則通道或注入通道:外部觸發(fā),完成所選通道的轉(zhuǎn)換之后。
如果轉(zhuǎn)換了規(guī)則通道:
?? 轉(zhuǎn)換數(shù)據(jù)存儲(chǔ)在16位 ADC_DR寄存器中—EOC(轉(zhuǎn)換結(jié)束)標(biāo)志置1。
?? EOCIE位置1時(shí)將產(chǎn)生中斷。
如果轉(zhuǎn)換了注入通道:
??轉(zhuǎn)換數(shù)據(jù)存儲(chǔ)在16位 ADC_JDR1寄存器中一JEOC(注入轉(zhuǎn)換結(jié)束)標(biāo)志置1。
??JEOCIE位置1時(shí)將產(chǎn)生中斷。
然后,ADC停止。
?
●連續(xù)轉(zhuǎn)換模式:(僅適用于規(guī)則通道)
??在連續(xù)轉(zhuǎn)換模式下, ADC 結(jié)束一個(gè)轉(zhuǎn)換后立即啟動(dòng)一個(gè)新的轉(zhuǎn)換。 CONT 位為 1 時(shí),可通過(guò)外部觸發(fā)或?qū)?ADC_CR2 寄存器中的 SWSTRT 位置 1 來(lái)啟動(dòng)此模式。
每次轉(zhuǎn)換之后:
??上次轉(zhuǎn)換的數(shù)據(jù)存儲(chǔ)在16 位 ADC_DR 寄存器中。
??EOC(轉(zhuǎn)換結(jié)束)標(biāo)志置 1。
??EOCIE 位置1時(shí)將產(chǎn)生中斷。
??注意: 無(wú)法連續(xù)轉(zhuǎn)換注入通道。連續(xù)模式下唯一的例外情況是,注入通道配置為在規(guī)則通道之后自動(dòng)轉(zhuǎn)換(使用 JAUTO 位),請(qǐng)參見自動(dòng)注入一節(jié)。
?
●掃描模式: (此模式用于掃描一組模擬通道)
??通過(guò)將 ADC_CR1寄存器中的 SCAN位置1來(lái)選擇掃描模式。將此位置1后,ADC會(huì)掃描在ADC_SQRx寄存器(對(duì)于規(guī)則通道)或ADC_JSQR寄存器(對(duì)于注入通道)中選擇的所有通道。為組中的每個(gè)通道都執(zhí)行一次轉(zhuǎn)換。每次轉(zhuǎn)換結(jié)束后,會(huì)自動(dòng)轉(zhuǎn)換該組中的下一個(gè)通道。如果將CONT位置1,規(guī)則通道轉(zhuǎn)換不會(huì)在組中最后一個(gè)所選通道處停止,而是再次從第一個(gè)所選通道繼續(xù)轉(zhuǎn)換。
??如果將 DMA位置1,則在每次規(guī)則通道轉(zhuǎn)換之后,均使用直接存儲(chǔ)器訪問(wèn)(DMA)控制器將轉(zhuǎn)換自規(guī)則通道組的數(shù)據(jù)(存儲(chǔ)在ADC_DR寄存器中)傳輸?shù)絊RAM。
在以下情況下,ADC_SR寄存器中的EOC位置1:
??如果EOCS位清零,在每個(gè)規(guī)則組序列轉(zhuǎn)換結(jié)束時(shí)
??如果 EOCS位置1,在每個(gè)規(guī)則通道轉(zhuǎn)換結(jié)束時(shí)
??從注入通道轉(zhuǎn)換的數(shù)據(jù)始終存儲(chǔ)在 ADC_IDRx寄存器中。
(5)注入通道管理
●觸發(fā)注入(類似于中斷,優(yōu)先級(jí):注入組 >規(guī)則組)
??要使用觸發(fā)注入,必須將 ADC_CR1寄存器中的 JAUTO位清零。
??1.通過(guò)外部觸發(fā)或?qū)DC_CR2寄存器中的 SWSTART位置1來(lái)啟動(dòng)規(guī)則通道組轉(zhuǎn)換。
??2.如果在規(guī)則通道組轉(zhuǎn)換期間出現(xiàn)外部注入觸發(fā)或者JSWSTART位置1,則當(dāng)前的轉(zhuǎn)換會(huì)復(fù)位,并且注入通道序列會(huì)切換為單次掃描模式。
??3.然后,規(guī)則通道組的規(guī)則轉(zhuǎn)換會(huì)從上次中斷的規(guī)則轉(zhuǎn)換處恢復(fù)。
??如果在注入轉(zhuǎn)換期間出現(xiàn)規(guī)則事件,注入轉(zhuǎn)換不會(huì)中斷,但在注入序列結(jié)束時(shí)會(huì)執(zhí)行規(guī)則序列。圖37 顯示了相應(yīng)的時(shí)序圖。
??注意:使用觸發(fā)注入時(shí),必須確保觸發(fā)事件之間的間隔長(zhǎng)于注入序列。例如,如果序列長(zhǎng)度為30個(gè)ADC時(shí)鐘周期(即,采樣時(shí)間為3個(gè)時(shí)鐘周期的兩次轉(zhuǎn)換),則觸發(fā)事件的最小間隔不能小于31個(gè)ADC時(shí)鐘周期。
●自動(dòng)注入(相當(dāng)于注入組的連續(xù)轉(zhuǎn)換,但必須跟在規(guī)則組的連續(xù)轉(zhuǎn)換之后轉(zhuǎn)換)
??如果將JAUTO位置1,則注入組中的通道會(huì)在規(guī)則組通道之后自動(dòng)轉(zhuǎn)換。
??這可用于轉(zhuǎn)換最多由20個(gè)轉(zhuǎn)換構(gòu)成的序列,這些轉(zhuǎn)換在ADC_SQRx和 ADC_JSQR寄存器中編程。
??在此模式下,必須禁止注入通道上的外部觸發(fā)。如果CONT位和 JAUTO位均已置1,則在轉(zhuǎn)換規(guī)則通道之后會(huì)繼續(xù)轉(zhuǎn)換注入通道。
;注意:不能同時(shí)使用自動(dòng)注入和不連續(xù)采樣模式。
(6)數(shù)據(jù)對(duì)齊
??ADC_CR2寄存器中的ALIGN位用于選擇轉(zhuǎn)換后存儲(chǔ)的數(shù)據(jù)的對(duì)齊方式??蛇x擇左對(duì)齊或右對(duì)齊兩種方式,如圖38和圖39所示。
??注入通道組的轉(zhuǎn)換數(shù)據(jù)將減去 ADC_JOFRx寄存器中寫入的用戶自定義偏移量,因此結(jié)果可以是一個(gè)負(fù)值。SEXT位表示擴(kuò)展的符號(hào)值。
??對(duì)于規(guī)則組中的通道,不會(huì)減去任何偏移量,因此只有十二個(gè)位有效。
(7)獨(dú)立通道的采樣時(shí)間設(shè)置
??ADC會(huì)在數(shù)個(gè)ADC_CLK周期內(nèi)對(duì)輸入電壓進(jìn)行采樣,可使用ADC_SMPR1 和 ADC_SMPR2寄存器中的SMP[2:0]位修改周期數(shù)。每個(gè)通道均可以使用不同的采樣時(shí)間進(jìn)行采樣。
總轉(zhuǎn)換時(shí)間的計(jì)算公式如下:
Tconv =采樣時(shí)間+12個(gè)周期
示例:若ADC_CLK = 30 MHz 且采樣時(shí)間=3個(gè)周期時(shí):
Tconv= 3 + 12= 15 個(gè)周期 =15/30 us =0.5 us
(8)快速轉(zhuǎn)換模式
??可通過(guò)降低ADC分辨率來(lái)執(zhí)行快速轉(zhuǎn)換。RES位用于選擇數(shù)據(jù)寄存器中可用的位數(shù)。每種分辨率的最小轉(zhuǎn)換時(shí)間如下:
12位:3+12= 15 ADCCLK周期
10位:3+ 10= 13 ADCCLK周期
8位:3+8= 11 ADCCLK周期
6位:3+6= 9 ADCCLK周期
?
五、實(shí)驗(yàn)
1. 實(shí)驗(yàn)內(nèi)容:
通過(guò)ADC采集STM32內(nèi)部溫度傳感器。
2. 實(shí)驗(yàn)分析:
??溫度傳感器可用于測(cè)量器件的環(huán)境溫度。對(duì)于STM32F40x和 STM32F41x器件,溫度傳感器內(nèi)部連接到ADC1_IN16 通道,使用ADC1 將傳感器輸出電壓轉(zhuǎn)換為數(shù)字值。
??不使用時(shí)可將傳感器置于掉電模式。
??注意:必須將TSVREFE位置1才能同時(shí)對(duì)兩個(gè)通道進(jìn)行轉(zhuǎn)換。ADC1_IN16或ADC1_IN18(溫度傳感器)和ADC1_IN17 (VREFINT)。
?
3. 溫度轉(zhuǎn)換公式:
假設(shè)現(xiàn)有采集到的AD值為adVal。按照公式:
0- 3.3V按照12bitADC進(jìn)行采樣==區(qū)間為0-4095 ,相當(dāng)于將3.3V分為4096份,每一個(gè)份的電壓值為3.3V /4096 =0.0008056640625 V。
VSENSE= adVal*3.3V/4096。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-827269.html
Tempture=( adVal * 3.3V / 4096 - 0.76 ) /2.5 +25。
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-827269.html
4. 軟件配置流程:
- 打開ADC1時(shí)鐘。
- 使能溫度傳感器通道。
- 配置ADC分頻。
- 配置好CR1、CR2。
- 構(gòu)造規(guī)則組–轉(zhuǎn)換序列長(zhǎng)度1,序列順序16。
- 設(shè)置ADC_IN16通道采樣時(shí)間。
- 使能ADC。
- 將CR2中的SWSTART位置1–開始轉(zhuǎn)換
- 等待EOC完成標(biāo)志。
- 讀取轉(zhuǎn)換結(jié)果。
- 失能ADC。
?
5. 代碼實(shí)現(xiàn):
void ADC1_IN16_Init (void)
{
RCC->APB2ENR |=(0x1 <<8);//1.打開ADC1時(shí)鐘
ADC->CCR |=(0x1 <<23); //2.使能溫度傳感器通道
ADC->CCR &=~(0x3 <<16); //3.配置ADC分頻
ADC->CCR |= (0x1 <<16); //4分頻84Mhz /4=21Mhz
//4.配置好CR1、CR2
ADC1->CR1 =0;//整體清零
/*
*12bit分辨率
*禁止規(guī)則通道不連續(xù)采樣*禁止掃描模式
*/
ADC1->CR2 =0;//整體清零
ADC1->CR2l=(0xl<<10);//每個(gè)規(guī)則通道轉(zhuǎn)換,將Eoc置一
/*
*禁止規(guī)則通道外部觸發(fā)
*數(shù)據(jù)右對(duì)齊
*單次轉(zhuǎn)換*/
//5.構(gòu)造規(guī)則組-轉(zhuǎn)換序列長(zhǎng)度1,序列順序16
ADC1->SQR1 &=~ (0xF <<20);//規(guī)則序列長(zhǎng)度=1
ADC1->SQR3 &=~ (0x1F <<0);
ADC1->SQR3 |=(16<<0);//第一次轉(zhuǎn)換通道16
ADC1->SMPR1 |=(0x7<<18);//6.設(shè)置ADc IN16通道采樣時(shí)間 480 + 12=23.4us
}
ul6 ADC1_ReadDate (void)
{
ul6 adval;
ADC1->CR2 |=(0x1 <<0);//7.使能ADC
ADC1->CR2 |=(0x1<< 30); //8.將CR2中的SWSTAET位置1--開始轉(zhuǎn)換
while( !(ADC1->SR &(0x1<<1)) );//9.等待EOC置1
ADC1->SR &=~(0x1 <<1);//清除EOC標(biāo)志
ad = ADC1->DR; //10.讀取轉(zhuǎn)換結(jié)果
ADC1->CR2 &= ~(0x1 <<0);//11.失能ADC
return adval;
}
//-------------------------主函數(shù)main.c內(nèi)容
void main(void)
{
u16 r_adval;
float tempture;
ADC1_IN16_Init();
while(1)
{
r_adval =ADC1_ReadDate();
tempture=(r_adval * 3.3 / 4096-0.76) /2.5 +25;
printf("tempture=%f\n",tempture);
delay_ms(500);
}
}
到了這里,關(guān)于超詳細(xì)??!STM32-ADC模數(shù)轉(zhuǎn)換器-驅(qū)動(dòng)內(nèi)部溫度傳感器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!