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