基于AT89C1051/2051的低成本A/D轉(zhuǎn)換方法
在低成本智能儀表的設(shè)計(jì)過(guò)程中優(yōu)先考慮的是成本問(wèn)題,作為核心部件的單片機(jī)通常選用低檔的8位機(jī)或4位機(jī)。就目前的情況而言,自帶A/D轉(zhuǎn)換的低檔單埏機(jī)價(jià)格昂貴,在需要進(jìn)行數(shù)據(jù)采集要時(shí)往往通過(guò)外部A/D轉(zhuǎn)換器件,這在很大程度上增加了系統(tǒng)的成本。例如,目前AT89C2051單片機(jī)的零售價(jià)僅7~8元,而中速A/D轉(zhuǎn)換器件的價(jià)格大都在20元以上。本文介紹的低成本A/D轉(zhuǎn)換方法僅使用兩片通用、廉價(jià)的器件就能達(dá)到中速A/D轉(zhuǎn)換的速度和低于16位的轉(zhuǎn)換分辨率。
1 原理
有一線性良好的鋸齒波信號(hào),最大幅度為Vmax,正程(0~Vmax)的掃描時(shí)間為t2(如圖1中的直線OB),在正程掃描期間的某一時(shí)刻t所對(duì)應(yīng)的電壓Vt為Vmax(t/t2)。圖1中的曲線CD為一待測(cè)模擬信號(hào),兩信號(hào)在A點(diǎn)相交,時(shí)間為t1,不難理解,線性鋸齒波在A點(diǎn)的幅度就是待測(cè)的模擬信號(hào)的大小,其值Vt1可以表示為:Vt1=Vmax(t1/t2)。這就是說(shuō),可以采用一種方法將待測(cè)的模擬信號(hào)與線性鋸齒波進(jìn)行比較,當(dāng)線性鋸齒波在某一時(shí)刻的幅度超過(guò)待測(cè)模擬信號(hào)的幅度時(shí)就會(huì)引起比較器輸出狀態(tài)的改變。因此,測(cè)出比較器輸出狀態(tài)翻轉(zhuǎn)的時(shí)間,就能通過(guò)計(jì)算得到待測(cè)模擬信號(hào)的大小。
2電路及A/D轉(zhuǎn)換的過(guò)程
圖2給出了具有8位分辨率的A/D轉(zhuǎn)換電路。圖中,IC1為AT89C2051 單片機(jī) ,其P1.0和P1.1除了具有通用I/O口線的功能外,還是內(nèi)部模擬比較器的同相輸入端和反相輸入端,比較器輸出的結(jié)果在內(nèi)部連接到P3.6。IC2和IC3為線性鋸齒波產(chǎn)生電路,其正程開(kāi)始掃描的時(shí)刻由單片機(jī)的P3.7控制。IC3為一雙輸入與非門(mén)緩沖驅(qū)動(dòng)器,這里等效為一個(gè)開(kāi)關(guān)。當(dāng)P3.7=0時(shí),開(kāi)關(guān)斷開(kāi),C1通過(guò)R1、W1充電,線性鋸齒波開(kāi)始正程掃描,同時(shí)單片機(jī)內(nèi)部定時(shí)器0開(kāi)始計(jì)數(shù),計(jì)數(shù)脈沖為單片機(jī)內(nèi)部時(shí)鐘。待測(cè)的模擬信號(hào)從P1.1輸入,因?yàn)榫€性鋸齒波電壓是從0開(kāi)始線性遞增的,所以在開(kāi)始正程掃描的時(shí)刻,P3.6為0.當(dāng)鋸齒波的電壓線性遞增到超過(guò)待測(cè)模擬信號(hào)的電壓時(shí), 比較器的輸出翻轉(zhuǎn),P3.6為1,此時(shí)定時(shí)器0的數(shù)值就是A/D轉(zhuǎn)換的結(jié)果,也就是圖1中所示的t1,通過(guò)前面的公式就可以得到待測(cè)模擬電壓的值。其程序框圖如圖3所示。
3 線性鋸齒波電路參數(shù)的確定
AT89C2051 單片機(jī) 的定時(shí)器0是一個(gè)16位計(jì)數(shù)器,因此這種方法所能達(dá)到的最高分辨率為16位,在最高時(shí)鐘頻率下(24MHz)完成一次A/D轉(zhuǎn)換的最長(zhǎng)時(shí)間約為33ms。在實(shí)際應(yīng)用過(guò)程中不一定使用這么高的分辨率,在8位分辨率的情況下完成一次A/D轉(zhuǎn)換的最長(zhǎng)時(shí)間為128μs。下面以8位分辨率為例介紹鋸齒波電路參數(shù)的確定方法。
對(duì)于圖2電路,當(dāng)P3.7輸出為低時(shí),鋸齒波正程掃描開(kāi)始,C1經(jīng)R1、W1充是,其電壓Vc1為:
V c1 =VCC×(1-e-(t/τ))
其中τ=(R 1 +R w1 )C 1
如果運(yùn)放IC2:B將V c1 放大10倍,其輸出為:
Vo1=[1+(R 3 /R 2 )]V c1
=10V cc (1-e-(t/τ))
因?yàn)镮C2:B的輸出并不是線性鋸齒波,所以增加一級(jí)IC2:A用作非線性補(bǔ)償,其輸出電壓V o2 可表示為:
V o2 =V i2 =(V o1 +V c3 )/2
=[10V cc (1-e-(t/τ))+V o2 (1-e-(t/η)12)]/2
式中:Vcc=5V;η=(R5+Rw2)C3
上式經(jīng)過(guò)整理可得:
V o2 =50(1-e-(t/τ))/(1+e-(t/η))
上式就是線性鋸齒波的理論表達(dá)式,通過(guò)合理選擇τ、η的值,就可以得到線性良好的鋸齒波。
在實(shí)際設(shè)計(jì)中,我們通過(guò)一段C語(yǔ)言程序可根據(jù)上式先從理論上求得最佳的τ、η的值,再根據(jù)實(shí)驗(yàn)結(jié)果進(jìn)行調(diào)整。其程序如下:
#i nclude
#i nclude
int main(void)
{
int τ=640, η=610; /*預(yù)置τ、η的值*/
double result,result-bak=0;
double t,x,y;
system(“cls”); /*清屏幕*/
for(t=0;t<=127;t+=0.5)/*8位分辨率時(shí),鋸齒波的正程為128微秒*/
{
x=-t/τ;
y=-t/η;
result=50*(-exp(x))/(1+exp(y));
printf(“%4FMV”,(result-result-bak) 1000);/*每0.5微秒遞增的電壓(mv)*/
result-bak=result;
}
}
在τ=640μs、η=610μs時(shí),通過(guò)上述編程處理,可使鋸齒波非常接近線性,每μs的線性誤差均在0.1mV以?xún)?nèi),完全可達(dá)到8位分辨率A/D轉(zhuǎn)換的要求。
4 誤差分析及補(bǔ)償
采用該方法進(jìn)行A/D轉(zhuǎn)換的誤差來(lái)源主要有兩個(gè),第一是鋸齒波的非線性此起的誤差,根據(jù)上面的敘述,鋸齒波的非線性基本上對(duì)A/D轉(zhuǎn)換的結(jié)果不產(chǎn)生影響;第二是 單片機(jī) 在控制A/D轉(zhuǎn)換的過(guò)程中引出的,這包括三個(gè)方面:其一是在“打開(kāi)轉(zhuǎn)換開(kāi)關(guān)”和“定時(shí)器開(kāi)始計(jì)數(shù)”這兩個(gè)動(dòng)作中單片機(jī)不可能同時(shí)完成;其二是單片機(jī)判斷片內(nèi)模擬比較器翻轉(zhuǎn)的過(guò)程需要兩個(gè)機(jī)器周期,而計(jì)數(shù)器最小的計(jì)數(shù)單位為1個(gè)機(jī)器周期;第三個(gè)原因是單片機(jī)確認(rèn)模擬比較器輸出狀態(tài)翻轉(zhuǎn)和關(guān)閉定時(shí)器不可能同時(shí)完成。對(duì)于第一和第三種情況引起的誤差,由于它的確是指令執(zhí)行所引起的,其誤差的數(shù)值取決于指令執(zhí)行的時(shí)間,因而在轉(zhuǎn)換結(jié)束時(shí)將定時(shí)器0的值減去這個(gè)時(shí)間就可以了;而第二種情況引起的誤差是無(wú)法進(jìn)行補(bǔ)償?shù)摹?/p>
5 結(jié)束語(yǔ)
采用本文所述的方法所設(shè)計(jì)的數(shù)據(jù)采集系統(tǒng)成本低廉,接口簡(jiǎn)單,具有較高的性能價(jià)格比。需要指出的是,為保證系統(tǒng)的長(zhǎng)期穩(wěn)定性,應(yīng)采用高穩(wěn)定的積分電容(C1、C3)。