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