DAC方面的知識(shí),好吧,這次再來總結(jié)一下ADC方面的東東。ADC即Analog-to-Digital Converter的縮寫,指模/數(shù)轉(zhuǎn)換器或者模擬/數(shù)字轉(zhuǎn)換器?,F(xiàn)實(shí)世界是由模擬信號(hào)組成的,關(guān)于為什么要用模數(shù)轉(zhuǎn)換器,這大概與現(xiàn)在數(shù)字存儲(chǔ)技術(shù)有關(guān)吧,例如溫度、壓力、聲音或者圖像等只有轉(zhuǎn)換成數(shù)字量才能方便的存儲(chǔ)在硬盤、U盤等數(shù)碼存儲(chǔ)介質(zhì)中,或許某天我們的技術(shù)發(fā)展了,數(shù)字存儲(chǔ)可以用某些模擬量存儲(chǔ),也許我們就用不著這么麻煩的轉(zhuǎn)來換去了。好了,閑話不多扯,來簡單總結(jié)一下ADC的原理。模擬信號(hào)轉(zhuǎn)換為數(shù)字信號(hào)保持電路中完成,后兩步驟則在ADC中完成。關(guān)于它的原理,主要有以下幾種模型:1、積分型ADC(如TLC7135)
本文引用地址:http://www.ex-cimer.com/article/201611/319431.htm積分型ADC工作原理是將輸入電壓轉(zhuǎn)換成時(shí)間(脈沖寬度信號(hào))或頻率(脈沖頻率),然后由定時(shí)器/計(jì)數(shù)器獲得數(shù)字值。其優(yōu)點(diǎn)是用簡單電路就能獲得高分辨率,但缺點(diǎn)是由于轉(zhuǎn)換精度依賴于積分時(shí)間,因此轉(zhuǎn)換速率極低。初期的單片AD轉(zhuǎn)換器大多采用積分型,現(xiàn)在逐次比較型已逐步成為主流。
2、逐次比較型ADC(如TLC0831)
逐次比較型AD由一個(gè)比較器和DA轉(zhuǎn)換器通過逐次比較邏輯構(gòu)成,從MSB開始,順序地對(duì)每一位將輸入電壓與內(nèi)置DA轉(zhuǎn)換器輸出進(jìn)行比較,經(jīng)n次比較而輸出數(shù)字值。其電路規(guī)模屬于中等。其優(yōu)點(diǎn)是速度較高、功耗低,在分辨率較低(<12位)時(shí)價(jià)格便宜,但高精度(>12位)時(shí)價(jià)格很高。
3、并行比較型/串并行比較型ADC(如TLC5510)
并行比較型AD采用多個(gè)比較器,僅作一次比較而實(shí)行轉(zhuǎn)換,又稱Flash(快速)型。由于轉(zhuǎn)換速率極高,n位的轉(zhuǎn)換需要2n-1個(gè)比較器,因此電路規(guī)模也極大,價(jià)格也高,只適用于視頻AD轉(zhuǎn)換器等速度特別高的領(lǐng)域。
串并行比較型AD結(jié)構(gòu)上介于并行型和逐次比較型之間,最典型的是由2個(gè)n/2位的并行型AD轉(zhuǎn)換器配合DA轉(zhuǎn)換器組成,用兩次比較實(shí)行轉(zhuǎn)換,所以稱為Half flash(半快速)型。還有分成三步或更多步實(shí)現(xiàn)AD轉(zhuǎn)換的叫做分級(jí)(Multistep/Subrangling)型AD,而從轉(zhuǎn)換時(shí)序角度又可稱為流水線(Pipelined)型AD,現(xiàn)代的分級(jí)型AD中還加入了對(duì)多次轉(zhuǎn)換結(jié)果作數(shù)字運(yùn)算而修正特性等功能。這類AD速度比逐次比較型高,電路規(guī)模比并行型小。
4、Σ-Δ(Sigma?/FONT>delta)調(diào)制型ADC(如AD7705)
Σ-Δ型AD由積分器、比較器、1位DA轉(zhuǎn)換器和數(shù)字濾波器等組成。原理上近似于積分型,將輸入電壓轉(zhuǎn)換成時(shí)間(脈沖寬度)信號(hào),用數(shù)字濾波器處理后得到數(shù)字值。電路的數(shù)字部分基本上容易單片化,因此容易做到高分辨率。主要用于音頻和測(cè)量。
5、電容陣列逐次比較型ADC
電容陣列逐次比較型AD在內(nèi)置DA轉(zhuǎn)換器中采用電容矩陣方式,也可稱為電荷再分配型。一般的電阻陣列DA轉(zhuǎn)換器中多數(shù)電阻的值必須一致,在單芯片上生成高精度的電阻并不容易。如果用電容陣列取代電阻陣列,可以用低廉成本制成高精度單片AD轉(zhuǎn)換器。最近的逐次比較型AD轉(zhuǎn)換器大多為電容陣列式的。
6、壓頻變換型ADC(如AD650)
壓頻變換型(Voltage-Frequency Converter)是通過間接轉(zhuǎn)換方式實(shí)現(xiàn)模數(shù)轉(zhuǎn)換的。其原理是首先將輸入的模擬信號(hào)轉(zhuǎn)換成頻率,然后用計(jì)數(shù)器將頻率轉(zhuǎn)換成數(shù)字量。從理論上講這種AD的分辨率幾乎可以無限增加,只要采樣的時(shí)間能夠滿足輸出頻率分辨率要求的累積脈沖個(gè)數(shù)的寬度。其優(yōu)點(diǎn)是分辨率高、功耗低、價(jià)格低,但是需要外部計(jì)數(shù)電路共同完成AD轉(zhuǎn)換。
DAC的內(nèi)部電路構(gòu)成無太大差異,一般按輸出是電流還是電壓、能否作乘法運(yùn)算等進(jìn)行分類。大多數(shù)DAC由電阻陣列和多個(gè)電流開關(guān)(或電壓開關(guān))構(gòu)成。按數(shù)字輸入值切換開關(guān),產(chǎn)生比例于輸入的電流(或電壓)。此外,也有為了改善精度而把恒流源放入器件內(nèi)部的。DAC分為電壓型和電流型兩大類,電壓型DAC有權(quán)電阻網(wǎng)絡(luò)、T型電阻網(wǎng)絡(luò)和樹形開關(guān)網(wǎng)絡(luò)等;電流型DAC有權(quán)電流型電阻網(wǎng)絡(luò)和倒T型電阻網(wǎng)絡(luò)等。
1電壓輸出型(如TLC5620)。電壓輸出型DAC雖有直接從電阻陣列輸出電壓的,但一般采用內(nèi)置輸出放大器以低阻抗輸出。直接輸出電壓的器件僅用于高阻抗負(fù)載,由于無輸出放大器部分的延遲,故常作為高速DAC使用。
2電流輸出型(如THS5661A )。電流輸出型DAC很少直接利用電流輸出,大多外接電流-電壓轉(zhuǎn)換電路得到電壓輸出,后者有兩種方法:一是只在輸出引腳上接負(fù)載電阻而進(jìn)行電流-電壓轉(zhuǎn)換,二是外接運(yùn)算放大器。
3乘算型(如AD7533)。DAC中有使用恒定基準(zhǔn)電壓的,也有在基準(zhǔn)電壓輸入上加交流信號(hào)的,后者由于能得到數(shù)字輸入和基準(zhǔn)電壓輸入相乘的結(jié)果而輸出,因而稱為乘算型DAC。乘算型DAC一般不僅可以進(jìn)行乘法運(yùn)算,而且可以作為使輸入信號(hào)數(shù)字化地衰減的衰減器及對(duì)輸入信號(hào)進(jìn)行調(diào)制的調(diào)制器使用。
4一位DAC。一位DAC與前述轉(zhuǎn)換方式全然不同,它將數(shù)字值轉(zhuǎn)換為脈沖寬度調(diào)制或頻率調(diào)制的輸出,然后用數(shù)字濾波器作平均化而得到一般的電壓輸出,用于音頻等場(chǎng)合。
選用ADC時(shí)要注意這幾個(gè)參數(shù):取樣與保持時(shí)間、量化與編碼方式、分辨率、轉(zhuǎn)換誤差、轉(zhuǎn)換時(shí)間、絕對(duì)精準(zhǔn)度、相對(duì)精準(zhǔn)度等。
1、取樣與保持
由于取樣時(shí)間極短,取樣輸出為一串?dāng)嗬m(xù)的窄脈沖。要把每個(gè)取樣的窄脈沖信號(hào)數(shù)字化,是需要一定的時(shí)間。因此在兩次取樣之間,應(yīng)將取樣的模擬信號(hào)暫時(shí)儲(chǔ)存到下個(gè)取樣脈沖到來,這個(gè)動(dòng)作稱之為保持。在模擬電路設(shè)計(jì)上,因此需要增加一個(gè)取樣-保持電路。為了保證有正確轉(zhuǎn)換,模擬電路要保留著還未轉(zhuǎn)換的數(shù)據(jù)。一個(gè)取樣-保持電路可保證模擬電路中取樣時(shí),取樣時(shí)間的穩(wěn)定并儲(chǔ)存,通常使用電容組件來儲(chǔ)存電荷。根據(jù)數(shù)字信號(hào)處理的基本原理,奈奎斯特(Nyquist)取樣定理(懶貓記得這個(gè)定理應(yīng)該是在《信號(hào)與線性系統(tǒng)》這本課上學(xué)的^_^),若要能正確且忠實(shí)地呈現(xiàn)所擷取的模擬信號(hào),必須取樣頻率至少高于最大頻率的2倍。例如,若是輸入一個(gè)100Hz的正弦波的話,最小的取樣頻率至少要2倍,即是200Hz。雖說理論值是如此,但真正在應(yīng)用時(shí),最好是接近10倍才會(huì)有不錯(cuò)的還原效果(因取樣點(diǎn)越多)。若針對(duì)多信道的A/D轉(zhuǎn)換器來說,就必須乘上信道數(shù),這樣平均下去,每一個(gè)通道才不會(huì)有失真的情況產(chǎn)生。
2、量化與編碼
量化與編碼電路是A/D轉(zhuǎn)換器的核心組成的部分,一般對(duì)取樣值的量化方式有下列兩種:
(1)只舍去不進(jìn)位
首先取一最小量化單位Δ=U/2n,U是輸入模擬電壓的最大值,n是輸出數(shù)字?jǐn)?shù)值的位數(shù)。當(dāng)輸入模擬電壓U在0~Δ之間,則歸入0Δ,當(dāng)U在Δ~2Δ之間,則歸入1Δ。透過這樣的量化方法產(chǎn)生的最大量化誤差為Δ/2,而且量化誤差總是為正,+1/2LSB。
(2)有舍去有進(jìn)位
如果量化單位Δ=2U/(2 n+1–1),當(dāng)輸入電壓U在0~Δ/2之間,歸入0Δ,當(dāng)U在Δ/2~3/2Δ之間的話,就要?dú)w入1Δ。這種量化方法產(chǎn)生的最大量化誤差為Δ/2,而且量化誤差有正,有負(fù),為±1/2LSB。量化結(jié)果也造成了所謂的量化誤差。
3、解析度
指A/D轉(zhuǎn)換器所能分辨的最小模擬輸入量。通常用轉(zhuǎn)換成數(shù)字量的位數(shù)來表示,如8-bit,10-bit,12-bit與16-bit等。位數(shù)越高,分辨率越高。若小于最小變化量的輸入模擬電壓的任何變化,將不會(huì)引起輸出數(shù)字值的變化。采用12-bit的AD574,若是滿刻度為10V的話,分辨率即為10V / 212 = 2.44mV。而常用的8-bit的ADC0804,若是滿刻度為5V的話,分辨率即為5V / 28 = 19.53mV。選擇適用的A/D轉(zhuǎn)換器是相當(dāng)重要的,并不是分辨率越高越好。不需要分辨率高的場(chǎng)合,所擷取到的大多是噪聲。分辨率太低,會(huì)有無法取樣到所需的信號(hào)。
4、轉(zhuǎn)換誤差
通常以相對(duì)誤差的形式輸出,其表示A/D轉(zhuǎn)換器實(shí)際輸出數(shù)字值與理想輸出數(shù)字值的差別,并用最低有效位LSB的倍數(shù)表示。
5、轉(zhuǎn)換時(shí)間
轉(zhuǎn)換時(shí)間是A/D轉(zhuǎn)換完成一次所需的時(shí)間。從啟動(dòng)信號(hào)開始到轉(zhuǎn)換結(jié)束并得到穩(wěn)定的數(shù)字輸出值為止的時(shí)間間隔。轉(zhuǎn)換時(shí)間越短則轉(zhuǎn)換速度就越快。
6、精準(zhǔn)度
對(duì)于A/D轉(zhuǎn)換器,精準(zhǔn)度指的是在輸出端產(chǎn)生所設(shè)定的數(shù)字?jǐn)?shù)值,其實(shí)際需要的模擬輸入值與理論上要求的模擬輸入值之差。精確度依計(jì)算方式不同,可以區(qū)分為:絕對(duì)精確度與相對(duì)精確度。所謂的絕對(duì)精確度是指實(shí)際輸出值與理論輸出值的接近程度,其相關(guān)的關(guān)系是如下式子所列:
相對(duì)精準(zhǔn)度指的是滿刻度值校準(zhǔn)以后,任意數(shù)字輸出所對(duì)應(yīng)的實(shí)際模擬輸入值(中間值)與理論值(中間值)之差。對(duì)于線性A/D轉(zhuǎn)換器,相對(duì)精準(zhǔn)度就是它的線性程度。由于電路制作上影響,會(huì)產(chǎn)生像是非線性誤差,或是量化誤差等減低相對(duì)精準(zhǔn)度的因素。相對(duì)精確度是指實(shí)際輸出值與理想理論滿刻輸出值之接近程度,其相關(guān)的關(guān)系是如下式子所列:
基本上,一個(gè)n-bit的轉(zhuǎn)換器就有n個(gè)數(shù)字輸出位。這種所產(chǎn)生的位數(shù)值是等效于在A/D轉(zhuǎn)換器的輸入端的模擬大小特性值。如果外部所要輸入電壓或是電流量較大的話,所轉(zhuǎn)換后的的位數(shù)值也就較大。透過并列端口接口或是微處理機(jī)連接A/D轉(zhuǎn)換器時(shí),必須了解如何去控制或是驅(qū)動(dòng)這顆A/D轉(zhuǎn)換器的問題。因此需要了解到A/D轉(zhuǎn)換器上的控制信號(hào)有哪些。
懶貓為了總結(jié)學(xué)過的東東,翻箱倒塌柜,終于找到了大學(xué)的課本,又在大學(xué)城的圖書包管里面坐了幾個(gè)小時(shí),當(dāng)然了懶貓不也在網(wǎng)上轉(zhuǎn)了N久,所以呢,以上知識(shí)大部分來源網(wǎng)絡(luò),懶貓囫圇吞棗的咽進(jìn)了肚里,但大部分也開始消化了,嘻嘻……好了,這ADC有知識(shí)先暫時(shí)總結(jié)到這,下面說一說這次實(shí)驗(yàn)的思路(是思路不是絲路^_^)及電路圖,并簡單的總結(jié)一下LPC1768內(nèi)部集成的ADC。
LPC1768內(nèi)部集成的是12位主次逼近式的模數(shù)轉(zhuǎn)換器,具有8個(gè)通道,它的基本時(shí)鐘由APB時(shí)鐘提供,它還包含一個(gè)可編程的分頻器,可以將APB時(shí)鐘調(diào)整為主次逼近轉(zhuǎn)換所需的時(shí)鐘(最大可達(dá)13MHz)。與ADC相關(guān)的引腳配置包括功能配置也即配置引腳功能選擇寄存器PINSEL,一般ADC是第二功能,這次實(shí)驗(yàn)的電路連接的是ADC0.2通道所以要把P0.25配置成ADC功能,即PINCON->PINSEL1 |= (1<<18);。還要把電源參考引腳連接上參考電源一般是接3V或與VCC電壓相等。與ADC相關(guān)的寄存器包括:
1、外圍器接口電源管理寄存器PCONP,要把這個(gè)寄存器的第12位即PCADC位置位,這一位是ADC的電源控制與時(shí)鐘控制位。
2、A/D控制寄存器ADCR,主要是控制ADC轉(zhuǎn)換的一些操作如通道選擇,工作模式選擇等等,AD轉(zhuǎn)換開始前,必須設(shè)置ADCR寄存器來選擇工作模式。
3、A/D全局?jǐn)?shù)據(jù)寄存器ADGDR,它包含最近一次A/D轉(zhuǎn)換的結(jié)果。
4、A/D中斷使能寄存器ADINTEN,如果使用轉(zhuǎn)換完中斷時(shí),需要配置此寄存器,它包含的使能位控制每一個(gè)A/D通道的DONE標(biāo)記是否用來產(chǎn)生中斷。
5、A/D通道n數(shù)據(jù)寄存器ADDRn,共有8個(gè),它包含在通道n上完成的最近一次轉(zhuǎn)換結(jié)果。
6、A/D狀態(tài)寄存器AD0STAT,它包含所有A/D通道的DONE標(biāo)志和OVERRUN標(biāo)志,以及A/D中斷標(biāo)志。
關(guān)于這幾個(gè)寄存器的各位代表是什么意思,如何設(shè)置,這里就不總結(jié)了,芯片的數(shù)據(jù)手冊(cè)上寫的很清楚,如果你覺得看英文不舒服可以參考一下周公那公司翻譯的中文版,應(yīng)該對(duì)初學(xué)者有所幫助。下面說一下這次實(shí)驗(yàn)的電路圖:
圖1-1電位器分壓電路圖
實(shí)驗(yàn)電路很簡單,就是一個(gè)電位器來分壓,然后由AD轉(zhuǎn)換器的通道2來采樣電壓,然后再把采集到的電壓通過串口0發(fā)送的到串口以便觀察采樣的電壓值,好了,電路這塊就不多費(fèi)口舌了,留點(diǎn)筆墨說一下程序吧,下面先貼出ADC的源代碼:
一、AdcFunc.c源代碼(主要就是與ADC相關(guān)的一些函數(shù))
#include"adc.h"
void AdcInit(void)
{
SC->PCONP |= (1 << 12);
PINCON->PINSEL1 |= (1<<18);
ADC -> ADCR |= ( 1 << 2 )
|( ( 18000000 / ADC_CLK - 1 ) << 8 )
|( 0 << 16 )
|( 1 << 21 )
|( 1 << 24)
|( 0 << 27) ;
}
unsigned int AdcConver(void)
{
unsigned int i = 0;
unsigned long ulADCbuf = 0;
unsigned intulADCData = 0;
for(i=0;i
{
ADC -> ADCR |= 1 << 24;
while (!(ADC ->ADSTAT & (1 << 2)));
ADC -> ADCR |= (1 <<24);
while ((ADC ->ADSTAT & (1 << 2)) == 0);
ulADCbuf= ADC ->ADDR2;
ulADCbuf= (ulADCbuf >> 4) & 0xfff;
ulADCData += (unsigned int)ulADCbuf;
}
//ADC -> ADCR &= ~(1<<21)&(~(1<<24));
ulADCData = (ulADCData/ADC_CNT);
ulADCData = (ulADCData*3300)/4096;
returnulADCData;
}
這個(gè)源代碼,主要就是ADC初始化與ADC采樣程序,程序中我已將用到的寄存器都注釋了,對(duì)于初學(xué)者來說應(yīng)該不是太難了,下面貼出主程序的部分代碼:
二、mian.c(主要調(diào)度函數(shù)及應(yīng)用函數(shù))
void AdcDisVal(void)
{
unsigned int adcval = 0;
unsigned int hh = 0;
unsigned int hi = 0;
unsigned int ll = 0;
unsigned int lo = 0;
adcval = AdcConver();
if(adcval != AdcValOld)
{
if(((adcval+1)!=AdcValOld)&&((adcval+2)!=AdcValOld)&&((adcval+3)!=AdcValOld))
{
if(((adcval-1)!=AdcValOld)&&((adcval-2)!=AdcValOld)&&((adcval-3)!=AdcValOld))
{
hh = adcval/1000;
hi = adcval00/100;
ll = adcval0/10;
lo = adcval;
AdcVal[38] = (unsigned char)hh + 0x30;
AdcVal[40] = (unsigned char)hi + 0x30;
AdcVal[41] = (unsigned char)ll + 0x30;
AdcVal[42] = (unsigned char)lo + 0x30;
UARTSend(0,AdcVal,50);
AdcValOld =adcval;
}
}
}
}
下面是程序執(zhí)行結(jié)果:
圖1-2程序執(zhí)行結(jié)果
這只是部分代碼,詳細(xì)的源代碼請(qǐng)參考附件。這段代碼是將采集到的數(shù)據(jù)轉(zhuǎn)換成字符發(fā)送到串口顯示,里面沒有什么復(fù)雜的計(jì)算,都是爛大街的程序,因?yàn)閼胸堃膊皇鞘裁锤呤?,也說不出什么高深的理論,只能總結(jié)點(diǎn)簡單的東西,希望這些簡單的實(shí)驗(yàn)?zāi)芷鸬綊伌u引玉的作用,讓初學(xué)者盡快能邁入單片機(jī)這扇門,萬事開頭難,徘徊在門口的感覺最不好愛,懶貓也曾彷徨過,也曾無奈過,也曾痛苦過,也曾抱怨過,但道路雖然崎嶇,只要你堅(jiān)持就能爬到山頂。懶貓深知很多人面對(duì)電子有著莫大的興趣,但卻無從下手,沒有高手指導(dǎo),沒有教材參考,這種感覺實(shí)在不好愛,所以懶貓有空便會(huì)寫下自己的學(xué)習(xí)日志,盡量簡單,盡量詳細(xì),俗話說師傅引進(jìn)門,修行靠個(gè)人,當(dāng)你熬過陣痛,跨進(jìn)電子這扇門之后,剩下的事就是發(fā)揮你的聰明才智,努力的創(chuàng)造奇妙的未來!還是那句老話,學(xué)無難易,貴在堅(jiān)持!
好了,今天先總結(jié)到這吧,最近手頭上的事有點(diǎn)多,所以自學(xué)的時(shí)間有點(diǎn)緊,學(xué)習(xí)的事推了又推,但不管怎樣,懶貓依然是懶貓,懶貓依然會(huì)堅(jiān)持最初的夢(mèng)想,一直努力的走下去……
評(píng)論