本帖最后由 kelei999999 于 2016-11-14 08:30 编辑
SVPWM的目标轨迹是圆形的,初始扇区可以随意定,但是只要初始扇区定下来了,随后的电压矢量就必须按圆周的规律旋转,那么旋转的电压矢量每一个小步径(就是PWM频率)就需要判断当前矢量落在了那个扇区,因为不同的扇区其表达式不相同。看代码:
void SVPWMGenerator(float Ualafax,float Ubeitay)//P的定义域为0-1.0f
{
float Ualafa = Ualafax * 0.57735027f,Ubeita = Ubeitay * 0.57735027f;
//--------------------------------------------------------------------------------确定三个分区基准向量
Uref1 = Ubeita;
Uref2 = (1.7320508f * Ualafa - Ubeita) * 0.5f;
Uref3 = -(1.7320508f * Ualafa + Ubeita) * 0.5f;
if(Uref1>0.001f)Ar = 1;
else Ar = 0;
if(Uref2>0.001f)Br = 1;
else Br = 0;
if(Uref3>0.001f)Cr = 1;
else Cr = 0;
//--------------------------------------------------------------------------------生成扇区向量表
N = (Cr*4) + (Br*2) + Ar;
//--------------------------------------------------------------------------------扇区选择
if(3==N)//-----------------------------------------------------------------------目标矢量在1扇区
{
//LED2(1);
Ux = Ualafa - Ubeita * 0.57735f;
Ux_60 = Ubeita * 1.1547f;
U0 = PWM1.PWMperiod - Ux - Ux_60;
PDC1G = (int)(PWM1.PWMperiod - U0 * DOF);
PDC2G = (int)(PWM1.PWMperiod - U0 * DOF - Ux);
PDC3G = (int)(PWM1.PWMperiod - U0 * DOF - Ux - Ux_60);
DutyCycle(PDC1G,PDC2G,PDC3G);
}
else if(1==N)//------------------------------------------------------------------目标矢量在2扇区
{
//-----------------------------------------------------------------------
Ux = Ualafa + 0.57735f * Ubeita;
Ux_60 = 0.57735f * Ubeita - Ualafa;
U0 = PWM1.PWMperiod - Ux - Ux_60;
PDC1G = (int)(PWM1.PWMperiod - U0 * DOF - Ux_60);
PDC2G = (int)(PWM1.PWMperiod - U0 * DOF);
PDC3G = (int)(PWM1.PWMperiod - U0 * DOF - Ux - Ux_60);
DutyCycle(PDC1G,PDC2G,PDC3G);
}
else if(5==N)//------------------------------------------------------------------目标矢量在3扇区
{
//-----------------------------------------------------------------------
Ux = Ubeita * 1.1547f;
Ux_60 = -Ualafa - Ubeita * 0.57735f;
U0 = PWM1.PWMperiod - Ux - Ux_60;
PDC1G = (int)(PWM1.PWMperiod - U0 * DOF - Ux - Ux_60);
PDC2G = (int)(PWM1.PWMperiod - U0 * DOF);
PDC3G = (int)(PWM1.PWMperiod - U0 * DOF - Ux);
DutyCycle(PDC1G,PDC2G,PDC3G);
}
else if(4==N)//------------------------------------------------------------------目标矢量在4扇区
{
//LED2(0);
//-----------------------------------------------------------------------
Ux = -Ualafa + Ubeita * 0.57735f;
Ux_60 = -Ubeita * 1.1547f;
U0 = PWM1.PWMperiod - Ux - Ux_60;
PDC1G = (int)(PWM1.PWMperiod - U0 * DOF - Ux - Ux_60);
PDC2G = (int)(PWM1.PWMperiod - U0 * DOF - Ux_60);
PDC3G = (int)(PWM1.PWMperiod - U0 * DOF);
DutyCycle(PDC1G,PDC2G,PDC3G);
}
else if(6==N)//------------------------------------------------------------------目标矢量在5扇区
{
//-----------------------------------------------------------------------
Ux = -Ualafa - 0.57735f * Ubeita;
Ux_60 = Ualafa -0.57735f * Ubeita;
U0 = PWM1.PWMperiod - Ux - Ux_60;
PDC1G = (int)(PWM1.PWMperiod - U0 * DOF - Ux);
PDC2G = (int)(PWM1.PWMperiod - U0 * DOF - Ux - Ux_60);
PDC3G = (int)(PWM1.PWMperiod - U0 * DOF);
DutyCycle(PDC1G,PDC2G,PDC3G);
}
else if(2==N)//------------------------------------------------------------------目标矢量在6扇区
{
//-----------------------------------------------------------------------
Ux = -Ubeita * 1.1547f;
Ux_60 = Ualafa + Ubeita * 0.57735f;
U0 = PWM1.PWMperiod - Ux - Ux_60;
PDC1G = (int)(PWM1.PWMperiod - U0 * DOF);
PDC2G = (int)(PWM1.PWMperiod - U0 * DOF - Ux - Ux_60);
PDC3G = (int)(PWM1.PWMperiod - U0 * DOF - Ux_60);
DutyCycle(PDC1G,PDC2G,PDC3G);
}
else if(0==N)//------------------------------------------------------------------目标矢量为0
{
PDC1G = (int)(PWM1.PWMperiod * DOF);
PDC2G = (int)(PWM1.PWMperiod * DOF);
PDC3G = (int)(PWM1.PWMperiod * DOF);
DutyCycle(PDC1G,PDC2G,PDC3G);
}
}
PDC1G,PDC2G,PDC3G即PWM占空比的值!你可以看到,每一个扇区他们的表达式是不尽相同的。
|