集成A/D轉(zhuǎn)換器品種繁多,選用時(shí)應(yīng)綜合考慮各種因素選取集成芯片。一般逐次比較型A/D轉(zhuǎn)換器用的比較多,ADC0804就是這類單片集成A/D轉(zhuǎn)換器。ADC0804是一款8位、單通道、低價(jià)格A/D轉(zhuǎn)換器。工作電壓:+5V,屬于連續(xù)漸進(jìn)式(Successive Approximation Method)的A/D轉(zhuǎn)換器。
1、ADC0804的管腳圖及說明
Vin(+)、Vin(-):兩個(gè)模擬信號(hào)輸入端,可以接收單極性、雙極性和差模輸入信號(hào)。
DB0-DB7:具有三態(tài)特性數(shù)字信號(hào)輸出端,輸出結(jié)果為八位二進(jìn)制結(jié)果。
CLKIN:時(shí)鐘信號(hào)輸入端。
CLKR:內(nèi)部時(shí)鐘發(fā)生器的外接電阻端,與CLK端配合可由芯片自身產(chǎn)生時(shí)鐘脈沖,其頻率計(jì)算方式是:fck=1/(1.1RC)。
CS:片選信號(hào)輸入端,低電平有效。
WR:寫信號(hào)輸入端,低電平啟動(dòng)AD轉(zhuǎn)換。
RD:讀信號(hào)輸入端,低電平輸出端有效。
INTR:轉(zhuǎn)換完畢中斷提供端,AD轉(zhuǎn)換結(jié)束后,低電平表示本次轉(zhuǎn)換已完成。
VREF/2:參考電平輸入,決定量化單位。
VCC:芯片電源5V輸入。
AGND:模擬電源地線。
DGND:數(shù)字電源地線。
二、adc0804芯片參數(shù)
工作電壓:+5V,即VCC=+5V。
模擬輸入電壓范圍:0~+5V,即0≤Vin≤+5V。
分辨率:8位,即分辨率為1/2=1/256,轉(zhuǎn)換值介于0~255之間。
轉(zhuǎn)換時(shí)間:100us(fCK=640KHz時(shí))。
轉(zhuǎn)換誤差:±1LSB。
參考電壓:2.5V,即Vref=2.5V。
三、ADC0804的轉(zhuǎn)換原理
ADC0804是屬于連續(xù)漸進(jìn)式(Successive Approximation Method)的A/D轉(zhuǎn)換器,這類型的A/D轉(zhuǎn)換器除了轉(zhuǎn)換速度快(幾十至幾百us)、分辨率高外,還有價(jià)錢便宜的優(yōu)點(diǎn),普遍被應(yīng)用于微電腦的接口設(shè)計(jì)上。
以輸出8位的ADC0804動(dòng)作來說明“連續(xù)漸進(jìn)式A/D轉(zhuǎn)換器”的轉(zhuǎn)換原理,動(dòng)作步驟如下表示(原則上先從左側(cè)最高位尋找起)。
第一次尋找結(jié)果:10000000 (若假設(shè)值≤輸入值,則尋找位=假設(shè)位=1)
第二次尋找結(jié)果:11000000 (若假設(shè)值≤輸入值,則尋找位=假設(shè)位=1)
第三次尋找結(jié)果:11000000 (若假設(shè)值》輸入值,則尋找位=該假設(shè)位=0)
第四次尋找結(jié)果:11010000 (若假設(shè)值≤輸入值,則尋找位=假設(shè)位=1)
第五次尋找結(jié)果:11010000 (若假設(shè)值》輸入值,則尋找位=該假設(shè)位=0)
第六次尋找結(jié)果:11010100 (若假設(shè)值≤輸入值,則尋找位=假設(shè)位=1)
第七次尋找結(jié)果:11010110 (若假設(shè)值≤輸入值,則尋找位=假設(shè)位=1)
第八次尋找結(jié)果:11010110 (若假設(shè)值》輸入值,則尋找位=該假設(shè)位=0)
這樣使用二分法的尋找方式,8位的A/D轉(zhuǎn)換器只要8次尋找,12位的A/D轉(zhuǎn)換器只要12次尋找,就能完成轉(zhuǎn)換的動(dòng)作,其中的輸入值代表圖1的模擬輸入電壓Vin
ADC0804工作過程如下圖所示,ADC0804的工作時(shí)序圖(Timing Diagrams): (欲詳細(xì)了解工作過程,可以結(jié)合ADC0804使用手冊(cè))
四、ADC0804工作過程及原理
圖6給出的其實(shí)就是使ADC0804正確工作的軟件編程模型。由圖可見,實(shí)現(xiàn)一次ADC轉(zhuǎn)換主要包含下面三個(gè)過程:
1.啟動(dòng)轉(zhuǎn)換:由圖6中的上部“FIGURE 10A”可知,在CS信號(hào)為低電平的情況下,將WR引腳先由高電平變成低電平,經(jīng)過至少tW(WR)I 延時(shí)后,再將WR引腳拉成高電平,即啟動(dòng)了一次AD轉(zhuǎn)換。
注:ADC0804使用手冊(cè)中給出了要正常啟動(dòng)AD轉(zhuǎn)換WR的低電平保持時(shí)間tW(WR)I的最小值為100ns,即WR拉低后延時(shí)大于100ns即可以,具體做法可通過插入NOP指令或者調(diào)用delay()延時(shí)函數(shù)實(shí)現(xiàn),不用太精確,只要估計(jì)插入的延時(shí)大于100ns即可。
2.延時(shí)等待轉(zhuǎn)換結(jié)束:依然由圖6中的上部“FIGURE 10A”可知,由拉低WR信號(hào)啟動(dòng)AD采樣后,經(jīng)過1到8個(gè)Tclk+INTERNAL Tc延時(shí)后,AD轉(zhuǎn)換結(jié)束,因此,啟動(dòng)轉(zhuǎn)換后必須加入一個(gè)延時(shí)以等待AD采樣結(jié)束。
注:手冊(cè)中給出了內(nèi)部轉(zhuǎn)換時(shí)間“INTERNAL Tc”的時(shí)間范圍為62~73個(gè)始終周期,因此延時(shí)等待時(shí)間應(yīng)該至少為8+73=81個(gè)時(shí)鐘周期。比如,若R為150K, C為150pF,則時(shí)鐘頻率為Fclk=1/1.1RC=606KHz,因此時(shí)鐘周期約為Tclk=1/Fclk=1.65us。所以該步驟至少應(yīng)延時(shí)81*Tclk=133.65us. 具體做法可通過插入NOP指令或者調(diào)用delay()延時(shí)函數(shù)實(shí)現(xiàn),不用太精確,只要估計(jì)插入的延時(shí)大于133.65us即可。
3.讀取轉(zhuǎn)換結(jié)果:由圖6的下部“FIGURE 10B”可知,采樣轉(zhuǎn)換完畢后,在CS信號(hào)為低的前提下,將RD腳由高電平拉成低電平后,經(jīng)過tACC的延時(shí)即可從DB腳讀出有效的采樣結(jié)果。
注:手冊(cè)中給出了tACC的典型值和最大值分別為135ns和200ns,因此將RD引腳拉低后,等待大于200ns后即可從DB讀出有效的轉(zhuǎn)換結(jié)果。具體做法可通過插入NOP指令或者調(diào)用delay()延時(shí)函數(shù)實(shí)現(xiàn),不用太精確,只要估計(jì)插入的延時(shí)大于200ns即可。
ADC0804手冊(cè)給出的ADC轉(zhuǎn)換時(shí)序圖
圖7:ADC0804手冊(cè)給出的電器特性表
對(duì)采樣值進(jìn)行運(yùn)算變換,換算出實(shí)際的滑動(dòng)變阻器輸入電壓值。 對(duì)于任何一個(gè)A/D采樣器而言,其轉(zhuǎn)換公式如下:
五、ADC0804在單片機(jī)中的簡(jiǎn)單應(yīng)用舉例
如下圖所示,本例ADC0804中的VCC=5V, VREF/2引腳懸空(懸空則相當(dāng)于與VCC共接5V電源),因此ADC轉(zhuǎn)換的參考電壓為VCC的值,即5V。VIN-接地,而VIN+連接滑動(dòng)變阻器RV1的輸出,因此VIN+的電壓輸入范圍為0V~5V,正好處于參考電壓范圍內(nèi)。
引腳CS接地, WR和RD分別連接單片機(jī)的P3^6和P3^7引腳,而DB0~DB7連接單片機(jī)的P1口。
P0口接數(shù)碼管的段選線,P2口低四位接數(shù)碼管的位選線。
程序主要實(shí)現(xiàn)以下功能:
?。?)控制ADC0804芯片對(duì)VIN(+)引腳輸入的電壓值進(jìn)行正確采樣,讀取采樣結(jié)果。
?。?)對(duì)采樣值進(jìn)行模數(shù)變換,將轉(zhuǎn)換后數(shù)字量后顯示在4段數(shù)碼管上。 C程序如下:
#include 《reg51.h》
#include 《intrins.h》
#define uint unsigned int
#define uchar unsigned char sbit wr=P3^6; sbit rd=P3^7;
uchar code dis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽顯示代碼
void delay(uint x) //延時(shí)函數(shù) delay(1)延時(shí)0.992ms,大約為1ms {
uchar i;
while(x--)
for(i=0;i《120;i++);
void display(uchar db) //數(shù)碼管顯示函數(shù),用于顯示模數(shù)轉(zhuǎn)換后得到的數(shù)字量 {
uchar bw,sw,gw; //bw,sw,gw分別等于db百位,十位,個(gè)位上的數(shù) bw=db/100; sw=db%100/10; gw=db%10;
P2=0x01; //點(diǎn)亮第一只數(shù)碼管
P0=dis[bw]&0x7f; //最高位置0,點(diǎn)亮第一只數(shù)碼管的小數(shù)點(diǎn), delay(5);
P2=0x02; //點(diǎn)亮第二只數(shù)碼管 P0=dis[sw]; delay(5);
P2=0x04; //點(diǎn)亮第三只數(shù)碼管 P0=dis[gw]; delay(5);
P2=0x08; //點(diǎn)亮第四只數(shù)碼管
P0=dis[0]; //第四只數(shù)碼管一直顯示0 delay(5); }
void main() {
uchar i; while(1) { wr=0; //在片選信號(hào)CS為低電平情況下(由于CS接地,所以始終為低電平), _nop_(); //WR由低電平到高電平時(shí),即上升沿時(shí),AD開始采樣轉(zhuǎn)換
wr=1;
delay(1); //延時(shí)1ms,等待采樣轉(zhuǎn)換結(jié)束
P1=0xff; //這條語句不能少,我也還不知道為什么
rd=0; //將RD腳置低電平后,再延時(shí)大于135ns左右(這里延時(shí)1us),
_nop_(); //即可從DB腳讀出有效的采樣結(jié)果,傳送到P1口
for(i=0;i《10;i++) //刷新顯示一段時(shí)間
display(P1); //顯示從DB得到的數(shù)字量
}
}
評(píng)論
查看更多