計一對降壓型直流開關(guān)穩(wěn)壓電源,額定輸入直流電壓36v ,額定輸出直流電壓10v的穩(wěn)壓電源。輸出電流最大3A,額定功率30W.要求具備穩(wěn)壓功能,輸出紋波電壓最大70mv,負(fù)載調(diào)整率<5%,電壓調(diào)整率<0.7%。有過流保護(hù)功能并且動作值3.2A左右??梢圆⒙?lián)運(yùn)行倆個穩(wěn)壓電源。
這次我和大家分享的是降壓DC/DC開關(guān)穩(wěn)壓電源的設(shè)計,這次資料全部開源,對,是全部開源。我會陸續(xù)更新把電路PCB、主要原理以及程序等全部開源。還有需要PCB的小伙伴,可以在評論區(qū)回復(fù)郵箱,我看到就會發(fā)送的。
先上主要的系統(tǒng)圖片:
開始步入主題啦,一開始用TL494做的簡易主控電路,方便雖然方便但是后期測試電路發(fā)現(xiàn)他在50Khz工作頻率時候芯片發(fā)燙嚴(yán)重,效率也跟不上最高也是75%,紋波和電壓調(diào)整率還可以,負(fù)載調(diào)整率下跌。
而TL494是一種固定頻率脈寬調(diào)制電路,它包含了開關(guān)電源控制所需的全部功能,廣泛應(yīng)用于單端正激雙管式、半橋式、全橋式開關(guān)電源,振蕩頻率可以通過外部的一個電阻和一個電容進(jìn)行調(diào)節(jié)。輸出電容的脈沖其實(shí)是通過電容上的正極性鋸齒波電壓與另外2個控制信號進(jìn)行比較來實(shí)現(xiàn)。功率輸出管Q1和Q2受控于或非門。當(dāng)雙穩(wěn)觸壓器的 時鐘信號為低電平時才會被通過,即只有在鋸齒波電壓大于控制信號期間才會被選通。當(dāng)控制信號增大,輸出脈沖的寬度將減小。
控制信號由集成電路外部輸入,一路送至?xí)r間死區(qū)時間比較器,一路送往誤差放大器的輸入端。死區(qū)時間比較器具有120mV的輸入補(bǔ)償電壓,它限制了最小輸出死區(qū)時間約等于鋸齒波的周期4%,當(dāng)輸出端接地,最大輸出占空比為96%,而輸出端接參考電平時,占空比為48%。當(dāng)把死區(qū)時間控制輸入端接上固定的電壓,即能在輸出脈沖上產(chǎn)生附加的死區(qū)時間。
脈沖寬度調(diào)制比較器為誤差放大器調(diào)節(jié)輸出脈寬提供了一個手段:當(dāng)反饋電壓從0.5V變化到3.5時,輸出的脈沖寬度從被死區(qū)確定的最大導(dǎo)通百分比時間中下降為零。2個誤差放大器具有從—0.3V到(vcc—2.0)的共模輸入范圍,這可能從電源的輸出電壓和電流察覺的到。誤差放大器的輸出端常處于高電平,它與脈沖寬度調(diào)智器的反相輸入端進(jìn)行“或”運(yùn)算,正是這種電路結(jié)構(gòu),放大器只需最小的輸出即可支配控制電路。
494外圍PCB電路如下:
這是系統(tǒng)全局的一張圖,純硬件電路打造。用起來有點(diǎn)不太靈活
現(xiàn)在的直流穩(wěn)壓電源大致有兩類,一類是線性直流穩(wěn)壓電源,另一類是開關(guān)直流穩(wěn)壓電源,又稱高頻直流穩(wěn)壓電源。因?yàn)殚_關(guān)直流穩(wěn)壓電源與一般的線性及可控硅電源相比體積更小,重量小,節(jié)能效果更好等顯著的特點(diǎn),愈來愈受到廣大用戶的酷愛。
TL494也是大多DIY愛好者和初學(xué)者喜歡的一款可以說是萬能的芯片了,第一款產(chǎn)品在不懈努力之下終于完成了,只能說算是中規(guī)中矩把任務(wù)都完成了,顯然沒有達(dá)到預(yù)想的完美效果.整流之后輸出的直流電壓,雖然是直流電,但其中含有一部分的交流成分,所以還需要經(jīng)過濾波電路,將多余的交流部分過濾,得到成分較少的直流電。電感濾波適用于低電壓場合,Π型LC濾波電路由于電阻的存在,電源功率會有所損耗,降低功率,所以濾波電路選用電容濾波電路。整流電路通過電容濾波電路,相比前兩者濾波電路,其輸出電路更光滑,電壓的平均值也有所增加。
電容濾波電路如圖:
這個BUCK電路圖紙是
在萬用板搭建的基礎(chǔ)上又進(jìn)行了電路的pcb繪制,并打出來第一塊板子
這是用運(yùn)放做的負(fù)載識別功能電路,恒壓輸出與負(fù)載識別功能的切換即恒壓和恒流模式的切換,可以采用數(shù)控方法和OP07雙運(yùn)放放大電路。
通過兩個OP07組成雙運(yùn)放電路,第一個OP07運(yùn)放通過調(diào)整電壓放大倍數(shù)讓負(fù)載阻值以輸出電壓形式體現(xiàn),第二個OP07運(yùn)放調(diào)整輸出電壓方向,再將電壓反饋至TL494的2腳,從而實(shí)現(xiàn)負(fù)載識別功能。該方案具有很好的穩(wěn)定性,并且硬件電路不復(fù)雜。為了實(shí)現(xiàn)切換功能,我們選擇按鍵開關(guān)進(jìn)行手動切換,簡單實(shí)用。通過比較,我們選擇此方案。如圖所示。
電阻分壓檢測電路。經(jīng)過在輸出回路中串連采樣電阻,將經(jīng)過電阻的電流轉(zhuǎn)換成兩端的電壓,經(jīng)過檢測電壓值從而獲得電流值。
使用電阻采樣法,電阻與電位器串聯(lián),獲得中間電壓返回給單片機(jī),實(shí)現(xiàn)采集電壓的電流轉(zhuǎn)換成兩端的電壓,經(jīng)過檢測電壓值從而獲得電流值。
過流保護(hù)采用TL494內(nèi)部實(shí)現(xiàn)過流保護(hù)需要在電路中加采樣電阻。利用采樣電阻的分壓進(jìn)入芯片內(nèi)部,實(shí)現(xiàn)過流保護(hù)。同時該芯片有多種過流保護(hù)模式,該方案電路非常簡單,但是在3.2A情況下,要實(shí)現(xiàn)過流保護(hù),需要加大采樣電阻,這會降低整個系統(tǒng)的效率?;蛘呖梢圆捎眠\(yùn)放放大電壓在進(jìn)行控制。
這對運(yùn)放線性要求較高。采樣電路如圖:
驅(qū)動電路由IR2104半橋驅(qū)動芯片驅(qū)動BUCK型同步整流電路實(shí)現(xiàn)系統(tǒng)降壓的操作,該芯片采用被動式泵荷升壓原理。上電時,電源流過快恢復(fù)二極管D向電容C充電,C上的端電壓很快升至接近Vcc,這時如果下管導(dǎo)通,C負(fù)級被拉低,形成充電回路,會很快充電至接近Vcc,當(dāng)PWM波形翻轉(zhuǎn)時,芯片輸出反向電平,下管截止,上管導(dǎo)通,C負(fù)極電位被抬高到接近電源電壓,水漲船高,C正極電位這時已超過Vcc電源電壓。因有D的存在,該電壓不會向電源倒流,C此時開始向芯片內(nèi)部的高壓側(cè)懸浮驅(qū)動電路供電,C上的端電壓被充至高于電源高壓的Vcc,只要上下管一直輪流導(dǎo)通和截止,C就會不斷向高壓側(cè)懸浮驅(qū)動電路供電,使上管打開的時候,高壓側(cè)懸浮驅(qū)動電路電壓一直大于上管的S極。采用該芯片降低了整體電路的設(shè)計難道,只要電容C選擇恰當(dāng),該電路運(yùn)行穩(wěn)定。
BUCK型同步整流電路如下:
之前測試在輸出端采用Π型濾波大大降低了紋波,但是由于濾波使得公共端地的不穩(wěn)定造成電路有時的故障不能工作一開始以為是基準(zhǔn)電壓的浮動就用另一片494的基準(zhǔn)作為控制端2腳的基準(zhǔn)電壓。濾波電路帶來的損耗也比較大,而該電路只能實(shí)現(xiàn)對系統(tǒng)穩(wěn)壓降壓以及帶載功能過流和負(fù)載識別尚沒使用。在經(jīng)過一系列調(diào)試測試參數(shù),發(fā)現(xiàn)利用494做的純硬件的穩(wěn)壓電源可以實(shí)現(xiàn)過流保護(hù)功能、負(fù)載識別功能。并且再通過濾波電路的調(diào)整會得到一個滿足的紋波值。但是這種電路效率最高只能達(dá)到75%,離要求還有很多距離而且負(fù)載調(diào)整率嚴(yán)重不行,重量也嚴(yán)重超標(biāo),因此決定換用覆銅板,利用頻率和電路PCB布局走線來降低紋波。
在用TL494主控調(diào)試中發(fā)現(xiàn),494雖然設(shè)計利用起來簡便,但在需要高頻環(huán)境下以及高效率低紋波都滿足不了設(shè)計要求。而且負(fù)載調(diào)整的采樣電阻分壓補(bǔ)償,硬件做起來難度大精度不高,過流精度也稍微低一點(diǎn)。因此對電路主控進(jìn)行重新選擇,用stc12單片機(jī)作為系統(tǒng)主控通過軟件實(shí)現(xiàn)過流精度以及負(fù)載調(diào)整的采樣電阻分壓補(bǔ)償,stc12單片機(jī)可以提供50khz的工作頻率進(jìn)一步降低紋波電壓。第一代覆銅板產(chǎn)品乍一看又丑又大,主要是自己對ADPCB繪制的不熟悉造成的,但是電路實(shí)用而且紋波降低的效果明顯。
測試調(diào)試數(shù)控穩(wěn)壓電源時的寫照
經(jīng)過一系列調(diào)整這是二代PCB電路,在原有基礎(chǔ)上對電路的主控布置進(jìn)行了大范圍調(diào)整
在二代基礎(chǔ)上把控制電路移到了中間在四周通過主回路。更一步集成
當(dāng)時做的雙層板,下層主回路上層控制回路,為了增加濾波的效果延長了輸出回路并通過差分走線進(jìn)一步改善濾波效果。
最終的成品電路如下:
對系統(tǒng)進(jìn)行全面的調(diào)試后,進(jìn)行了對系統(tǒng)參數(shù)的測量,此次的系統(tǒng)全部符合題目要求
電壓調(diào)整0.1%
負(fù)載調(diào)整1.1%
效率95%
紋波10%
對系統(tǒng)進(jìn)行并聯(lián)測試未發(fā)現(xiàn)有環(huán)流
測試結(jié)果分析如下:
根據(jù)上述測試數(shù)據(jù),由此可以得出結(jié)論:
(1) 額定輸出電壓下,輸出電壓偏差為:5.5mV,遠(yuǎn)小于100mV。說明電路的輸出準(zhǔn)確。
(2) 額定輸入電壓下,已測最大輸出電流為3.102A,大于3A。說明電路能承受大電流。
(3) 輸出噪聲紋波電壓峰峰值為20.5mV,小于50mV。滿足題目要求。
(4) 負(fù)載調(diào)整率為1.02%,小于5%;以及電壓調(diào)整率為0.01%,小于0.5%。說明整個電路穩(wěn)定性好,不易受到外部的干擾。
(5) 滿載時效率為90.4%。說明該電路效率極高。
(6) 具備3.2A過流保護(hù)。
(7) 整體重量為0.17kg說明該電路具有小體積小重量的優(yōu)勢。
附部分源程序:
#include <STC12C5A60S2.H>
#include <intrins.h> /*use _nop_() function*/
#define uchar unsigned char
#define uint unsigned int
#define ADC_FLAG 0X10
#define S1_S0 0x40 //P_SW1.6
#define S1_S1 0x80 //P_SW1.7
sbit SD1 = P3^3;
sbit LED3 = P1^7;
sbit LED4 = P3^4;
sbit key1 = P0^0; //ok
sbit key2 = P2^0; //+
sfr P_SW1 = 0xA2; //外設(shè)功能切換寄存器1
uint Vout=0;
uint Iout = 0; //輸出電壓
uint V1=0;
uint I1 = 0;
uint sum = 0;
uint Vref = 0;
uchar block = 175;
uchar log = 0;
uchar lag = 0;
uchar snm = 0;
uint get = 0;
uint got = 0;
float R = 9.998;
float Vin = 5.08;
float Vget;
float Rfu;
bit busy;
void delay();
void Key_1_();
void Key_2_();
void init_pca();
void init_timer();
void SendData(uchar dat);
void SendString(char *s); /
**********************************************************
函數(shù)說明: 延時程序
**********************************************************/
void delay(uchar t)
{
uint j;
uchar i;
for(i=0;
i<t;
i++) for(j=0;
j<1000;
j++);
}
/**********************************************************
函數(shù)說明: pca計數(shù)器初始化函數(shù)
**********************************************************/
void init_pca(void)
{
CMOD=0x08;//計數(shù)器0的溢出為PCA計數(shù)器的時鐘源,允許pca中斷使能,PDF資料上錯誤
CCON=0x00;
CCAPM0=0x42;//8位PWM輸出,無中斷
CCAPM1=0x42;//8位PWM輸出,無中斷
CL=0x00;//清零pca計數(shù)器
CH=0x00;
CCAP0L=0; //初始化spwm輸出的占空比
CCAP0H=0;
CCAP1L=0; //初始化spwm輸出的占空比
CCAP1H=0; CR=1;//運(yùn)行pca計數(shù)器
}
/**********************************************************
函數(shù)說明: 讀ADC數(shù)值
**********************************************************/
uchar GetADC(uchar ch)
{
uint laji;
uint result=0;
ADC_CONTR=0x88|ch; //選擇通道 開始AD轉(zhuǎn)換
_nop_();
_nop_();
_nop_();
_nop_();
while(!ADC_FLAG); //查詢ADC_FLOG是否置位1 轉(zhuǎn)換結(jié)束
~ADC_FLAG; //Clear ADC interrupt flag//1111 0111 結(jié)束AD轉(zhuǎn)換
laji=ADC_RESL;
result=ADC_RES;
return(result);
}
/**********************************************************
函數(shù)說明: ADC查詢法 始化函數(shù)
**********************************************************/
void InitADC()
{
uchar a;
P1M1=0x07;
P1M0=0x00;
P1ASF=0X07;
//相應(yīng)端口當(dāng)ADC使用時,端口要置位
P10&P11 ADC_RES=0;
ADC_CONTR=0X80; //1000 0000 開電源,最低速
delay(50);
for(a=0;a<5;a++)
{
GetADC(0);
}
}
/**************************************
短延時
**************************************/
void delay5ms()
{
uchar i,v,k;
for(i=1;i>0;i--) for(v=168;v>0;v--) for(k=22;k>0;k--);
}
/**********************************************************
函數(shù)說明: 過流保護(hù)開啟按鍵
**********************************************************/
void Key_1_()
{
if(key1==0)
{
delay(100);
if(key1==0)
{
SD1 = 1;
LED4 = 1;
delay(200);
LED4 = 0;
}
delay(100);
}
}
/**********************************************************
函數(shù)說明: 模式選擇按鍵
**********************************************************/
void Key_2_()
{
if(key2==0)
{
delay(100);
if(key2==0)
{
if(log<3)log+=1;
else log = 0;
LED4 = 1;
delay(200);
LED4 = 0;
}
delay(100);
}
}
/**********************************************************
函數(shù)說明: 調(diào)整電壓
**********************************************************/
void VAdjust()
{
uchar a,b,c,d;
switch(lag)
{
case 0: I1 = GetADC(1); sum+=1;Iout +=I1;break;
case 1: ADC_CONTR=0X00;_nop_(); _nop_();_nop_(); _nop_();sum+=1;break;
case 2: V1 = GetADC(0); sum+=1; Vout +=V1;break;
case 3: ADC_CONTR=0X80;_nop_(); _nop_();_nop_(); _nop_();sum+=1;break;
}
if(sum >= 100)
{
sum = 0;
switch(lag)
{
case 0: Iout = Iout/50;
a = 48+Iout/1000;
b = 48+Iout%1000/100;
c = 48+Iout%100/10;
d = 48+Iout%10;
// SendData(e);
SendData(a);
SendData(b);
SendData(c);
SendData(d);
SendData('\n');
Vref = 119+ Iout/29;
break;
case 1: break;
case 2: Vout = Vout/100;
a = 48+Vout/1000;
b = 48+Vout%1000/100;
c = 48+Vout%100/10;
d = 48+Vout%10;
// SendData(e);
SendData(a);
SendData(b);
SendData(c);
SendData(d);
SendData('\n');
if(Vout>Vref) //輸出電壓小于36V
{
if(block==255)
block=255;
else block++;
}
else //輸出電壓大于36V
{
if(block==50)
block= 50;
else block--;
} break;
case 3: break;
} lag+=1;
if(lag>3) lag=0;
Vout = 0;
Iout = 0;
}
}
/**********************************************************
函數(shù)說明: 過流保護(hù)
**********************************************************/
void IAdjust()
{
uchar a,b,c,d;
switch(lag)
{
case 0: I1 = GetADC(1); sum+=1;Iout +=I1;break;
case 1: ADC_CONTR=0X00;_nop_(); _nop_();_nop_(); _nop_();sum+=1;break;
case 2: V1 = GetADC(0); sum+=1; Vout +=V1;break;
case 3: ADC_CONTR=0X80;_nop_(); _nop_();_nop_(); _nop_();sum+=1;break;
}
if(sum >= 100)
{
sum = 0;
switch(lag)
{ case 0: Iout = Iout/50;
a = 48+Iout/1000;
b = 48+Iout%1000/100;
c = 48+Iout%100/10;
d = 48+Iout%10;
// SendData(e);
SendData(a);
SendData(b);
SendData(c);
SendData(d);
SendData('\n');
if(Iout>=218)
{
snm+=1;
if(snm >=20) SD1 = 0;
}
Vref = 119+ Iout/29; break;
case 1: break;
case 2: Vout = Vout/100;
a = 48+Vout/1000;
b = 48+Vout%1000/100;
c = 48+Vout%100/10;
d = 48+Vout%10;
// SendData(e);
SendData(a);
SendData(b);
SendData(c);
SendData(d);
SendData('\n');
if(Vout>Vref) //輸出電壓小于36V
{
if(block==255)
block=255;
else
block++;
}
else //輸出電壓大于36V
{ if(block==50)
block= 50;
else
block--;
} break;
case 3: break;
}
lag+=1;
if(lag>3)
lag=0;
Vout = 0;
Iout = 0;
}
}
/**********************************************************
函數(shù)說明: 負(fù)載識別
**********************************************************/
void KnowLoad(void)
{ uchar a,b,c,d;
switch(lag)
{
case 0: get = GetADC(2); sum+=1;got +=get;break;
case 1: ADC_CONTR=0X00;_nop_(); _nop_();_nop_(); _nop_();sum+=1;break;
case 2: V1 = GetADC(0); sum+=1; Vout +=V1;break;
case 3: ADC_CONTR=0X80;_nop_(); _nop_();_nop_(); _nop_();sum+=1;break;
}
if(sum >= 100)
{
sum = 0;
switch(lag)
{ case 0: got = got/100;
a = 48+got/1000;
b = 48+got%1000/100;
c = 48+got%100/10;
d = 48+got%10;
// SendData(e);
SendData(a);
SendData(b);
SendData(c);
SendData(d);
SendData('\n');
if(got>=240) Vref = 0;
else
{ if(got<=60) {Vget = (got+2)*0.02;
Rfu =Vget*R/Vin/(1-Vget/Vin)/2.0;
Vref = Rfu/0.02-3;
}
if(got>60 && got<100)
{
Vget = (got-3)*0.02;
Rfu =Vget*R/Vin/(1-Vget/Vin)/2.0;
Vref = Rfu/0.02+2;
}
if(got>=100)
{ Vget = (got-6)*0.02;
Rfu =Vget*R/Vin/(1-Vget/Vin)/2.0;
Vref = Rfu/0.02;
}
} break;
case 1: break;
case 2: Vout = Vout/100;
a = 48+Vout/1000;
b = 48+Vout%1000/100;
c = 48+Vout%100/10;
d = 48+Vout%10;
// SendData(e);
/* SendData(a);
SendData(b);
SendData(c);
SendData(d);
SendData('\n');
*/ if(Vout>Vref) //輸出電壓小于36V
{
if(block==255)
block=255;
else block++;
}
else //輸出電壓大于36V
{
if(block==50)
block= 50;
else block--;
} break;
case 3: break;
}
lag+=1;
if(lag>3) lag=0;
Vout = 0;
Iout = 0; }
}
/**********************************************************
函數(shù)說明: 主函數(shù)
**********************************************************/
void main(void)
{ LED1 = LED2 =LED3 =LED4 =0;
delay(255);delay(255);delay(255);
InitADC();
init_pca();
init_timer();
EA=1;//開總中斷
while(1)//主循環(huán)
{
Key_2_();
// VAdjust();
switch(log)
{
case 1: break;
case 0: VAdjust();LED1 = 1;LED2 = LED3 = 0;break;
case 3: IAdjust();LED2 = 1;LED1 = LED3 = 0;Key_1_();break;
case 2: KnowLoad();LED3 = 1;LED1 = LED2 = 0;break;
}
}
}