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