摘要
本作品是基于FPGA的ADC0809采集控制電路。ADC0809是美國國家半導(dǎo)體公司生產(chǎn)的CMOS工藝8通道,8位逐次逼近式A/D模數(shù)轉(zhuǎn)換器。其內(nèi)部有一個8通道多路開關(guān),它可以根據(jù)地址碼鎖存譯碼后的信號,只選通8路模擬輸入信號中的一個進行A/D轉(zhuǎn)換。
Abstract
This work is ADC0809 sampling control circuit based on FPGA. ADC0809 is produced national semiconductor CMOS 8 channel, eight successive approximation A/D analog-to-digital converter. Its internal have A 8 channel multiplex switch, it can according to the address latch signal after decoding, only gate 8 analog input signals of an A/D conversion.
1. 設(shè)計任務(wù)
基于FPGA的ADC0809控制電路設(shè)計,并闡明其控制原理。
2. ADC0809簡介
2.1. ADC0809主要特性
?、?路8位A/D轉(zhuǎn)換器,即分辨率8位。
?、诰哂修D(zhuǎn)換起??刂贫?。
?、坜D(zhuǎn)換時間為100μs
?、菽M輸入電壓范圍0~+5V,不需零點和滿刻度校準(zhǔn)。
?、薰ぷ鳒囟确秶鸀?40~+85攝氏度
⑦低功耗,約15mW
2.2. ADC0809外部特性(引腳功能)
①ADC0809芯片有28條引腳,下面說明各引腳功能。
?、贗N0~IN7:8路模擬量輸入端。
?、跠0~D7:8位數(shù)字量輸出端。
?、蹵DDA、ADDB、ADDC:3位地址輸入線,用于選通8路模擬輸入中的一路
⑤ALE:地址鎖存允許信號,輸入,高電平有效。
⑥START: A/D轉(zhuǎn)換啟動信號,輸入,高電平有效。
?、逧OC: A/D轉(zhuǎn)換結(jié)束信號,輸出,當(dāng)A/D轉(zhuǎn)換結(jié)束時,此端輸出一個高電平(轉(zhuǎn)換期間一直為低電平)。
?、郞E:數(shù)據(jù)輸出允許信號,輸入,高電平有效。當(dāng)A/D轉(zhuǎn)換結(jié)束時,此端輸入一個高電平,才能打開輸出三態(tài)門,輸出數(shù)字量。
?、酑LK:時鐘脈沖輸入端。要求時鐘頻率不高于640KHZ。
?、釸EF(+)、REF(-):基準(zhǔn)電壓。
?、佗賄cc:電源,單一+5V。
?、佗贕ND:地。
2.3. ADC0809工作原理
首先輸入3位地址,并使ALE=1,將地址存入地址鎖存器中。此地址經(jīng)譯碼選通8路模擬輸入之一到比較器。START上升沿將逐次逼近寄存器復(fù)位。下降沿啟動 A/D轉(zhuǎn)換,之后EOC輸出信號變低,指示轉(zhuǎn)換正在進行。直到A/D轉(zhuǎn)換完成,EOC變?yōu)楦唠娖?,指示A/D轉(zhuǎn)換結(jié)束,結(jié)果數(shù)據(jù)已存入鎖存器,這個信號可用作中斷申請。當(dāng)OE輸入高電平 時,輸出三態(tài)門打開,轉(zhuǎn)換結(jié)果的數(shù)字量輸出到數(shù)據(jù)總線上。
3. 理論分析與計算
3.1. 系統(tǒng)設(shè)計原理
圖3-1:系統(tǒng)設(shè)計原理圖
工作原理:FPGA通過控制總線輸入采集端口地址,此地址經(jīng)ADC0809譯碼后選通8路模擬采集輸入口之一。FPGA輸出控制信號使AD的START腳信號出現(xiàn)高電平,上升沿將逐次逼近寄存器復(fù)位,下降沿啟動 A/D轉(zhuǎn)換。啟動轉(zhuǎn)換之后ADC0809的EOC腳輸出信號變低,指示FPGA AD轉(zhuǎn)換工作正在進行。直到A/D轉(zhuǎn)換完成,EOC腳變?yōu)楦唠娖?,指示A/D轉(zhuǎn)換結(jié)束,結(jié)果數(shù)據(jù)已存入鎖存器。當(dāng)FPGA檢測到EOC腳變?yōu)楦唠娖綍r,控制ADC0809的OE腳變?yōu)楦唠娖?,輸出三態(tài)門打開,轉(zhuǎn)換結(jié)果的數(shù)字量輸出到數(shù)據(jù)總線上,再由FPGA存儲起來。
3.2. AD計算分析
?、俎D(zhuǎn)換量程:0~5V
?、诜直媛剩簠⒖茧妷簽?-5V的話,ADC0809為8位AD,則每一位的電壓值為(5-0)/255≈0.0196V
③轉(zhuǎn)換時間: 取決于芯片時鐘頻率,本作品提供給AD的時鐘頻率為500KHZ,按官方資料知道AD轉(zhuǎn)換時間為100μs(時鐘為640KHz時),按此比例算出時鐘為500KHz時的轉(zhuǎn)換時間為130μs;
④采集最高頻率:按130us轉(zhuǎn)換時間來算,依據(jù)實際經(jīng)驗,在一個信號周期內(nèi)采集6~7個點能使信號較好恢復(fù)原狀,則能采集的最高頻率大約為1Khz。
圖4-1:ADC0809硬件電路圖
注意事項:
?、?a target="_blank">電阻R2用于限流,發(fā)光二級管D1用于指示電源是否接通
?、?a href="http://www.brongaenegriffin.com/tags/電容/" target="_blank">電容C1、C2用于濾波
③滑動變阻器R1接AD采集輸入口IN3主要用于測試精確AD是否正常工作
?、?a target="_blank">排針用于連接FPGA和方便調(diào)試
?、軦D信號線與FPGA接口直接相連
?、轆D的工作頻率由FPGA分頻直接提供
5. 軟件設(shè)計
5.1. 程序流程圖
圖5-1:程序流程圖
確認(rèn)AD轉(zhuǎn)換完成有三種辦法,分別是定時傳送辦法、查詢方式、中斷方式。本作品采用查詢方式,即查詢EOC的狀態(tài),即可確認(rèn)轉(zhuǎn)換是否完成,并接著進行數(shù)據(jù)傳送。
附錄:verilog程序
/*FPGA實現(xiàn)的程序:(verilog)
module AD0809(clk, //脈寬(至少100ns)
rst_n,
EOC, //約100us后EOC變?yōu)楦唠娖睫D(zhuǎn)換結(jié)束
START, //啟動信號,上升沿有效(至少100ns)
OE, //高電平打開三態(tài)緩沖器輸出轉(zhuǎn)換數(shù)據(jù)
ALE, //高電平有效,選擇信道口
ADDA, //因為ADDB,ADDC都接地了,這里只有ADDA為變量
DATA, //轉(zhuǎn)換數(shù)據(jù)
Clk500k,
DATA_R);
output START,OE,ALE,ADDA,clk500K;
input EOC,clk500K,rst_n;
input[7:0] DATA;
output[7:0] DATA_R;
reg START,OE,ALE,ADDA,clk500K;
reg[7:0] DATA_R;
reg[4:0] CS,NS;
Reg[5:0] counter;
/**********************產(chǎn)生AD時鐘500Khz***********************************/
always @(posedge clk)
begin
if(counter==6‘b11_0010)
begin
Clk500K《=~clk500k;//1000HZ
counter《=6’b0;
end
else
counter《=counter+1‘b1;
End
/****************************編碼*******************************************/
parameter IDLE=5’b00001,START_H=5‘b00010,START_L=5’b00100,CHECK_END=5‘b01000,GET_DATA=5’b10000;
/**********************利用有限狀態(tài)機設(shè)計AD工作流程************************/
always @(posedge clk500K)
case(CS)
IDLE:
NS=START_H;
START_H:
NS=START_L;
START_L:
NS=CHECK_END;
CHECK_END:
if(EOC)
NS=GET_DATA;
else
NS=CHECK_END;
GET_DATA:
NS=IDLE;
default:
NS=IDLE;
endcase
always @(posedge clk500K)
if(!rst_n)
CS《=IDLE;
else
CS《=NS;
always @(posedge clk500K)
case(NS)
IDLE: //停止轉(zhuǎn)換狀態(tài)
begin
OE《=0;
START《=0;
ALE《=0;ADDA《=1;
end
START_H:
begin
OE《=0;
START《=1; //產(chǎn)生啟動信號
ALE《=1;
ADDA《=1;//選擇信道口IN0
end
START_L:
begin
OE《=0;
START《=0;
ALE《=1;//啟動信號脈寬要足夠長,在啟動的時候ALE要一直有效
end
CHECK_END:
begin
OE《=0;
START《=0;
ALE《=0;
end
GET_DATA:
begin
OE《=1; //高電平打開三態(tài)緩沖器輸出轉(zhuǎn)換數(shù)據(jù)
DATA_R《=DATA;//提取轉(zhuǎn)換數(shù)據(jù)
START《=0;
ALE《=0;
end
default:
begin
OE《=0;
START《=0;
ALE《=0;
ADDA《=0;
end
endcase
endmodule
評論