如下程序在不适用锁相环时,可以正常运行,开锁相后,跑七八个周期后管子就炸掉了
PhaseAngle_Ug如图
三相锁相如下:
void PLL_Ug(void)
{
//********************************电网电压采样值调整***********************************************//
Vabg=adcin.Uabg; //这里进行标幺化处理,调试过程不进行标幺化
Vbcg=adcin.Ubcg;
Vcag=adcin.Ucag;
//********************************电网电压线电压与相电压的转换******************************************//
Uag = 0.66666667*Vabg+0.33333333*Vbcg; // 2/3=0.66666667, 1/3=0.33333333
Uag = Uag/141.4214; //标幺化处理
Ubg = 0.33333333*Vbcg-0.33333333*Vabg;
Ubg = Ubg/141.4214;
Ucg = 0.33333333*Vcag-0.33333333*Vbcg;
Ucg = Ucg/141.4214;
//**********************************电网电压Clarke变换*******************************************
Clarke_Ug.As = Uag;
Clarke_Ug.Bs = Ubg;
Clarke_Ug.Cs = Ucg;
Clarke_Ug.calc(&Clarke_Ug);
//**********************************电网电压Park变换*******************************************
Park_Ug.Alpha = Clarke_Ug.Alpha;
Park_Ug.Beta = Clarke_Ug.Beta;
Park_Ug.Angle = PhaseAngle_Ug;
Park_Ug.calc(&Park_Ug);
PID_pll.Ref = 0;
PID_pll.Fdb = Park_Ug.Qs;
PID_pll.calc(&PID_pll);
PhaseAngle_Ug -= PID_pll.Out;
if (PhaseAngle_Ug > 1)
{
PhaseAngle_Ug -= 1;
}
if (PhaseAngle_Ug < 0)
{
PhaseAngle_Ug += 1;
}
Park_Ug.Angle = PhaseAngle_Ug;
Park_Ug.calc(&Park_Ug);
if(PLLFlag == 0)
{
if((Park_Ug.Ds > 0) && (_IQabs(Park_Ug.Qs)< 0.01)) //Uq为0,且Ud为正,防止Ud为负时错180°
{
PLLCnt ++;
}
else
{
PLLCnt = 0;
}
if(PLLCnt > 150)
{
PLLFCnt ++;
}
if(PLLFCnt > 8)
{
if(_IQabs(PhaseAngle_Ug)<0.01||_IQabs(PhaseAngle_Ug-0.50)<0.01)
{
PLLFlag=1;
PLLFCnt=0;
}
}
}
}
请问这个程序的设计哪里有问题呢,想重点询问的是,PWMSIN函数里面(2*PI*PhaseAngle_Ug+0.09)和(2*PI*(PhaseAngle_Ug+0.09))的区别。