數(shù)控直流電源,數(shù)控,直流電源
數(shù)控直流電源
一、 方案論證與選擇
方案一:原理框圖如圖1所示,采用數(shù)字邏輯控制。通過“+”、“-”兩鍵操作,控制可逆計(jì)數(shù)器分別作加、減計(jì)數(shù),可逆計(jì)數(shù)器的二進(jìn)制數(shù)字輸出一路用于驅(qū)動數(shù)顯電路,指示電源輸出電壓的大小值;另一路進(jìn)入D/A轉(zhuǎn)換電路,將數(shù)字量按比例轉(zhuǎn)換成模擬電壓,然后經(jīng)過射極跟隨器控制調(diào)整輸出級輸出所需的穩(wěn)定電壓。該方案能夠完成基本要求,發(fā)揮部分受到限制。
圖一 方案一示意圖
方案二:原理框圖如圖2所示,采用8051單片機(jī)產(chǎn)生波形,D/A轉(zhuǎn)換器將其轉(zhuǎn)化為模擬電壓,再經(jīng)過放大器放大。由單片機(jī)的軟件實(shí)現(xiàn)電壓的步進(jìn)增減、對鍵盤的自動掃描等功能。該方案靈活性大,易于擴(kuò)展,需要專用的譯碼驅(qū)動芯片。
圖二 方案二示意圖
方案三:數(shù)控部分同方案二,原理框圖如圖三。用74LS164作驅(qū)動器,由單片機(jī)軟件控制數(shù)碼顯示,軟件還附有顯示器的自動刷新及電路的過零保護(hù)等功能。該方案具有方案二的所有優(yōu)點(diǎn),而降低了對芯片的要求,提高了系統(tǒng)的可靠性。
圖三 方案三示意圖
綜上所述,選用方案三。
二.理論分析與參數(shù)計(jì)算
1. DAC0832簡介
DAC0832是一款采用CMOS工藝制成的單片電流輸出型8位數(shù) / 模轉(zhuǎn)換器,圖四是它的邏輯框圖和引腳排列。DAC0832有三種工作方式:不帶緩沖工作方式,單緩沖工作方式,雙緩沖工作方式。
圖四 DAC0832的邏輯框圖和引腳排列
2.步進(jìn)01.V的實(shí)現(xiàn)
因?yàn)檩敵鲭妷毫砍虨?0V,VREF基準(zhǔn)電壓范圍為-10V---+10V,基準(zhǔn)電壓可以為5.12V,這樣在DAC0832的8腳輸出電壓的分辨率為:
即D/A輸入數(shù)據(jù)端每增加1,電壓增加0.02V。D/A的電壓輸出端接放大器OP27
的輸入端,放大器的放大倍數(shù)為5 ,才能得到輸出電壓的電壓分辨率:
0.02V×5=0.1V
這樣當(dāng)調(diào)節(jié)電壓的時候,以每次0.1V的梯度增加或者降低電壓。
三.硬件電路圖
1.波形轉(zhuǎn)換與放大部分
選用51系列的單片機(jī)產(chǎn)生和控制波形。數(shù)模轉(zhuǎn)換器用的是DAC0832,本方案中DAC0832采用單緩沖模式。
電路如圖五所示,P0口和DAC0832的數(shù)據(jù)口直接相連, 和 接地,DAC數(shù)據(jù)寄存器處于直通狀態(tài),ILE=1,和連接后接P2.0。在選中該片的地址(=0)時,寫入數(shù)字量,該數(shù)字信號就立即傳送到DAC輸入寄存器,并直通至DAC數(shù)據(jù)寄存器,經(jīng)過短暫的建立時間,即可以獲得相應(yīng)的模擬電壓。 寫入操作結(jié)束, 和立即變?yōu)楦唠娖剑瑢懭氲臄?shù)據(jù)被輸入寄存器鎖存,直到再次寫入刷新。
圖五 波形產(chǎn)生與轉(zhuǎn)換電路
圖六 電流放大電路
2.鍵盤與數(shù)碼顯示部分 電路如圖七
圖七 鍵盤與顯示電路
3.穩(wěn)壓電源部分
電源部分輸出+5V,+15V,-15V電壓供給系統(tǒng),另外還制作+5.12V直流穩(wěn)壓電源做DAC0832的VERF的基準(zhǔn)電壓。
四.軟件設(shè)計(jì)與流程圖
1.軟件介紹
軟件部分采用模塊化程序設(shè)計(jì)的方法編寫,系統(tǒng)軟件由主控制程序、數(shù)碼顯示子程序、鍵盤服務(wù)子程序組成。還添加了自動掃描鍵盤、顯示器的自動刷新、過零保護(hù)的功能。編程中C函數(shù)和匯編函數(shù)相互調(diào)用。
2.程序流程圖 如圖九所示
圖九 軟件流程圖
五.程序如下
#include
#define uchar unsigned char
sbit dp=P1^4;
sbit sh=P1^5;
void delay(unsigned int t);
uchar Getkey(void);
void Disp(uchar n);
uchar Disptab[10]={0x11,0x7d,0x23,0x29,0x4d,0x89,0x81,0x3d,0x1,0x9};
main()
{ uchar key;
char Vol1=0x00,Vol2=0x00;
Disp(Disptab[Vol2]);
Disp(Disptab[Vol1]-1);
P0=0x00;
while(1)
{ key=Getkey();
switch(key)
{ case 0x01:break;
case 0x02:break;
case 0x04:if(Vol1==0&&Vol2==0)break;
Vol2--;
if(Vol2<0)
{ Vol2=9;Vol1--; }
Disp(Disptab[Vol2]);
Disp(Disptab[Vol1]-1);
P0=4.3*(Vol1*10+Vol2);
break;
case 0x08:if(Vol1==9&&Vol2==9)break;
Vol2++;
if(Vol2==10)
{ Vol2=0x00;Vol1++; }
Disp(Disptab[Vol2]);
Disp(Disptab[Vol1]-1);
P0=4.3*(Vol1*10+Vol2);
break;
default:break; } } }
uchar Getkey(void)
{uchar key;
P1|=0x0f;
if(!(~(P1|0xf0))) return 0x00;
delay(0x20);
if(!(~(P1|0xf0))) return 0x00;
key=~(P1|0xf0);
while(~(P1|0xf0));
return key; }
void delay(unsigned int t)
{ while(--t); }
void Disp(uchar n)
{ uchar i;
for(i=0;i<8;i++){
sh=0;
if(0x80&n){
dp=1; }
else
{ dp=0; }
sh=1;
n=(n<<1)+1; } }
6
1 1