高功率因数电源.docx
《高功率因数电源.docx》由会员分享,可在线阅读,更多相关《高功率因数电源.docx(19页珍藏版)》请在冰点文库上搜索。
高功率因数电源
高功率因数电源(E题)
摘要
本设计由四个模块电路构成:
整流滤波,DC—DC变换部分,PFC校正和显示模块。
整流滤波采用两级组成,前级为消除干扰电路,后级为整流电路。
DC—DC变换部分为Boost电路。
PFC校正采用UCC28019。
显示模块由霍尔电流传感器及单片机共同协作完成。
本设计功率因数高、抗干扰能力强为特长,具有输入电压范围宽、输出电压稳定且连续可调、过载能力强的特点。
关键词:
Boost电路;功率因数,PFC校正;
一、方案论证
在本设计中,核心采用PFC校正技术,因此重点对PFC控制方案的选取进行论证。
1、DC—DC变换方案
方案一:
使用PWM斩波后利用高频变压器隔离升压的方案。
由于高频变压器的加工设计等问题,加工难度大,使用受到限制,而且其电压需要高频整流滤波,电压毛刺较大,电路结构复杂,线路之间的影响较大。
方案二:
采用带PFC的Boost型DC—DC升压器。
该电路有专用的控制芯片,容易实现,电路结构简单,同时采用PFC功率因数校正技术,功耗低,输出电压范围宽。
输出电压波形中毛刺也比方案一要小。
本设计采用方案二。
2、PFC控制方案
方案一:
选用TI公司的UC3854。
UC3854封装引脚多,从而导致应用电路复杂,线路之间的干扰较大,因此产品的噪声较大。
对焊接工艺要求较高,而且调试电路的难度较大。
UC3854组成的PFC电路还需要调节电压放大器电流、放大器和乘法器。
方案二:
选用MC33260芯片,MC33260跟随升压操作具有所需电感较小和价格便宜的优点,但由于存在潜在的EMI问题,需要一个设计精巧的输入滤波器,难度较大。
方案三:
选用TI公司的UCC28019。
UCC28019交流输入市电电流总谐波畸变率低,功率校正因数高,抗干扰能力强,封装引脚较少,PFC控制部分电路相对简单。
只需调节一个放大器的补偿网络即可,高压起动源直接接在高压输入端,光耦直接接到IC的端子,不再处理放大器的补偿,前沿消隐做在IC内部,IC外部只有电流取样。
这样的做法使设计的步骤减少了。
综合比较,选择方案三。
3、总体框架
由以上各模块方案论证,得出总体框架设计如图1-1所示,本设计核心运用了功率因数校正技术其基本原理如下:
消除EMI干扰后,经过桥式整流、滤波得到直流电源。
通过功率因数校正技术控制Boost升压电路的开关工作频率。
利用单片机MSP430中的A/D转换,将电流、电压通过LCD显示出来。
图1-1
二、电路设计与参数计算
任务中要求负载电流最大为2A,输出电压Uo稳定在36V,由这两个条件可求出最大输出功率,因此可首先计算出最大输出功率
=UoIo=2A
36V=72W
最大RMS输入线电流由以下参数确定
根据以上计算,可算出最大输入电流
1、桥式整流滤波电路
本电路的目的在于从50Hz、220V的交流电压中得到直流电压。
电路图及参数见附录1所示。
由于MOSFET管工作时频繁的开关,因此对电路的干扰较大,在整流电路前加入EMI滤波电路,从而达到降低噪声的作用。
设计中还加入了压敏电阻VAR1,当电路中回路电流过大时,压敏电阻VAR1闭合保险丝F1熔断从而达到保护电路的目的。
当输入为220V交流电压时,首先经过隔离变压器降至18V左右交流电压。
再经过保护和滤波后输出端接入整流桥,整流部分选用了全波桥式整流电路,输出为直流电压。
在选择二极管时,其额定正向电流必须大于流过它的平均电流ID,其反向击穿电压必须大于它两端承受的最大反向电压VRM。
由此确定整流二极管的参数。
2、Boost升压电路
本设计采用Boost升压斩波电路,计算输出电容C4,假定输出电压最低不低于30V,则可
图2-1 Boost电路见右上图
算出C4最小值
由于C4大于或等于7738
F,因此本设计中选用10000
F。
计算出Boost电路中电感的值。
本设计中采用0.1mH。
3、PFC控制电路
PFC控制部分的电路设计见附录1,芯片管脚3电流信号的采集通常采用串联一个电阻,这种方案电路结构简单,成本低,开关电流通过MOSFET开关源串连的分路电阻转换为一个电压。
该分压电阻从源极(地)连接到输入整流器返回引脚3。
这种检测电流的方法会产生一个负电压,这对于IC而言并不理想,但方案容易实现,所以本方案采用串联一个电阻。
经计算
,本方案用0.05
。
4、连续可调输出电压电路
本设计通过编程,用单片机控制数字电位器接入电路中的阻值,从而达到输出电压连续可调的目的,同时将电压数值显示在LCD。
将芯片X9312管脚5和管脚6窜连接入电路中即可实现滑动变阻器的作用如图2-2。
图2-2
图中R10、R6、Rx(X9312)组成的局部电路该电路可实现输出电压在30V到36V之间连续可调,局部电如右图所示。
Rx为数字位器X9312。
由UCC28019管脚6的特性可知,a点的电压为5V,R10为8k
由此可得出R6及数字电位器的范围最大为9.6k
。
流经干路中的电流为:
5、测量及显示电路
a、功率因数测量电路,电路图如图2-3所示,
根据公式
进行编程,即可算出功率因数。
图2-3功率因数测量电路
b、设计测量输出电压、电流电路图如图2-4所示,该电路采用霍耳传感器采集电流信号,提高了采集信号的精度,减小了测量误差。
单片机内部具有D/A转换功能,通过编程即可将输出电压、电流显示在LCD上。
图2-4
三、测试方法与数据
1、测试方法
a、调节输入电压,使隔离变压器副端输出电压在15V~19V之间,用数字万用表测出隔离变压器负端电压。
在改变电压的同时用数字万用表测输出端电压及负载的电流,数据如下表:
输出电压Uo(V)
15
16
17
18
19
平均值
输出电压Uo(V)
34.82
35.53
36.0
36.06
36.03
35.67
误差绝对值
3.28%
1.31%
0%
0.17%
0.08%
0.97%
THD
4.76%
4.56%
5.03%
4.43%
4.34%
4.62%
λ
0.96
0.97
0.98
0.97
0.98
0.97
注:
输出电流为2A,标准输出电压为36V
b、改变负载电阻的大小(控制电流在0.5A~2A,用数字万用表测出输出端电流、电压,数据如下:
次数
1
2
3
4
5
平均值
输出电流Io(A)
0.5
1.0
1.5
1.8
2.0
输出电压Uo(V)
36.02
36.03
36.10
35.98
35.97
36.02
误差绝对值
0.06%
0.08%
0.03%
0.06%
0.08%
0.06%
注:
主电路输入电压为18V,标准输出电压为36V
c、调整隔离变压器的输入电压,但必须保证副边电压在15V~19V之间,用数字万用表分别测出输出电压和输出电流,并与测量电路进行比较,共测量5组数据,填入下表中:
次数
1
2
3
4
平均误差
实测
(V)
30.01
32.04
33.98
36.01
LCD显示
(V)
30
32
34
36
误差绝对值
0.03%
0.13%
0.06%
0.03%
0.05%
2、测试仪器
(1)数字万用表
(2)双踪示波器GOS—6051(50MHz)
(3)失真度测试仪
四、测试结果分析
1、输出电压分析
本电路实现了输出电压可稳定在30V~36V之间任一整数数值,经计算,误差的绝对值小于0.05%,超过指标要求。
改变负载电阻阻值的大小,输出电压扔稳定在预先设定值。
2、经示波器显示,隔离变压器副边电流I2的波形为正弦波,失真度为4.62%。
3、电路的功率因数为0.97,优于题设中的指标。
4、输出电压和电流测量电路,误差绝对值小。
误差分析
综合分析可知测试电路中可能带来的误差因数有:
1、测输出电流时接触点之间的微小电阻造成的误差。
2、电流表内阻传入回路造成的误差。
3、测试隔离变压器副边电压、电流时示波器造成的误差。
可以通过以下方法改进
1、减小接触点的微小电阻。
2、根据电流表的内阻对测量结果进行修正。
3、用示波器进行测量时采用手动同步。
4、采用更高精度的元件。
以上测试结果表明,相关指标达到或超过试题的设计要求,所设计方案是可行的。
参考文献:
[1]毛兴武等.功率因数校正原理与控制IC及其应用设计-北京:
中国电力出版社,2007
[2]王兆安等.电力电子技术-北京:
机械工业出版社,2000
[3]张乃国.电子电源技术与应用-北京:
机械工业出版社,2007.4
附录1:
整体电路图
附录2:
LCD及显示键盘与单片机接口电路
附录3:
图3—1副电源电路图
确定输入电容C3
输入电容CIN由输入纹波电流和输入纹波电压决定
因此可以计算出输入电容:
附录4:
主程序:
通过键盘的按键对采样显示、设置电压、过流保护、电源关断等进行设置
Main:
#include
#include"stdio.h"
#defineuintunsignedint
#defineucharunsignedchar
#include"lcd1602.h"
#include"key.c"
#include"adc.c"
#include"setv.h"
#include"cos.h"
voidsetv(void);
//系统初始化
voidinit_lcdport()
{
P5DIR|=0xff;
P3DIR|=BIT2;
P3DIR|=BIT3;
P3DIR|=BIT5;
return;
}
intmain()
{
WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
init_lcdport();
lcd_init();
initKey();
clr();
while
(1)
{
if(value==16)
{
clr();
lcd_display(5,"start");
value=0;
}
if(value==12)
{
clr();
lcd_display(5,"end");
//断电
value=0;
}
if(value==11)
{
clr();
value=0;
setv();
}
if(value==13)
{
clr();
value=0;
lcd_display(0x00,"thevoltageis:
");
adc
(1);
}
if(value==14)
{
clr();
value=0;
lcd_display(0x00,"thecurrentis:
");
adc(0);
}
if(value==15)
{
clr();
value=0;
lcd_display(5,"Cos=");
cos();
_EINT();
}
}
}
voidsetv()
{
P4DIR=0XFF;
P4SEL=0;
P4OUT=0x00;
for(inti=0;i<300;i++)
{
if(P4OUT&~(BIT1))
P4OUT|=BIT1;
else
P4OUT&=~(BIT1);
}
while
(1)
{
staticintm;
if(value<9)
{
clr();
m=value;
showsetv(m);
value=16;
}
if(value==9)
{
clr();
m=m+1;
showsetv(m);
value=16;
}
if(value==10)
{
clr();
m=m-1;
showsetv(m);
value=16;
}
if(value==12)
{
clr();
lcd_display(5,"EXIT");
//断电
value=0;
break;
}
}
}
电压设置程序:
#include
#defineuintunsignedint
#defineucharunsignedchar
//intss[]={duiyingdemaichong}
intbujin=0;
voidint_clk()
{
uchari;
BCSCTL1&=~XT2OFF;//打开XT振荡器
BCSCTL2|=SELM1+SELS;//MCLK8MandSMCLK1M
do
{
IFG1&=~OFIFG;//清除振荡错误标志
for(i=0;i<100;i++)
_NOP();//延时等待
}
while((IFG1&OFIFG)!
=0);//如果标志为1继续循环等待
IFG1&=~OFIFG;
}
voidint_pwm(inta)
{
staticintshuchu=0;
P4DIR=0XFF;
P4SEL=0;
if((a-shuchu)>0)
{
bujin=a-shuchu;
shuchu=a;
P4OUT=0x04;
//1v1ko=shixia
TACTL=TASSEL_2+TACLR;
TACCTL0|=CCIE;
TACCR0=8000;//PWM信号周期1kHz
TACTL|=MC_1;
}
if((shuchu-a)>0)
{
bujin=shuchu-a;
shuchu=a;
P4OUT=0x00;
//1v1ko=shixia
TACTL=TASSEL_2+TACLR;
TACCTL0|=CCIE;
TACCR0=8000;//PWM信号周期1kHz
TACTL|=MC_1;
}
}
voidpwmsetv(intm)
{
inta=m;
int_clk();//初始化时钟
int_pwm(a);//初始化PWM
//结束
}
voidshowsetv(intm)
{
lcd_display(5,"setVout:
");
uchartable1[]="Voutput:
";
lcd_display(18,table1);
lcd_display(28,"V");
lcd_showchar(26,keywords[3]);
lcd_showchar(27,keywords[m]);
pwmsetv(m);
}
#pragmavector=TIMERA0_VECTOR
__interruptvoidTimerA_ISR(void)
{
TACCTL0&=~CCIE;
TACTL|=MC_0;
if(P4OUT&~(BIT1))
P4OUT|=BIT1;
else
P4OUT&=~(BIT1);
staticintdex=0;
if(dex{dex=dex+1;
TACCTL0|=CCIE;
TACTL|=MC_1;
}
else
{
P4OUT&=~BIT3;
P4OUT|=BIT3;
P4OUT|=BIT1;
TACCTL0&=~CCIE;
TACTL|=MC_0;
dex=0;
}
for(inti=0;i<100;i++)
for(intj=0;j<10;j++);}