三相交流电源
三相逆变电源
摘要:本单相正弦波逆变电源的设计,以?18V直流电源作为输入,输出为36V、50Hz的标准正弦波交流电。该电源采用推挽升压和全桥逆变两级变换,在控制电路上,前级推挽升压电路采用MC34063芯片控制,闭环反馈;逆变部分采用驱动芯片IR2103进行全桥逆变,采用ARM完成SPWM的调制,后级输出采用电流互感器进行采样反馈,形成双重反馈环节,增加了电源的稳定性;在保护上,具有输出过载、短路保护、过流保护、空载保护等多重保护功能电路,增强了该电源的可靠性和安全性;输出交流电压通过全波精密整流成近似直流,再由STC89C52单片机的控制进行模数转换,最终将电压值显示到液晶12864上,形成了良好的人机界面。该电源设计任务大部分完成了各项指标。
关键词:单相正弦波逆变 DC-DC DC-AC SPWM 测量显示
引言
目前逆变电源应用广泛,但是电路复杂,价格比较昂贵,为此设计一款逆变电源。该电源主要应用开关电源电路技术的有关知识,涉及模拟集成电路、电源集成电路、直流稳压电路、开关稳压电路等原理,充分运用SPWM频率脉冲宽度调制电路[1]和场效应管[2](N沟道增强型MOSFET)的开关速度快、无二次击穿、热稳定性好的优点与二极管一起构成的组合设计电路。
该逆变电源可将电瓶的18V直流电转换为220V/50Hz的交流电,供数码相机、CD机、MD唱机、笔记本电脑、小型录像机、电动剃须刀、手机等便携式产品使用。因此具有相当强的通用性。
1.系统设计
1.1设计要求
(1)?18V直流电源供电
(2)输出36V / 1A三相交流电源
(3)带负载能力:功率因数0.8 ~ 1感性负载
(4)测量并显示:电压、电流、频率、有功功率、无功功率、功率因数等,测量精度0.1%。
1.2总体设计
1.2.1设计思路
题目要求设计一个三相逆变电源,输出电压波形为正弦波。设计中主电路采用电气隔离、DC-DC-AC的技术,控制部分采用SPWM(正弦脉宽调制)技术,利用对逆变原件电力MOSFET的驱动脉冲控制,使输出获得交流正弦波的稳压电源。
系统框图:
2.方案论述
2.1 DC-DC升压电路设计
本次设计中,提供的直流源是正负18V,而逆变后输出电压的有效值要求是36V,所以必须把18V升压到36V以上,才能满足要求。
MC34063本身包含了DC,DC变换器所需要的主要功能的单片控制电路且价格便宜。它由具有温度自动补偿功能的基准电压发生器、比较器、占空比可控的振荡器,R—S触发器和大电流输出开关电路等组成。该器件可用于升压变换器、降压变换器、反向器的控制核心,由它构成的DC,DC变换器仅用少量的外部元器件,易于实现,所以本方案采用MC34063芯片来搭建升压电路。
MC34063组成的降压电路原理如下图,当芯片内开关管(T1)导通时,电源经取样电阻Rsc、
电感L1、MC34063的1脚和2脚接地,此时电感L1开始存储能量,而由C0对负载提供能量。当T1断开时,电源和电感同时给负载和电容Co提供能量。电感在释放能量期间,由于其两端的电动势极性与电源极性相同,相当于两个电源串联,因而负载上得到的电压高于电源电压。开关管导通与关断的频率称为芯片的工作频率。只要此频率相对负载的时间常数足够高,负载上便可获得连续的直流电压。
其中,输入电压与输出电压的关系为:
Uo=(1+R2/R1)*Ui
2.2逆变电源
2.2.1基本构成
本设计基于IR2103驱动全桥来实现DC/AC逆变,所用元件少,且结构更为简便。IR2103芯片是IR公司专为驱动功率开关管而设计的,是一种高电压高速的功率MOSFET和IGBT驱动器,尤其适用于驱动高强度的放电HID灯,如高压钠灯和金卤灯等。
该逆变设计电路的方框图如图1。该电路由18V直流输入、DC/DC升压电路、SPWM波驱动电路、逆变电路以及滤波电路组成。
图1
2.2.2电路工作原理
输入12V直流电源电压,经然后经过逆变得到交流电。在逆变电路中是用单片机产生
SPWM脉冲频率波形,作为各开光管的驱动。在每项中,在前半周期和后半周期,各开关管交替导通,使得负载电压极性有变化,上述状态如能不断地反复交替进行,则负载上的电压为交变电压。这就是由直流电变为交流的逆变过程。三相逆变的电路结构其工作过程与单相逆变桥相同,只要注意三相的相位之间互差三分之一周期就可以了。逆变器的输出波形是SPWM方波,含有谐波成份,为了使输出波形正弦化,必须采用输出滤波器。输出滤波器的任务是使单次谐波和总谐波含量降低到指标允许的范围,其结构和容量取决于谐波含量的大小。电力电子器件高频化频率改善了三相逆变器的许多特性但是高频化同时带来了一系列其他的问题,比如过高的dv,dt容易使感性负载的分布电容的作用不容忽视,从而导致整个系统的电磁兼容性变差。如果在没有任何滤波器的情况下,直接由SPW},I电压波驱动负载,那么与载波成整数倍的谐波会进入负载,从而对后级系统造成一些不良影响,严重甚至会损坏后级的系统。如果在SP删逆变器和负载之间加入低通滤波器,即通常的Lc滤波器,则某些高次谐波电压将被抑制。进行滤波处理,最后得到基波为主要部分,就可得出三相交流电。 陷波滤波器由Lc电路构成,它实际上是一种带阻滤波器,主要作用是防止开关频率附近的谐波进入负载,从而造成电流脉动和控制系统不稳定。所以它的转折频率与载波频率有密切的关系通常选择与开关频率一致。像这样把陷波滤波器和低通滤波器串联,就会得到非常好的滤波效果。首先,陷波滤波器消除了开关频率处谐波,接着低通滤波器进一步滤除其它高次谐波。这样一种滤波方式,同时可以降低低通滤波器转折频率过低要求和相应地提高阻尼电阻。
2.2.3场效应管
场效应管是一种适应开关电源小型化、高效率化和高可靠性要求的理想器件。它是利用电场效应来控制其电流大小的半导体器件[3]。其代表符号如图5。这种器件不仅兼有开关速度快、无存储时间、体积小、重量轻、耗电省、寿命长等特点,而且还有输入阻抗高、噪声低、热稳定性好、抗辐射能力强和制造工艺简单等优点,因此大大的扩展了它的应用范围,特别是在大规模和超大规模集成电路中得到了广泛的应用。MOSFET开关较快而无存储时间,故在较高工作频率下开关损耗较小,另外所需的开关驱动功率小,降低了电路的复杂性。本设计采用的是N沟道增强型MOSFET。只有在正的漏极电源的作用下,在栅源之间加上正向电压(栅极接正,源极接负),才能使该场效应管导通。当>0时才有能有电流即漏极电流产生。即当时MOS管才导通。电路中主要运用三极管的导通截止的开关特性。 2.3精密全波整流电路
全波精密整流电路如图
从左到右看电路图,在第一个运放NE5532的作用是一个比例运算放大器,主要就是想把输入的信号缩小成1/2倍,要求R6=2R7,R5=R6*R7/(R6+R7),输出的Uo=-R7*Ui/R6。
图中第二个运放NE5532作用就是精密全波整流,要求R1=2R2=2R3,增益为1/2,输入的正弦波,当UI>0时,波形没有改变方向;当UI<0时,波形就把其往上翻,使其同正向波形方向一样,从而得到精密的全波整流电路,最后全波整流得到的波形幅值为输入的1/2。
C1与C2构成电容滤波电路。
2.4 SPWM波生成
方案一:用模拟电路构成三角波载波和正弦调制波发生电路,用比较器来确定它们
的交点,在交点时刻对功率开关器件的通断进行控制,就可以生成SPWM波形。但这种
模拟电路结构复杂,难以实现精确的控制。
方案二:微机控制技术的发展使得用软件生成SPWM波形变得比较容易,有自然采
样法,规则采样法,低次谐波消去法,面积中心等效法等,微处理器可以用DSP,ARM,
MSP430等有PWM模块的MCU。
由以上分析知,采用软件生成法,既方案二比较容易实现,而使用DSP成本较高,
切手上又有一块现成的ARM7,所以本次设计选用了ARM7系列的LPC2138来生成SPWM
波。SPWM波的具体生成方法如下:
PWM(Pulse Width Modulation)控制就是对脉冲的宽度进行调制的技术,即通过对一系
列脉冲的宽度进行调制,来等效地获得所需要波形。SPWM波形(Sinusoidal PWM)就是脉
冲的宽度按正弦规律变化而和正弦波等效的PWM波形。产生SPWM波的原理是:用一
组等腰三角波与一个正弦波进行比较,其相交的时刻(即交点)作为开关管“开”或“关”
的时刻,这组等腰三角形波称为载波,而正弦波称为调制波,如图1所示。正弦波的频
率和幅值是可控制的,改变正弦波的频率,就可以改变电源输出电压的频率,改变正弦
波的幅值,也就改变了正弦波与载波的交点,使输出脉冲系列的宽度发生变化,从而改
变电源输出电压的大小。
而LPC2138的PWM模块有PWMMR0~PWMMR6这7个匹配寄存器,可实现6个单边沿控制或三个双边沿控制PWM输出。三相逆变桥需要6路SPWM波驱动,可由ARM7产生3路,其余3路以及死区控制由驱动电路产生。算法分析:通过实时计算生成电压SPWM需要数学模型,建立数学模型的方法有多种,比如谐波消去法、等面积法、采样型SPWM法以及它们派生出来的各种方法。本文介绍的生成SPWM波采用的是对称规则采样法。对称规则采样法包括两种,规则I法和规则?法。规则I法为三角波顶点采样法,规则?法为底点采样法。这里使用的是规则II法,如图:
在规则采样?法中,三角波每个周期的采样时刻都是确定的,不作图就可算出相应时
刻的正弦波值。由几何相似三角形关系可得脉宽计算公式:
间歇时间:
式中M=U M/U S,即正弦波峰值与三角波峰值之比,M称为调
。N=fc/f即三角波频率fc与正弦波频率f之比,N称为载波比。k为采样带点(k:0,1,2,3??)。以上是生成单相SPWM波的数学模型,要生成三相SPWM波,必须使用三条正弦波和同一条三角波求交点,三相正弦波依次相差120。,所以在采样时三相的脉宽分别是:
3.ADC0809的控制程序的设计
ADC0809是M美国国家半导体公司生产的CMOS工艺8通道,8位逐次逼近式A/D转换器。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。是目前国内应用最广泛的8位通用A/D芯片。
ADC0809的工作过程:首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A,D转换,之后EOC输出信号变低,指示转换正在进行。直到A,D转换完成,EOC变为高电平,指示A,D转换结束,结果数据已存入锁存器,这个信号可用作中断
。当OE输入高电平 时,输出三态门打开,转换结果的数字量输出到数据总线上。
转换数据的传送 A/D转换后得到的数据应及时传送给单片机进行处理。数据传送的关键问题是如何确认A/D转换的完成,因为只有确认完成后,才能进行传送。ADC0832的接线图比较简单,将D0~D7接单片机的P1口,CLK接外部时ST=P3.4,EOC=P3.5,OEP接P3.6。通道选择C=P2.0,B=P3.7,A=P2.7。INT0和INT1分别为电压测量输入通道0和电流测量输入通道1。
4.液晶显示驱动的设计
开发仿真软件使用Keil uVision3,C语言编程。采用YJD12864C—1(汉字图形点阵液晶显示模块),可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM),显示
为128列×64行。该模块有并行和串行两种连接方法,在本设计中采用并行连接方法。该部分利用STC89C52单片机来控制液晶显示,显示输出电压。
5.附录
5.1 MC34063的引脚图如下:
5.2 LC滤波电路
电路如图3所示
图3 LC滤波电路 5.3 逆变电源总电路
电路图如图2所示
5.4 ADC0809引脚图如下:
ADC0809128INT3INT2227INT4INT1326INT5INT0425INT6A524INT7B623STC722EOCALE821D3D7920OED61019CLKD51118VCCD41217VREF+D01316GNDVREF-1415D1D2
ADC0832工作时序图如图所示
5.5 PWM波程序
图:
开始开始
PLL初始化改变匹配值
确定PWMMR0
计数到N,
Y
计算全部脉冲脉宽
计数器清零N
PWM初始化
匹配锁存
等待匹配中断通知中断结束
主函数流程图 匹配中断函数流程图
5.6程序流程图如图所示。
开始
外部中断和定
时器初始化
初始化LCD和
ADC0809
对AD采样和
频率的测量
按键控制电压电流
功率频率的显示
5.7程序清单 结束(一)SPWM波程序
#include "config.h" #include "math.h"
#define pi 3.1415926 #define N 200
int i=0;
float TEMP,TEMP1,TEMP2; int MR1[N],MR3[N],MR5[N]; void __irq PWMCaculate(void)
{
PWMMR1=MR1[i];
PWMMR3=MR3[i];
PWMMR5=MR5[i];
i++;
if(i>=N)
i=0;
PWMLER=0x7F;
VICVectAddr=0x00;
}
void Pwm_Init(void)
{ PINSEL0=(2<<2)|(2<<0);
PINSEL1=(1<<10);
PWMTCR=0x02;
PWMPR=0x00;
PWMMCR=0x03;
PWMPCR=(0<<0)|
(0<<3)|
(0<<5)|
(1<<9)|
(1<<11)|
(1<<13);
PWMMR0=Fpclk/12000;
PWMLER=0x7F;
PWMTCR=0x09;
RQEnable();
VICIntSelect=0x00;
VICVectCntl0=0x20|8;
VICVectAddr0=(uint32)PWMCaculate;
VICIntEnable=1<<8;
}
void Init_VPB_PLL(void)
{
//Fosc = 11.0592MHz
//Fcclk = 11.0592*6 = 66.3552MHz
//Fcco = 66.3552*2*P =265.4208MHz
//Fpclk =16.5888MHz
// 配置VPB分频器相关寄存器
VPBDIV = 0x00; // Fcclk * 1/4
//配置PLL锁相环相关寄存器
PLLCON = 0x01; // PLLE=1 PLL使能 但PLL未连接 PLLCFG = 0x26; // 0 01 00111 分频器值(P=2) 倍增器值(M=7)
PLLFEED = 0xAA;// 0xAA 和0x55,为固定数据,写入以后。配置才会生效。
PLLFEED = 0x55;
while((PLLSTAT&(1<<10))==0);
PLLCON = 0x03; //PLLE=1 PLLC=1 PLL使能并连接
PLLFEED = 0xAA;
PLLFEED = 0x55;
}
int main()
{ int k=0;
Init_VPB_PLL();
PWMMR0=Fpclk/12000;
while(k
#include
#include
#define uchar unsigned char #define uint unsigned int
sbit key1=P3^0; //定义按键位置
sbit key2=P3^1;
sbit key3=P3^2;
sbit ADC0809_ST=P3^4; //定义采样控制口
sbit ADC0809_EOC=P3^5;
sbit ADC0809_OE=P3^6;
sbit C=P2^0; //定义采样通道定义
sbit B1=P3^7;
sbit A=P2^7;
sbit RS=P2^4; //定义LCD显示控制口
sbit RW=P2^5;
sbit E=P2^6;
long int k,z=100,counter1=0; long int sum1=0,sum2=0; //定义采样求和
float counter2=0,tmp=0;
float u1=0,i1=0,w=0,w1=0,w2=0; //定义三相电压电流功率频率
void delayms(uint z) //延时 z ms
{uint i;
uchar j;
for(i=z;i>0;i--)
for(j=110;j>0;j--); }
void delay(uint i) //延时
{
while(i--);
}
void zhiling(uchar a) //LCD12864写命令 {
E=0;RS=0;RW=0;
E=1;
P0=a;
delayms(2); //延时 5ms
E=0;
delayms(2); //延时 5ms }
void shuju(uchar b) //LCD12864写数据 {E=0;RS=1;RW=0;
E=1;
P0=b;
delayms(2); //延时 5ms
E=0;
delayms(2); //延时 5ms }
void lcd_init() //LCD12864初始化 {zhiling(0x01); //清屏
zhiling(0x30); //功能设置
zhiling(0x0e); //开/关显示设置
zhiling(0x06); //输入方式设置
zhiling(0x14); //光标右移
}
void writestring( char *str)//LCD12864写字符
{int i=0;
while(str[i]!='\0')
{shuju(str[i++]);
}
}
void writedata(long int d)//LCD12864写数字
{ uint shi,ge,shifen,baifen,qianfen;
shi=(uint)(d/10000);
ge=(uint)(d%10000/1000);
shifen=(uint)(d%1000/100);
baifen=(uint)(d%100/10);
qianfen=(uint)(d%10);
if(shi)
shuju(shi+'0');
shuju(ge+'0');
writestring(".");
shuju(shifen+'0');
shuju(baifen+'0');
shuju(qianfen+'0');
}
void writedata1(float d)//写频率数字
{ uint qian,bai,shi,ge,shifen,baifen,qianfen;
qian=(uint)d/1000;
bai=(uint)(d/100)%10;
shi=(uint)(d/10)%10;
ge=(uint)d%10;
shifen=(uint)((d-(uint)d)*10)%10;
baifen=(uint)((d-(uint)d)*100)%10;
qianfen=(uint)((d-(uint)d)*1000)%10;
if(qian)
shuju(qian+'0');
if(qian||bai)
shuju(bai+'0');
if(qian||bai||shi)
shuju(shi+'0');
shuju(ge+'0');
writestring(".");
shuju(shifen+'0');
shuju(baifen+'0');
shuju(qianfen+'0');
}
void dianyaxianshi()
{
zhiling(0x80);
writestring("电压测量");
zhiling(0x90);
writestring("1 相U=");writedata(u1);
zhiling(0x97);writestring("V");
zhiling(0x88);
writestring("2 相U= ");//writedata(u1);
zhiling(0x8F);writestring("V");
zhiling(0x98);
writestring("3 相U=");//writedata(u1);
zhiling(0x9F);writestring("V"); }
void dianliuxianshi()
{
zhiling(0x80);
writestring("电流测量");
zhiling(0x90);
writestring("1 相I=");writedata(i1);
zhiling(0x97);writestring("A");
zhiling(0x88);
writestring("2 相I=");//writedata(i1);
zhiling(0x8F);writestring("A");
zhiling(0x98);
writestring("3 相I=");//writedata(i1);
zhiling(0x9F);writestring("A"); }
void gonglvxianshi()
{
zhiling(0x80);
writestring("频率=");writedata1(counter2);
zhiling(0x87);writestring("Hz");
zhiling(0x90);
writestring("有功W=");
zhiling(0x97);writestring("w");
zhiling(0x88);
writestring("无功W=");
zhiling(0x8F);writestring("w");
zhiling(0x98);
writestring("功率因素=");
}
long int ADC0809caiyang1(uint q) // 通道1采样
{ long int i1;
long int getdata1;
P1=0xff;
ADC0809_ST=0;
C=0;
B1=0;
A=q;
delay(10);
ADC0809_ST=1;
delay(10);
ADC0809_ST=0;
delay(10);
while(ADC0809_EOC==0);
ADC0809_OE=1;
getdata1=P1; //初始二进制采样值
ADC0809_OE=0;
i1=getdata1*5000/256;
return i1;
}
void Init_Timer(void) //定义定时器
{
TMOD=0x11; //使用模式1,16位定时器
TH0=0x3c;TL0=0xaf; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢
出
TH1=(65536-10000)/256;TL1=(65536-10000)%256;
EA=1; //总中断打开
EX1=1; //允许外部中断INT1
IT1=1; //选择外部中断边沿触发方式
ET0=1;ET1=1; //定时器中断打开
TR0=1;TR1=1; //定时器开关打开 }
void main()
{
z=100;
Init_Timer();
lcd_init();
dianyaxianshi();
while(1)
{
if(!key1)
k=1;// 按下1相应的键显示三相电压
if(!key2)
k=2;// 按下3相应的键显示三相电流
if(!key3)
k=3;// 按下4相应的键显示功率与频率
switch(k)
{case 1:lcd_init();
dianyaxianshi();delayms(1000);break;//k=1 按下3相应的键显示三相电压
case 2:lcd_init();
dianliuxianshi();delayms(1000);break;//k=2 按下7相应的键显示三相电流
case 3:lcd_init();
gonglvxianshi();delayms(1000);break;//k3 按下11相应的键显示功率与频率
default:break;
}
}
}
//外部中断0中断程序
void INT_1(void) interrupt 2 {
tmp++;//外部中断计数
}
//定时器0中断程序
void time0_int() interrupt 1 {
TH0=0x3c;
TL0=0xaf;
counter1++; //每50ms加1
if(counter1==25)//定时器定时50ms,故50次中断就表示1.25秒钟到达
{EX1=0;
TR0=0;
counter2=(tmp/1.25);
tmp=0;
counter1=0;
EX1=1;
TR0=1;
}
}
void time1_int() interrupt 3
{TH1=(65536-10000)/256;TL1=(65536-10000)%256;
sum2=sum2+ADC0809caiyang1(1);//通道2连续采样100次
sum1=sum1+ADC0809caiyang1(0);//通道1连续采样100次
z--;
if(z==0)
{
z=100;
u1=(float)sum1/10.0;
i1=(float)sum2/100.0; //求100次平均值
w =u1*i1; //功率
sum1=0;
sum2=0;
}
}