12.1 AD 簡(jiǎn)單描述
在介紹ADC之前我們先說(shuō)一下ADC大致應(yīng)用到哪些領(lǐng)域。比如無(wú)線通信、軟件無(wú)線電、數(shù)據(jù)采集、光通訊、儀器設(shè)備等領(lǐng)域用到的非常多,舉個(gè)非常簡(jiǎn)單的例子,比如你要獲取電池電壓的用電情況這時(shí)候就需要用到ADC這個(gè)東西。當(dāng)然了ADC又可以分很多種,這里就不在說(shuō)了,這里可以去網(wǎng)上查查。看看多了解了解。
其實(shí)在自然界存在的大都是模擬量,像溫濕度、時(shí)間、速度、壓力、流量等都是模擬量,但是吧,兄弟們,我們?cè)谑褂眠@些東西的時(shí)候需要把這玩意用計(jì)算機(jī)轉(zhuǎn)換成數(shù)字量,這樣才能更有效的進(jìn)行一些控制。
因此這就需要他們之間有一個(gè)橋梁,這個(gè)橋梁就是ADC和DAC這兩個(gè)。本章只介紹ADC,DAC將會(huì)在下一章介紹。
典型的數(shù)字控制系統(tǒng)流圖如下圖所示:
根據(jù)圖中的信息可知道,非電模擬量需要使用特定的傳感器將模擬信號(hào)轉(zhuǎn)換成電信號(hào),然后使用ADC將電信號(hào)轉(zhuǎn)換成數(shù)字信號(hào),經(jīng)嵌入式系統(tǒng)處理后,再通過(guò)DAC將數(shù)字信號(hào)轉(zhuǎn)換成模擬信號(hào)去控制執(zhí)行機(jī)構(gòu)。
12.1.1 ADC的簡(jiǎn)要
我們首先說(shuō)一下ADC的轉(zhuǎn)換過(guò)程,然后說(shuō)一下原理,當(dāng)然如果嫌啰嗦可以直接跳過(guò)。
ADC是英文Analog-to-Digital Converter縮寫(xiě),翻譯過(guò)來(lái)就是模數(shù)轉(zhuǎn)換器,是指將連續(xù)變化的模擬信號(hào)轉(zhuǎn)換為離散的數(shù)字信號(hào)的器件。A/D轉(zhuǎn)換的作用是將時(shí)間連續(xù)、幅值也連續(xù)的模擬信號(hào)轉(zhuǎn)換為時(shí)間離散、值也離散的數(shù)字信號(hào),因此,A/D轉(zhuǎn)換一般要經(jīng)過(guò)采樣、保持、量化及編碼4個(gè)過(guò)程,如下圖所示。在實(shí)際電路中,這些過(guò)程有的是合并進(jìn)行的。例如,采樣和保持、量化和編碼往往都是在轉(zhuǎn)換過(guò)程中同時(shí)實(shí)現(xiàn)的。
1、ADC:模/數(shù)轉(zhuǎn)換器或者模擬/數(shù)字轉(zhuǎn)換器。是指將連續(xù)變量的模擬信號(hào)轉(zhuǎn)換為離散的數(shù)字信號(hào)的器件。
典型的模擬數(shù)字轉(zhuǎn)換器將模擬信號(hào)轉(zhuǎn)換為表示一定比例電壓值的數(shù)字信號(hào)。
2 、在進(jìn)行模/數(shù)轉(zhuǎn)換時(shí),要按一定的時(shí)間間隔,對(duì)模擬信號(hào)進(jìn)行采樣,然后再把采樣得到的值轉(zhuǎn)換為數(shù)字量。因此,模/數(shù)轉(zhuǎn)換的基本過(guò)程由①采樣、②保持、③量化和④編碼組成。
通常,采樣和保持兩個(gè)過(guò)程由采樣–保持電路完成,量化和編碼又常在轉(zhuǎn)換過(guò)程中同時(shí)實(shí)現(xiàn)。
12.1.2 ADC原理
ADC有很多的類(lèi)型大致可以分為
逐次比較逼近型、并行比較型、積分型、Σ-Δ調(diào)制型、及壓頻變換型。
這些個(gè)類(lèi)型。具體是什么請(qǐng)自行百度。
當(dāng)然這些類(lèi)型収各自的優(yōu)點(diǎn)和缺點(diǎn)。看下圖:
1- 采樣與保持
1)、開(kāi)關(guān)S受采樣信號(hào)vS的控制:
先來(lái)看兩幅圖:
從上圖可以知道一下幾點(diǎn):
(1)當(dāng)vs為高電平時(shí),S閉合,采樣階段,vo=vI;
(2)當(dāng)vs為低電平時(shí),S斷開(kāi),保持階段,此時(shí)由于電容無(wú)放電回路,所以vO保持在上一次采樣結(jié)束時(shí)輸入電壓的瞬時(shí)值上。
將A/D轉(zhuǎn)換輸出的數(shù)字信號(hào),再進(jìn)行D/A轉(zhuǎn)換,得到的模擬信號(hào)與原輸入信號(hào)的接近程度,與采樣頻率密切相關(guān)。
2)采樣定理
啥事采樣?
定義事這樣的:
采樣是在間隔為T(mén)的T、2T、3T、…時(shí)刻抽取被測(cè)模擬信號(hào)幅值,相鄰兩個(gè)采樣時(shí)刻之間的間隔T也被稱(chēng)為采樣周期。
只有當(dāng)采樣頻率fs大于或等于模擬信號(hào)v最高頻率分量fmax的2倍時(shí)(fs≥2fmax),所采集的信號(hào)樣值才能不失真地反映原來(lái)模擬信號(hào)的變化規(guī)律。
例如:若被采樣信號(hào)的最高頻率分量的頻率為100Hz,則采樣頻率應(yīng)該不低于200Hz。
3)、保持電路
2-量化與編碼
1、什么是量化?
我們?cè)趯?duì)對(duì)模擬信號(hào)進(jìn)行采樣后,會(huì)得到一個(gè)時(shí)間上離散的脈沖信號(hào)序列,但每個(gè)脈沖的幅度仍然是連續(xù)的。然而,CPU所能處理的數(shù)字信號(hào)不僅在時(shí)間上是離散的,而且數(shù)值大小的變化也是不連續(xù)的,因此,必須把采樣后每個(gè)脈沖的幅度進(jìn)行離散化處理,得到被CPU處理的離散數(shù)值,這個(gè)過(guò)程就稱(chēng)為量化。
說(shuō)白了就是A/D轉(zhuǎn)換過(guò)程中,必須將采樣-保持電路的輸出電壓,按某種近似方式規(guī)劃到與之相應(yīng)的離散電平上。
2、啥是編碼?
把量化的結(jié)果二進(jìn)制表示出來(lái)稱(chēng)為編碼。而且,一個(gè)n位量化的結(jié)果值恰好用一個(gè)n位二進(jìn)制數(shù)表示。這個(gè)n位二進(jìn)制數(shù)就是ADC轉(zhuǎn)換完成后的輸出結(jié)果。
說(shuō)白了就是量化過(guò)程,只是把模擬信號(hào)按量化單位作了取整處理,只有用代碼表示量化后的值,才能得到數(shù)字量。當(dāng)然常用的編碼是二進(jìn)制編碼。
當(dāng)然了編碼有兩種方式:看下圖:
1.取整時(shí)只舍不入,就是說(shuō)當(dāng)電壓在0-1v的時(shí)候電壓都是0,1-2v的時(shí)候電壓都是1,按照這樣以此類(lèi)推。采用這種方法,輸入電壓總是比輸出電壓高的,所以產(chǎn)生的量化誤差是不可能為負(fù)的。
2.取整時(shí)有舍有入(也就是四舍五入):也就是0-0.5V取0,0.5-1.5V取1,以此類(lèi)推后面的都是這樣的。從這就看到這里的量化誤差是有正有負(fù)的。
其實(shí)量化說(shuō)白了及時(shí)把模擬信號(hào)進(jìn)行一個(gè)取整處理的一個(gè)過(guò)程。
3-轉(zhuǎn)換速度
指從接到轉(zhuǎn)換控制信號(hào)開(kāi)始,到輸出端得到穩(wěn)定的數(shù)字輸出信號(hào)所需要的時(shí)間。通常用完成一次A/D轉(zhuǎn)換操作所需時(shí)間來(lái)表示轉(zhuǎn)換速度。
例如,某ADC的轉(zhuǎn)換時(shí)間T為10ms,則該A/D轉(zhuǎn)換器的轉(zhuǎn)換速度為1/T=100次/s。
4-分辨率
分辨率也可以叫做分解度。用來(lái)描述刻度劃分。常以輸出二進(jìn)制代碼的位數(shù)來(lái)表示分辨率的高低。位數(shù)越多,說(shuō)明量化誤差越小,則轉(zhuǎn)換的精度越高。攝像頭數(shù)字化處理用到的地方多。
5-量化誤差
量化誤差是指量化產(chǎn)生的誤差,就是上面說(shuō)的那兩種情況。
6-精度
精度指產(chǎn)生一個(gè)給定的數(shù)字量輸出,所需模擬電壓的理想值與實(shí)際值之間總的誤差,其中包括量化誤差、零點(diǎn)誤差及非線性等產(chǎn)生的誤差。用來(lái)描述物理量的準(zhǔn)確程度。
特別注意一下:精度和分辨率是不一樣的。
7-輸入模擬電壓范圍
輸入模擬電壓范圍指ADC允許輸入的電壓范圍。超過(guò)這個(gè)范圍,A/D轉(zhuǎn)換器將不能正常工作。例如 :STM32F429輸入電壓范圍是:?jiǎn)螛O性0~V_ref。
8-轉(zhuǎn)換時(shí)間
轉(zhuǎn)換時(shí)間(conversion time)是ADC完成一次A/D轉(zhuǎn)換所需要的時(shí)間,是指從啟動(dòng)ADC開(kāi)始到獲得相應(yīng)數(shù)據(jù)所需要的總時(shí)間。
12.2 STM32F429 ADC的結(jié)構(gòu)
經(jīng)過(guò)上面的內(nèi)容我們已經(jīng)對(duì)ADC的基本有一個(gè)大致的了解。
下面就說(shuō)說(shuō)STM32中的ADC。
12.2.1 STM32簡(jiǎn)介
ADC主要結(jié)構(gòu)內(nèi)容:
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ì)齊
采樣間隔可以按通道分別編程
規(guī)則轉(zhuǎn)換和注入轉(zhuǎn)換均有外部觸發(fā)選項(xiàng)
間斷模式
雙重模式(帶2個(gè)或以上ADC的器件)
ADC轉(zhuǎn)換時(shí)間:時(shí)鐘為56MHz時(shí),ADC最短轉(zhuǎn)換時(shí)間為1μs
ADC供電要求:2.4V到3.6V
ADC輸入范圍:VREF- ≤ VIN ≤ VREF+
規(guī)則通道轉(zhuǎn)換期間有DMA請(qǐng)求產(chǎn)生。
STM32F429IGT6帶3個(gè)ADC控制器:其核心為模擬至數(shù)字轉(zhuǎn)換器,它由軟件或硬件觸發(fā),在ADC時(shí)鐘ADCLK的驅(qū)動(dòng)下對(duì)規(guī)則通道或注入通道中的模擬信號(hào)進(jìn)行采樣、量化和編碼。
1、12 位 ADC 是逐次趨近型模數(shù)轉(zhuǎn)換器,可配置為10 位、8 位或 6 位分辨率。
2、多達(dá) 19 個(gè)復(fù)用通道,可測(cè)量來(lái)自 16 個(gè)外部源、兩個(gè)內(nèi)部源和VBAT通道的信號(hào)。
3、A/D 轉(zhuǎn)換可在單次、連續(xù)、掃描或不連續(xù)
采樣模式下進(jìn)行。
4、ADC 的結(jié)果存儲(chǔ)在一個(gè)左對(duì)齊或右對(duì)齊的 16 位數(shù)據(jù)寄存器中。
5、ADC具有模擬看門(mén)狗特性,允許應(yīng)用檢測(cè)輸入電壓是否超過(guò)了用戶自定義的閾值上限或下限。
6、多種ADC轉(zhuǎn)換觸發(fā)方式:軟件方式、定時(shí)器、EXTI 中斷線。
7、可觸發(fā)DMA功能(可看DMA章節(jié))。
ADC內(nèi)部結(jié)構(gòu)圖:
ADC電路走向:
12.2.2 ADC結(jié)構(gòu)與功能
1.電源引腳
ADC電源引腳功能如圖所示:
2.輸入引腳
3.時(shí)序圖
從上面看到:ADC在開(kāi)始精確轉(zhuǎn)換前需要一個(gè)穩(wěn)定時(shí)間tSTAB。在開(kāi)始ADC轉(zhuǎn)換和14個(gè)時(shí)鐘周期后, EOC標(biāo)志被設(shè)置, 16位ADC數(shù)據(jù)寄存器包含轉(zhuǎn)換的結(jié)果。
4.?dāng)?shù)據(jù)對(duì)齊
ADC_CR2寄存器中的ALIGN位選擇轉(zhuǎn)換后數(shù)據(jù)儲(chǔ)存的對(duì)齊方式。數(shù)據(jù)可以左對(duì)齊或右對(duì)齊。注入組通道轉(zhuǎn)換的數(shù)據(jù)值已經(jīng)減去了在ADC_JOFRx寄存器中定義的偏移量,因此結(jié)果可以是一個(gè)負(fù)值。SEXT位是擴(kuò)展的符號(hào)值。對(duì)于規(guī)則組通道,不需減去偏移值,因此只有12個(gè)位有效。
5.校準(zhǔn)
ADC有一個(gè)內(nèi)置自校準(zhǔn)模式。校準(zhǔn)可大幅減小因內(nèi)部電容器組的變化而造成的準(zhǔn)精度誤差。在校準(zhǔn)期間,在每個(gè)電容器上都會(huì)計(jì)算出一個(gè)誤差修正碼(數(shù)字值),這個(gè)碼用于消除在隨后的轉(zhuǎn)換中每個(gè)電容器上產(chǎn)生的誤差。
通過(guò)設(shè)置ADC_CR2寄存器的CAL位啟動(dòng)校準(zhǔn)。一旦校準(zhǔn)結(jié)束, CAL位被硬件復(fù)位,可以開(kāi)始正常轉(zhuǎn)換。建議在上電時(shí)執(zhí)行一次ADC校準(zhǔn)。校準(zhǔn)階段結(jié)束后,校準(zhǔn)碼儲(chǔ)存在ADC_DR中。
6.ADC轉(zhuǎn)換時(shí)鐘源
STM32F4系列微控制器的ADC是逐次比較逼近型,因此必須使用驅(qū)動(dòng)時(shí)鐘。所有ADC共用時(shí)鐘ADCCLK,它來(lái)自經(jīng)可編程預(yù)分頻器分頻的APB2時(shí)鐘,該預(yù)分頻器允許ADC在fPCLK2/2、fPCLK2/4、fPCLK2/6或fPCLK2/8等頻率下工作。
ADCCLK最大頻率為36MHz。
7.ADC轉(zhuǎn)換通道
1-規(guī)則通道組:相當(dāng)正常運(yùn)行的程序。最多16個(gè)通道。規(guī)則通道和它的轉(zhuǎn)換順序在ADC_SQRx寄存器中選擇,規(guī)則 組轉(zhuǎn)換的總數(shù) 寫(xiě)入ADC_SQR1寄存器的L[3:0]中規(guī)則通道組共用一個(gè)轉(zhuǎn)換數(shù)據(jù)寄存器!
2-注入通道組:相當(dāng)于“中斷”。最多4個(gè)通道。注入組和它的轉(zhuǎn)換順序在ADC_JSQR寄存器中選擇。注入組里轉(zhuǎn)換的總數(shù)應(yīng)寫(xiě)入ADC_JSQR寄存器的JL[1:0]中每個(gè)注入通道都有一個(gè)獨(dú)立的轉(zhuǎn)換數(shù)據(jù)寄存器。
STM32F4的ADC的各通道可以①單次,②連續(xù),③掃描或者④間斷模式執(zhí)行。
8.ADC轉(zhuǎn)換觸發(fā)源
總的來(lái)說(shuō)有以下兩種方式:
1)、軟件觸發(fā):ADC 使能 可以由 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)換的控制方式。
另:(1)位SWSTART:?jiǎn)?dòng)規(guī)則組。(2)位JSWSTART:?jiǎn)?dòng)注入組
2)、外部事件觸發(fā)轉(zhuǎn)換:觸發(fā)源有很多,具體選擇哪一種觸發(fā)源,由 ADC 控制寄存器2:ADC_CR2 的 EXTSEL[2:0]和JEXTSEL[2:0]位來(lái)控制。
(1)EXTSEL[2:0]用于選擇規(guī)則通道的觸發(fā)源;
(2)JEXTSEL[2:0]用于選擇注入通道的觸發(fā)源。
9.中斷
當(dāng)模擬看門(mén)狗狀態(tài)位和溢出狀態(tài)位分別置 1 時(shí),規(guī)則組和注入組在轉(zhuǎn)換結(jié)束時(shí)可能會(huì)產(chǎn)生中 斷。可以使用單獨(dú)的中斷使能位以實(shí)現(xiàn)靈活性。
10.模擬看門(mén)狗
使用看門(mén)狗功能,可以限制ADC轉(zhuǎn)換模擬電壓的范圍(低于閾值下限或高于閾值上限,定義在ADC_HTR和ADC_LTR這兩個(gè)寄存器中),當(dāng)轉(zhuǎn)換的結(jié)果超過(guò)這一范圍時(shí),會(huì)將ADC_SR中的模擬看門(mén)狗狀態(tài)位置1,如果使能了相應(yīng)中斷,會(huì)觸發(fā)中斷服務(wù)程序,以及時(shí)進(jìn)行對(duì)應(yīng)的處理。
11.時(shí)鐘配置
12.DMA控制
由于規(guī)則組通道只有一個(gè)ADC_DR,因此,對(duì)于多個(gè)規(guī)則組通道的轉(zhuǎn)換,使用 DMA非常有幫助。
比如:
ADC1規(guī)則組轉(zhuǎn)換4個(gè)輸入通道信號(hào)時(shí),需要用到DMA2的數(shù)據(jù)流0的通道0,在掃描模式下,在每個(gè)輸入通道被轉(zhuǎn)化結(jié)束后,都會(huì)觸發(fā)DMA控制器將轉(zhuǎn)換結(jié)果從規(guī)則組ADC_DR中的數(shù)據(jù)傳輸?shù)蕉x的存儲(chǔ)器中。
12.3 ADC典型應(yīng)用步驟及常用庫(kù)函數(shù)
12.3.1 ADC典型應(yīng)用步驟
//ADC1為例子
1-開(kāi)啟PA口時(shí)鐘和ADC1時(shí)鐘,設(shè)置PA1為模擬輸入。
RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
GPIO_Init();
2-初始化模擬信號(hào)輸入的GPIO引腳為模擬方式:
GPIO_Init();
3-復(fù)位ADC1。
ADC_DeInit(ADC1);
4-初始化ADC_CCR寄存器。ADC通用控制寄存器。
ADC_CommonInit();
5-初始化ADC1參數(shù),設(shè)置ADC1的工作模式以及規(guī)則序列的相關(guān)信息。
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
6-配置規(guī)則通道參數(shù):
ADC_RegularChannelConfig();
7-如果要用中斷,使能ADC中斷,配置ADC的NVIC 。
使能ADC1的轉(zhuǎn)換結(jié)束中斷:
ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);
配置ADC的NVIC:
NVIC_Init();
8-使能ADC
ADC_Cmd(ADC1, ENABLE);
9-開(kāi)啟軟件轉(zhuǎn)換:ADC_SoftwareStartConvCmd(ADC1);
10-等待轉(zhuǎn)換完成,讀取ADC值
ADC_GetConversionValue(ADC1);
11-中斷服務(wù)程序
void ADC_IRQHandler(void);
12.3.2 常用庫(kù)函數(shù)
1、ADC通用初始化函數(shù)
void ADC_CommonInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct);
//這些參數(shù)用來(lái)配置ADC_CCR寄存器的相關(guān)參數(shù)
typedef struct
{
uint32_t ADC_Mode; //多重ADC模式選擇
uint32_t ADC_Prescaler; //ADC預(yù)分頻
uint32_t ADC_DMAAccessMode; //DMA訪問(wèn)模式
uint32_t ADC_TwoSamplingDelay; //2個(gè)采樣階段之間的延遲
}ADC_CommonInitTypeDef;
2、ADC初始化函數(shù)ADC_Init
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
ADCx,可以是ADC1、ADC2等
typedef struct
{
uint32_t ADC_Resolution; //ADC分辨率
FunctionalState ADC_ScanConvMode; //是否使用掃描模式。ADC_CR1位8:SCAN位
FunctionalState ADC_ContinuousConvMode; //單次轉(zhuǎn)換OR連續(xù)轉(zhuǎn)換:ADC_CR2的位1:CONT
uint32_t ADC_ExternalTrigConvEdge; //外部觸發(fā)使能方式:ADC_CR2的位29:28,EXTEN
uint32_t ADC_ExternalTrigConv; //觸發(fā)方式:ADC_CR2的位[19:17] :EXTSEL[2:0]
uint32_t ADC_DataAlign; //對(duì)齊方式:左對(duì)齊還是右對(duì)齊:ADC_CR2的位11:ALIGN
uint8_t ADC_NbrOfChannel; //規(guī)則通道序列長(zhǎng)度:ADC_SQR1的位[23:20]:L[3:0]
}ADC_InitTypeDef;
例如:
3、ADC使能函數(shù)
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
4、 ADC使能軟件轉(zhuǎn)換函數(shù)
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)
///////////////////////////////
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能ADC1的軟件轉(zhuǎn)換啟動(dòng)
5、ADC 規(guī)則通道配置函數(shù)
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx,uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
///////////////////////////////
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_480Cycles);//把規(guī)則通道中的通道5,設(shè)置為第一個(gè)轉(zhuǎn)換
6、ADC 獲取轉(zhuǎn)換結(jié)果函數(shù)ADC_GetConversionValue
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
ADC_GetConversionValue(ADC1);//獲取ADC1轉(zhuǎn)換結(jié)果
12.4 應(yīng)用實(shí)例
請(qǐng)參考野火,正點(diǎn)原子的以及ST官方或者其他優(yōu)秀的代碼例程。
評(píng)論
查看更多