热度 20
2012-10-1 20:15
2676 次阅读|
5 个评论
Ø 空间向量PWM(SVPWM)是指一个三相功率变换器中六个功率三极管的一种功率开关电路,是变频技术的关键核心技术之一,应用非常广泛。三相交流电动机绕组产生的电流的谐波失真最小。它还提供了比正弦波调制方式更有效的供电电压的使用。目前SVPWM量控制方法是交流伺服电机和UPS电源应用最广泛的控制方法。本应用程序实例将为网友提供一个无刷直流马达SVPWM程序实例,希望起到抛砖引玉效应,可以充分了解如何使用事件管理器来实现SVPWM的应用方法。 实际量产产品应用对于 SVPWM 算法的推导、开关向量的选择也是是非常至关重要的关键。 Ø 无刷直流马达三相功率反相换流器原理结果图: 图中A1、B1、和C1是提供给电动机绕组的电压。六个功率三极管由DTPHx和我DTPHx_(x﹦a、b和c)控制。当上部的三极管导通时(DTPHx﹦1),下部的三极管关断(DTPHx﹦0)。这样通过上部三极管的开关状态(Q1和Q5)或者等效地说,DTPHx(x﹦a、b和c)的状态,就可以算出提供给电动机的电压Uout。 //文件名: DSP281xSVPwm.c // //DSP281x SVPWM波形产生程序,使用事件管理器A // // 该程序设置EVA定时器(TIMER1,TIMER2,TIMER13 and TIMER4) // 实现了SVPWM波形输出 #include 〝DSP281x_Device.h 〞 //DSP281x_Headerfile include file #include 〝DSP281x_examples.h 〞 //DSP281x_examples include file #include 〝stdio.h 〞 #include 〝math.h 〞 #include 〝float.h 〞 #define NX 404 #define PI 3.1415925 //全局变量 float M﹦0.8; int k0﹦0,h1﹦0; unsigned int n﹦0; float q,l,j; //在本例程中使用函数类型陈述 void zkb(); void int_eva(vold); interrupt void eva_T1UFINT_ISR(void); void main(void) { //系统初始化 initsysctrl(); //初始化GPAMUX EALLOW; // 使能PWM引脚 gpiomuxregs.GPAMUX.all ﹦0x00FF; // EVA PWM 1-6 引脚 EDIS; //禁止全局CPU中断 DINT; //初始化PIE控制寄存器 initpiectrl(); //初始化PIE控制向量表 initpievecttable(); eallow; //使能定时器1下益中断 pievecttable.T1UFINF﹦eva_T1UFINT_ISR; EDIS IER|﹦M_INT2; //开中断2 pievctr1regs.PIEIER2.bit.INTx6﹦1; //开下益中断 while (n﹦NX) { q﹦(n:+0.75) //为消除偶次谐波,减少谐波角度出发,选择从A相3/4周期进行采样 q﹦q*2*PI; q/﹦405; j﹦sin(q); 1﹦1875*(1+M*j); //M为调制比 if(1﹦3751﹦3375 //计算占空比表达式 a ﹦1; else { if(1﹦3375); a ﹦375; } n﹦n+1; } //初始化外设EVA init_eva(); //用户代码 Evaregs.T1CON.all﹦evaregs.T1CON.all|0x0040; //启动定时器1 for(;;) } vold init_eva() { ///初始化EVA evaregs.ACTRA.all﹦0x0666; evaregs.DBTCONA.all﹦0x0000; //禁止死区 evaregs.COMCONA.all﹦0xa600; //使能比较操作 //EVAIMRA(EVA的中断屏蔽寄存器A).T1UIINT(通用定时器1的下溢中断使能) evaregs.EVAIFRA.all﹦0x0200; evaregs.EVAIFRA.all﹦0x0000; evaregs.EVAIFRA.all﹦0x0000; //EVAIMRA(EVA的中断屏蔽寄存器.T1UIINT(通用定时器1的下溢中断使能) evaregs.EVAIFRA.all﹦0xffff; evaregs.EVAIFRB.all﹦0xffff; evaregs.EVAIFRC.all﹦0xffff; evaregs.CMPR1﹦0; evaregs.CMPR2﹦0; evaregs.CMPR3﹦0; evaregs.GPTCONA.all﹦0x0041; //周期必须大于最大的正弦表格值 evaregs.T1PR﹦3750; //timer1 period PWM 载波周期为65536个定标的定时器时钟周期 evaregs.T1CNT﹦937; //timer1计数器 evaregs.T1CON.all﹦0x0b4e; //选择模式产生PWM波10 EINT; return; } interrupt void eva_T1UFINT_ISR(void) //EVA下溢中断 { int h2; int flag; flag﹦(evaregs.EVAIFRA.all)0x0200; //T1UFINT中断标志位置1 if(flag!﹦0x0200) { EINT; return; } else { if(k0﹦NK) { h1﹦k0+135; //B相标表达式 if(h1﹦404)h1﹦h1-404; h2﹦k0+270; //C相标表达式 if(h2﹦404)h2﹦h2-404; evaregs.CMPR1﹦a ; evaregs.CMPR2﹦a ; //更新比较寄存器2的值 evaregs.CMPR3﹦a ; //更新比较寄存器3的值 k0﹦k0+1; } else { } evaregs.EVAIMRA.bit,T1UFINT﹦1 //清除中断屏蔽标志 evaregs.EVAIMRA.bit,T1UFINT﹦1 //清除中断使能标志 piectrlregs.PIEACK.all﹦0x0002; //响应同组中断 EINI; //开全局中断 } //﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦ //end //﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦ 更多精彩请点击下载附件【PWM波形空间向量图表】。。。