TLC549是 TI公司生產(chǎn)的一種低價位、高性能的8位A/D轉(zhuǎn)換器,它以8位開關(guān)電容逐次逼近的方法實現(xiàn) A/D轉(zhuǎn)換,其轉(zhuǎn)換速度小于 17us,最大轉(zhuǎn)換速率為 40000HZ,4MHZ典型內(nèi)部系統(tǒng)時鐘,電源為 3V至 6V。它能方便地采用三線串行接口方式與各種微處理器連接,構(gòu)成各種廉價的測控應(yīng)用系統(tǒng)。
TLC549工作時序
當/CS變?yōu)榈碗娖胶螅?TLC549芯片被選中,同時前次轉(zhuǎn)換結(jié)果的最高有效位MSB (A7)自 DATA OUT 端輸出,接著要求自 I/O CLOCK端輸入8個外部時鐘信號,前7個 I/O CLOCK信號的作用,是配合 TLC549 輸出前次轉(zhuǎn)換結(jié)果的 A6-A0 位,并為本次轉(zhuǎn)換做準備:在第4個 I/O CLOCK 信號由高至低的跳變之后,片內(nèi)采樣/保持電路對輸入模擬量采樣開始,第8個 I/O CLOCK 信號的下降沿使片內(nèi)采樣/保持電路進入保持狀態(tài)并啟動 A/D開始轉(zhuǎn)換。
轉(zhuǎn)換時間為 36 個系統(tǒng)時鐘周期,最大為 17us。直到 A/D轉(zhuǎn)換完成前的這段時間內(nèi),TLC549 的控制邏輯要求:或者/CS保持高電平,或者 I/O CLOCK 時鐘端保持36個系統(tǒng)時鐘周期的低電平。由此可見,在自 TLC549的 I/O CLOCK 端輸入8個外部時鐘信號期間需要完成以下工作:讀入前次A/D轉(zhuǎn)換結(jié)果;對本次轉(zhuǎn)換的輸入模擬信號采樣并保持;啟動本次 A/D轉(zhuǎn)換開始。
本實驗中,我們使用TLC549芯片檢測模擬電壓,為方便檢測,我們在實驗中,使用了數(shù)碼管作為我們的顯示模塊,將檢測到的電壓顯示到數(shù)碼管上,與實際的電壓進行比較。開發(fā)板上,芯片VCC=3.3V,VREF+=3.3V,VREF-=0。
硬件原理圖
AD芯片TLC549采集模擬信號實驗代碼
module ADC_TLC549
?。?/p>
clk,//系統(tǒng)50MHZ時鐘
adc_sclk,//AD TLC549的時鐘
data,//AD TLC549的數(shù)據(jù)口
cs,//AD TLC549的片選擇
wei,//數(shù)碼管的為選擇
duan //數(shù)碼管的7段碼
?。?
input clk;
input data;
output cs;
output adc_sclk;
output[7:0] duan;
output[3:0] wei;
reg cs,adc_sclk,clk1k,clk1ms;
reg[15:0] count;
reg[24:0] count1ms;
reg[3:0] cnt;
reg[2:0] number;
reg[1:0] state;
reg[3:0] wei;
reg ledcs;
reg[7:0] duan;
reg[7:0] dataout;
reg[16:0] tenvalue;
parameter sample=2‘b00,
display=2’b01;
/**********產(chǎn)生100k的采集時鐘信號*********/
always@(posedge clk)
begin
if(count《=250)
count《=count+1‘b1;
else
begin
count《=0;
adc_sclk《=~adc_sclk;
end
end
/*******產(chǎn)生周期為1ms即1kHz的信號*********/
always@(posedge clk)
begin
if(count1ms》25’d25000)
begin
clk1ms《=~clk1ms;
count1ms《=0;
end
else
count1ms《=count1ms+1;
end
/*********AD采樣程序**************/
always@(negedge adc_sclk)
begin
case(state)
sample:
begin
cs《=0;
dataout[7:0]《={dataout[6:0],data};
if(cnt》4‘d7)
begin
cnt《=0;
state《=display;
end
else
begin
cnt《=cnt+1;
state《=sample;
end
end
display:
begin
cs《=1;//關(guān)AD片選
tenvalue《=(tendata((dataout》》4)&8’b0000_1111)*16+tendata(dataout&8‘b0000_1111))*129;//
//得到采集的數(shù)據(jù)
state《=sample;
end
default: state《=display;
endcase
end
/***********2進制轉(zhuǎn)十進制函數(shù)*************/
function[7:0] tendata;//返回一個4位的數(shù)字
input[7:0] datain;
begin
case(datain)
4’b00000000: tendata=4‘d0;//0
4’b00000001: tendata=4‘d1;//1
4’b00000010: tendata=4‘d2;//2
4’b00000011: tendata=4‘d3;//3
4’b00000100: tendata=4‘d4;//4
4’b00000101: tendata=4‘d5;//5
4’b00000110: tendata=4‘d6;//6
4’b00000111: tendata=4‘d7;//7
4’b00001000: tendata=4‘d8;//8
4’b00001001: tendata=4‘d9;//9
4’b00001010: tendata=4‘d10;//
4’b00001011: tendata=4‘d11;//
4’b00001100: tendata=4‘d12;
4’b00001101: tendata=4‘d13;
4’b00001110: tendata=4‘d14;
4’b00001111: tendata=4‘d15;
default:tendata=4’bzzzz_zzzz;
endcase
end
endfunction
/*********十進制轉(zhuǎn)LED段選函數(shù)*********/
function[7:0] leddata;//返回一個8位的數(shù)字
input[3:0] datain;
begin
case(datain)
4‘d0: leddata=8’b11000000;//0
4‘d1: leddata=8’b11111001;//1
4‘d2: leddata=8’b10100100;//2
4‘d3: leddata=8’b10110000;//3
4‘d4: leddata=8’b10011001;//4
4‘d5: leddata=8’b10010010;//5
4‘d6: leddata=8’b10000010;//6
4‘d7: leddata=8’b11111000;//7
4‘d8: leddata=8’b10000000;//8
4‘d9: leddata=8’b10010000;//9
4‘d10: leddata=8’b10111111;//-
4‘d11: leddata=8’b01111111;//。
default:leddata=8‘bzzzz_zzzz;
endcase
end
endfunction
/********數(shù)碼管掃描函數(shù)*************/
always@(posedge clk1ms)
begin
if(number==5)
number《=0;
else
begin
number《=number+1;
case(number)
4’d0:
begin
duan《=leddata((tenvalue/10)%10);//個位
wei《=4‘b1110;
end
4’d1:
begin
duan《=leddata((tenvalue/100)%10);//十位
wei《=4‘b1101;
end
4’d2:
begin
duan《=leddata((tenvalue/1000)%10);//百位
wei《=4‘b1011;
end
4’d3:
begin
duan《=leddata(tenvalue/10000);//千位
wei《=4‘b0111;
end
4’d4:
begin
duan《=leddata(4‘d11);//。 顯示小數(shù)點
wei《=4’b0111;
end
endcase
end
end
endmodule
評論
查看更多