This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28335:太阳能库#39;s (SPLL_3ph_SRF)拼接不会锁定。

Guru**** 2618835 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/698110/tms320f28335-solar-library-s-spll_3ph_srf-spll-does-not-lock

器件型号: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;
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1。
    我建议将其重新编写如下

    SPLL_3ph_SRF_F_init (F_GRGE_Nomi、(浮点)(1.0/20000.0))、&spll1);

    2.确保序列是 ABC 的正确序列,尝试将序列进行换行并查看其效果是否更好。

    此致
    Manish Bhardwaj
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Manish、您好!
    非常感谢您的帮助。 更改 ABC 序列对我有效。
    在重新写入 SPLL_3ph_SRF_F_init (F_grid_Nomi、(((float) 1.0/20000.0))、&spll1)之后;PLL 确实锁定到电网频率的负值、并且在将 ABC 序列更改为 ACB 后、它使用正号锁定到正确的电网频率。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    太棒了!祝您的项目好运