基于dsp28335产生svpwm
- 格式:docx
- 大小:13.43 KB
- 文档页数:3
关于SVPWM已经有很多介绍资料和源代码了,但配合源代码的资料可谓少之又少。
这份文档结合了作者的调试经验,教大家如何在28335上搭建SVPWM,早日从理论转向实践。
关于SVPWM:
这里不对SVPWM的原理作过多的阐述,因为原理资料太多,随便找一个看看即可。
我们对SVPWM波
形的产生,其实主要要解决下面几个问题:
1. 旋转角
旋转角顾名思义就是电压相量当前的旋转角度。
在实际过程中其实就是一个增进量,但这个增进量是
多少呢?我们可以设定一个开关频率,一般是定值,例如开关频率10kHz,当前频率除以开关频率即
得到当前角度的标么值。
当前标么值乘以2PI,就是当前的旋转角度。
函数体如下:
theta+=2*PI*当前频率/开关频率;
if(theta>2*PI) theta-=2*PI;
else if (theta<-2*PI) theta+=2*PI;
2. 调制深度M。
根据SVPWM的计算, 直流母线电压Ed=sqrt(2)*Uin, 又调制参数Ed’=sqrt(3)*Ed/2,
因此M=Us/(sqrt(3/2)*Uin)。
其中Uin为输入线电压值,Us为当前需输出的线电压值。
因为实测的
一般为直流母线电压,所以M=2*Us/(sqrt(3)*Ed)函数体如下:
M=Us/(0.866*Ed);
3. Ualpha,Ubeta:
前两个参数出来后,Ualpha,Ubeta即:函数体
Ualpha=M*cos(theta), Ubeta=M*sin(theta)
4. 扇区的判定:函数体:
A=Ubeta;
B=-0.5*Ubeta+0.866*Ualpha;
C=-0.5Ubeta-0.866Ualpha;
if(A>0) sector=1;
if(B>0) sector+=2;
if(C>0) sector+=4;
这个结构就是sector=4C+2B+A
5. 扇区内T的计算:函数体
X=Ubeta;
Y=0.5*Ubeta+0.866*Ualpha;
Z=0.5-0.855*Ualpha;
//注意:上面计算出来的sector其实是N,真正的扇区与N有对应关系
If(sector==1)
{t1=Z;
t2=Y;
Tb=0.5*(1-t1-t2);
Ta=Tb+t1;
Tc=Ta+t2;
}
else if (Sector==2)
{
t1 = Y;
t2 = -X;
v->Ta = 0.5*(1-t1-t2);
v->Tc = v->Ta+t1;
v->Tb = v->Tc+t2;
}
else if (Sector==3)
{
t1 = -Z;
t2 = X;
v->Ta = 0.5*(1-t1-t2);
v->Tb = v->Ta+t1;
v->Tc = v->Tb+t2;
}
else if (Sector==4)
{
t1 = -X;
t2 = Z;
v->Tc = 0.5*(1-t1-t2);
v->Tb = v->Tc+t1;
v->Ta = v->Tb+t2;
}
else if (Sector==5)
{
t1 = X;
t2 = -Y;
v->Tb = 0.5*(1-t1-t2);
v->Tc = v->Tb+t1;
v->Ta = v->Tc+t2;
}
else if (Sector==6)
{
t1 = -Y;
t2 = -Z;
v->Tc = 0.5*(1-t1-t2);
v->Ta = v->Tc+t1;
v->Tb = v->Ta+t2;
}
计算出来后,将Ta,Tb,Tc乘以PWM的计时周期对PWM比较器赋值即可计时周期=系统频率/2/斩波频率
EPwm1Regs.CMPA.half.CMPA=计时周期* Ta;
EPwm2Regs.CMPA.half.CMPA=计时周期* Tb; EPwm3Regs.CMPA.half.CMPA=计时周期* Tc; EPwm1Regs.CMPB=计时周期* Ta;
EPwm2Regs.CMPB=计时周期* Tb;
EPwm3Regs.CMPB=计时周期* Tc;。