请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F28335 Thread 中讨论的其他器件:controlSUITE
您好!
我打算使用太阳能库的 SPLL_3ph_SRF 来跟踪电网的相位角 (用于三相并网逆变器)。要对此进行仿真、 我使用50微秒(20kHz) CPU 定时器0中断 来更新 三相电压值。在 ISR 中、更新瞬时电压值后、 输入这些电压的标么值 Vmeas [VA]、Vmeas [Vb]和 Vmeas [VC] abc_dq0_pos1结构。
abc_dq0_pos1.sin 和 abc_dq0_pos1.cos 的值也分别更新为 (float) sin ((spll1.theta[1])和 (float) cos ((spll1.theta[1])) (spll1.theta[1]对于 在 SolarLib.pdf 中找到的第一个指令 ISR、初始化为0)。
当我运行此代码(在 F28335实验套件上)时 、spll1.theta[1]和 spll1.theta[0]的值保持恒定(与初始化值相同)、 spll1.fo 的值(瞬时电网频率)不会锁定。 spll1.fo 保持读取-45和250之间的数字。
#include "DSP28x_Project.h" #include #include "Solar_F.h" #define PI 3.14159265 #define DEG_TO_RAD PI/180 #define RAD_TO_DEG 180/PI #define F_GRGE_Nomi 50 #define N_MAX 5000/F_GRGE_Nomi #define 步骤 (90*F_GRGE_Nomi/5000) __interrupt void cpu_timer0_isr (void); enum{VA、Vb、vc}; enum{Alpha、Beta、Zero}; enum{D、Q、Z}; float voltage [3]; float theta[3]={0、120、240}; float A = 325.2691193;/230*sqrt (2) float Vmeas [3]; float PLL_theta[2]; float PLL_grid_freq; ABC_DQ0_POS_F abc_dq0_pos1; SPLL_3ph_SRF_F spll1; void main (void) { InitSysCtrl(); Dint; ABC_DQ0_POS_F_INIT (&abc_dq0_pos1); SPLL_3ph_SRF_F_init (F_GRGE_Nomi、(浮点)(1/20000))、&spll1); InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); EALLOW; PieVectTable.TINT0 =&CPU_timer0_ISR; EDIS; InitCpuTimer(); #IF (CPU_FRQ_150MHz) ConfigCpuTimer (&CpuTimer0、150、50);//每50微秒,即20kHz 的频率 #endif #IF (CPU_FRQ_100MHz) ConfigCpuTimer (&CpuTimer0、100、50); #endif CpuTimer0Regs.TCR.ALL = 0x4000; IER |= M_INT1; PieCtrlRegs.PIEIER1.bit.INTx7=1; EINT; ERTM; spll1.theta[0]= DEG_TO_RAD*0; spll1.theta[1]= deg_TO_RAD*0; for (;;); } _interrupt void cpu_timer0_isr (void) { int i; VOLT[VA]= a*sin (deg_TO_RAD* theta[VA]); VOLT[Vb]= a*sin (deg_TO_RAD* theta[Vb]); voltage [vC]= a*sin (deg_TO_RAD* theta[vC]); for (i=0;i<3;i++) { Theta[i]= theta[i]+ 0.9; if (theta[i]>= 360) { Theta[i]= theta[i]- 360; } } for (i=0;i<3;i++) { Vmeas [i]=电压[i]/230; } abc_dq0_pos1.a = Vmeas [VA]; abc_dq0_pos1.b = Vmeas [Vb]; abc_dq0_pos1.c = Vmeas [vc]; abc_dq0_pos1.sin =(float) sin (((spll1.theta[1])); abc_dq0_pos1.cos =(float) cos ((spll1.theta[1])); ABC_DQ0_POS_F_MACRO (abc_dq0_pos1); spll1.v_q[0]=(abc_dq0_pos1.q); SPLL_3ph_SRF_FUNC (&spll1); pll_theta[0]= spll1.theta[0]; pll_theta[1]= spll1.theta[1]; pll_grid_freq = spll1.fo; PieCtrlRegs.PIEACX.ALL = PIEACK_Group1; }