Ud和Uwn’的PWM波形只有±Ud/2两种电平。
当Uru>Uc时,给V1导通信号,给V4关断信号,Uun’=-Ud/2。
Uuv的波形可由Uun’-Uvn’得出,当1和6通时,Uuv=Ud,当3和4通时,Uuv=-Ud,当1和3或4和6通时,Uuv=0。
输出线电压PWM波由±Ud和0三种电平构成负载相电压PWM波由(±2/3)Ud,(±1/3)Ud和0共5种电平组成。
防直通的死区时间同一相上下两臂的驱动信号互补,为防止上下臂直通而造成短路,留一小段上下臂都施加关断信号的死区时间。
死区时间的长短主要由开关器件的关断时间决定。
死区时间会给输出的PWM波带来影响,使其稍稍偏离正弦波。
3.3抗干扰电路
本设计采用了光电隔离器,光电隔离器可以很简单将主回路的强电和控制回路的弱电相隔离,使主回路和控制回路更好的结合。
光电隔离器的电路示意图如图3.3所示。
3.4驱动电路
由于LM3S1138产生的SPWM信号不能直接驱动IGBT,故逆变桥的驱动采用专用芯片IR2110。
IR2110是一种双通道、栅极驱动、高压高速、单片式集成功率驱动模块,具有体积小(DIP14)、集成度高(可驱动同一桥臂两路)、响应快(典型ton/toff=120/94ns)、偏置电压高(<600V)、驱动能力强等特点,同时还具有外部保护封锁端口[12]。
IR2110采用CMOS工艺制作,逻辑电源电压范围为5V~20V,适应TTL或CMOS逻辑信号输入,具有独立的高端和低端2个输出通道。
由于逻辑信号均通过电平耦合电路连接到各自的通道上,容许逻辑电路参考地(VSS)与功率电路参考地(COM)之间有-5V~+5V的偏移量,并且能屏蔽小于50ns的脉冲,这些特点使得IR2110具有较理想的抗噪声效果。
采用CMOS施密特触发输入,可以进一步提高电路抗干扰能力[13]。
IR2110自身的保护功能非常完善:
对于低压侧通道,利用2片IR2110驱动全桥逆变电路的电路图如图3.4所示
图3.4全桥驱动电路
为改善PWM控制脉冲的前后沿陡度并防止振荡,减小IGBT集电极的电压尖脉冲,一般应在栅极串联十几欧到几百欧的限流电阻。
IR2110的最大不足是不能产生负偏压,由于密勒效应的作用,在开通与关断时,集电极与栅极间电容上的充放电电流很容易在栅极上产生干扰。
针对这一点,本文在驱动电路中的功率管栅极限流电阻R1、R2上反向并联了二极管D4、D5。
3.5逆变电路
逆变电路的作用是将直流电压转换成梯形脉冲波,经低通滤波器滤波后,从而使负载上得到的实际电压为正弦波,逆变电路是由4个IGBT管(VT1、VT2、VT3、VT4)组成的全桥式逆变电路组成,如图3.5所示。
图3.5逆变电路
4软件设计
软件设计是逆变控制电路设计的重要组成部分,它决定了逆变器输出的特性,如电压调节范围及稳定程度,理想的正弦波输出电压、保护功能的完善、可靠性等等。
逆变器程序主要分为SPWM脉宽调制部分,LCD12864显示部分,ADC转换部分,看门狗程序部分。
4.1 编程思路
本设计将一个周期T的信号分成720个点(按X轴等分),两点间的时间间隔由EasyRAM1138通过定时器中断产生。
因此,首先需建立正弦脉宽数据表,由EasyARM1138初始化时算好,将其按一定的格式(即考虑相序及同一相中的脉宽次序等)存入片内的FLASH中,建立好数据指针,以便按一定的寻址方式查询。
SPWM实际上就是用一组经过调制的幅值相等、宽度不等的脉冲信号代替调制信号,用开关量代替模拟量。
调制后的信号中除了含有调制信号外,还含有频率很高的载波频率及载波倍频附近的频率分量,但几乎不含其他谐波,特别是接近基波的低次谐波。
因此载波频率也即SPWM的开关频率越高,谐波含量越少。
这从SPWM的原理可以直观地看出。
当载波频率高时,半周期内开关次数越多,把期望的正弦波分段也越多,SPWM的基波就越接近期望的正弦波[14]。
但是,SPWM的载波频率除了受功率器件的允许开关频率制约外,SPWM的开关频率也不宜过高,这是因为开关器件工作频率提高,开关损耗和换流损耗会随之增加。
另外,开关瞬间电压或电流的急剧变化形成很大的du/dt或di/dt,会产生强的电磁干扰;高du/dt、di/dt还会在线路和器件的分布电容和电感上引起冲击电流和尖峰电压;这些也会因频率提高而变得严重。
综上所述,SPWM的开关频率的选择应综合考虑各个方面的因素,本设计实际采用的SPWM开关频率,也即IGBT的开关频率为18MHz,这是一个折中的选择。
设置EasyARM的频率为6MHz,分频后为20MHz。
0-180度由定时器TIMER0的TIMA(对应的为CPP1)输出0有效,180-360由TIMER1的TIMB(对应的为CPP3)输出0有效,两脚轮流输出脉宽调制的正弦半波。
图4.1正弦波脉冲宽度调制波形示意图
关于载波频率和调制波频率的计算:
EasyARM的时钟频率20MHz,一个机器周期为0.5us,载波频率为8KHz~90KHz之间,将一个输出周期T的信号分成1440个点(按X轴等分),两点间的时间间隔由EasyARM的定时器通过计数中断实现,由于EasyARM的内部定时器有PWM的设置,通过在程序中设置定时器的计数值来控制频率,同过设置占空的的计数值来调整脉冲的占空比,这样就保证了输出方波的脉冲宽度按正弦规律变化。
逆变后的方波经滤波后可以得到纯正弦波脉冲,调制频率为14.4KHz~1440KHz,一个周期分为1440个调制脉宽,每个周期时间为:
1440*(1/14.4KHz~1/144KHz)=0.1s~0.01(s),使输出频率为10~100Hz。
表4-1正弦脉冲的度数与计数值之间的一个换算表(部分)
4.2流程图
首先对程序进行初始化,初始化之后程序就进入了中断,连续读取720个PWM的匹配值产生0-180度的SPWM。
之后关闭此定时器和中断,并打开TIMER0和它的定时中断,同样的连续读取720个PWM的匹配值产生180-360度的SPWM。
主程序中,在while
(1)中不断的扫描按键。
通过判断是KEY1还是KEY2按下来提高和降低频率。
正弦波频率的改变范围是10~100Hz。
SPWM调制程序流程图如图4.3所示:
图4.3SPWM调制程序流程图
5仿真
SPWM控制方式下的三相逆变电路主电路如图5.1所示:
图5.1三相逆变电路主电路
设置参数,即将调制度m设置为0.9,调制波频率设为50Hz,载波频率设为基波的30倍(载波比N=30),即1500Hz,仿真时间设为0.04s,在powergui中设置为离散仿真模式,采样时间设为1e-006s,运行仿真图形,然后建立m文件,程序如下所示:
subplot(3,1,1);
plot(inv.time,inv.signals
(1).values);
title(Uab'线电压波形');
subplot(3,1,2);
plot(inv.time,inv.signals
(2).values);
title('A相输出电压Ua波形');
subplot(3,1,3);
plot(inv.time,inv.signals(3).values);
axis([00.04-300300]);
title('A相输出电流波形');
运行此文件后,可得输出交流电压,交流电流和直流电流如图5.2所示:
图5.2SPWM方式下的三相逆变电路输出波形
分析上图可知,输出线电压PWM波由±Ud和0三种电平构成负载相电压PWM波由(±2/3)Ud、(±1/3)Ud和0共5种电平组成。
利用MATLAB提供的powergui模块,对上图中的输出相电压
和输出电流
进行FFT分析,得图5.3、图5.4所示结果:
图5.3SPWM控制方式三相逆变电路输出相电压
的FFT分析
图5.4SPWM控制方式三相逆变电路输出电流
的FFT分析
由图5.3可知:
在
=300V,m=0.9,
=1500Hz,
=50Hz,即N=30时,输出相电压的基波电压的基波幅值为
=134.7V,谐波分布中最高的为28和32次谐波,考虑最高频率为4500Hz时的THD达到79.74%。
由图5.4可知:
考虑最高频率为4500Hz时的THD=5.15%,输出电流近似为正弦波。
6心得体会
两个周的运动控制课程设计—三相电压型SPWM逆变器设计就要结束了,虽然课程设计的时间比较短,但我却收获了很多值得总结和值得我铭记于心的知识和认识。
开始课程设计的时候,由于我们学的都是一些嵌入式方面的理论知识,牵涉到实际的我们几乎一无所知,所以我们组的成员都不知道该怎么入手,我们通过请教老师,以及上网查询等通道,终于顺利的完成数据采样系统的各方面设计。
这样一个过程使我的理论知识得到了试验和应用,使我的理论知识得到了进一步的提高。
总之,这次课程设计不但让我学到了很多的东西,提高和巩固了单片机、matlab等方面的知识,同时也增强了我的动手能力,这些并不是在课堂上可以学到的,而且这也是难得的一次同学间长时间交流沟通的机会,在课程实际过程中发生许多欢乐的令人难忘的事,这无疑为以后的我留下了一个美好的回忆。
在完成运动控制课程设计后,我发现我还有许多不足,所学到的知识还远远不够,单片机的应用是如此的广泛,在以后的时间里我将继续对单片机方面的知识的学习。
最后,感谢老师在课程设计中给予的帮助,以及组员们的合作!
7参考文献
[1]刘凤君.正弦波逆变器[M].北京:
科学出版社,2002.
[2]李爱文,张承慧.现代逆变技术及其应用[M].北京:
科学出版社,2000.
[3]谢力华,苏彦民.正弦波逆变电源的数字控制技术.电力电子技术[J],2001[4]孟元东,娄承芝.基于dsPIC30F1010高频正弦波逆变器的研究,电力电子技术[J],2007
[5]罗泠,周永鹏等.DSP控制400Hz中频在线式不间断电源的研究,电力电子技术[J],
[6]苏玉刚等.电力电子技术[M].重庆:
重庆大学出版社,2003.
[7]张燕宾.SPWM变频调速应用技术.北京:
机械工业出版社,2005.
[8]廖东初,聂汉平.电力电子技术.湖北:
华中科技大学出版社,2007
[9]王兆安,黄俊.电力电子技术.北京:
机械工业出版社,2005
[10]阮毅,陈维均.运动控制技术北京:
清华大学出版社,2006
附录
1程序清单
#include"Fre.H"
#include"select.h"
#include//Stellaris系列芯片的内存地址映射表
#include//芯片通用类型的宏指令与类型定义
#include//芯片系统驱动控制模型定义
#include//芯片通用标准输入输出定义
#include//芯片启动模数转换的时所用的宏指令
#include//芯片用于模数转换驱动时头指令
#include//芯片用于中断分配的头指令
#include//芯片的终端控制模型定义
#include"watchdog.h"
#include"hw_watchdog.h"
#include"LED.H"
#defineSysCtlPeriEnableSysCtlPeripheralEnable//外围设备的使能
#defineSysCtlPeriDisableSysCtlPeripheralDisable//外围设备的不使能#defineGPIOPinTypeInGPIOPinTypeGPIOInput//标准输入输出的针类型
#defineGPIOPinTypeOutGPIOPinTypeGPIOOutput
#defineGPIOPinTypeODGPIOPinTypeGPIOOutputOD
#defineWdogStallEnableWatchdogStallEnable
#defineWdogReloadSetWatchdogReloadSet
#defineWdogIntEnableWatchdogIntEnable
#defineWdogIntClearWatchdogIntClear
#defineucharunsignedchar
unsignedlongTheSysClock=12000000UL;
voidADC_Init()
{
SysCtlPeriEnable(SYSCTL_PERIPH_ADC);//使能ADC模块
SysCtlADCSpeedSet(SYSCTL_ADCSPEED_125KSPS);//设置ADC采样率
ADCSequenceDisable(ADC_BASE,0);//禁止采样序列
ADCSequenceConfigure(ADC_BASE,//采样序列配置0,//采样序列编号
ADC_TRIGGER_PROCESSOR,//由处理器触发
0);//设置优先级
ADCSequenceStepConfigure(ADC_BASE,//采样步进设置
0,//采样序列编号
0,//设置步进
ADC_CTL_END|ADC_CTL_CH0);//通道设置从ADC0口读入数据
ADCSequenceEnable(ADC_BASE,0);//使能采样序列
}
voidwdogInit(void)
{
SysCtlPeriEnable(SYSCTL_PERIPH_WDOG);//使能看门狗模块WdogStallEnable(WATCHDOG_BASE);//使能调试器暂停看门狗计数WdogReloadSet(WATCHDOG_BASE,3000000UL);//设置看门狗值WdogIntEnable(WATCHDOG_BASE);//使能看门狗中断IntEnable(INT_WATCHDOG);//使能看门狗模块中断IntMasterEnable();//使能处理器中断
}
voidWatchdog_Timer_ISR(void)
{
WdogIntClear(WATCHDOG_BASE);//清除看门狗中断状态LED_Toggle(LED1);//反转LED
}
voidSystemInit(void)
{
SysCtlLDOSet(SYSCTL_LDO_2_75V);//配置PLL前须将LDO电压设置为2.75VAD转换必须的电压设置
SysCtlClockSet(SYSCTL_USE_PLL|//系统时钟设置,采用PLL
SYSCTL_OSC_MAIN|//主振荡器
SYSCTL_XTAL_6MHZ|//外接6MHz晶振
SYSCTL_SYSDIV_10);//分频结果为20MHz
TheSysClock=SysCtlClockGet();//获取系统时钟,单位:
Hz
GPIOD_Init();//通用输入输出端口D的初始化
GPIOG_Init();//通用输入输出端口G的初始化
FreInit();
ADC_Init();//数模转换模块的初始化
LED_Init(LED1);//初始化LED1灯
Lcminit();//液晶显示初始化
GPIOPinIntEnable(GPIO_PORTD_BASE,GPIO_PIN_1);//使能GPIOD的1号管脚中断
GPIOPinIntEnable(GPIO_PORTG_BASE,GPIO_PIN_5);//使能GPIOG的5号管脚中断
GPIOIntTypeSet(GPIO_PORTD_BASE,GPIO_PIN_1,GPIO_LOW_LEVEL);//GPIOD的1号管脚下降沿时产生中断信号
GPIOIntTypeSet(GPIO_PORTG_BASE,GPIO_PIN_5,GPIO_LOW_LEVEL);//GPIOG的5号管脚下降沿时产生中断信号
IntEnable(INT_GPIOD);//开GPIOD中断
IntEnable(INT_GPIOG);//开GPIOG中断
wdogInit();//看门狗初始化
IntMasterEnable();//开处理器中断
}
intmain(void)
{
SystemInit();//系统初始化
select();
unsignedlongulVal=0x00;//用来保存转换后的数字量
ucharVal;
while
(1)
{
ADCProcessorTrigger(ADC_BASE,0);//触发样本序列
while(HWREG(ADC_BASE+ADC_O_X_SSFSTAT)&0x00000100);//等待样本序列采集完成
ADCSequenceDataGet(ADC_BASE,0,&ulVal);//获取采集的结果ulVal=((ulVal*3000)/1024)/1000;//将结果进行转换单位mVVal=(uchar)ulVal;
vWrite8x16String("Thisisadis-",0,8,0);//写字符串
vWrite8x16String("playprogram.",2,8,0);
vWrite8x16String("Thecurrentv-",4,8,0);
//vWrite8x16String("oltageis:
4",6,8,0);
if(ulVal<1&&ulVal>=0)
{
vWrite8x16String("ol