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.

[参考译文] TMS320F28379D:数据类型存在 DSOGI PLL 问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1319038/tms320f28379d-dsogi-pll-problem-with-data-type

器件型号:TMS320F28379D
主题中讨论的其他器件:PMP23069PMP23338PMP40988

我正在尝试在 CCS 中对 DSOGI PLL 进行编码。 PLL 在 PLECS 和 Typhoon 虚拟模拟中运行良好。 但是、当我在 CCS 中对 PLL 进行编码以获取台风带来的输入并显示台风中 PLL 通过 DAC 的输出时、d 轴电压和频率在前几个周期内良好、此后不断恶化。 但这是数据类型的问题。 在 PLL 的最后一个积分器中、积分部分需要变量、该部分来自 double 数据类型。 那么、是否可以在 TI LaunchPad 中使用 double 数据类型? ADC 和 DAC 工作正常。  

输入电压在0至85V 范围内变化、频率在16Hz 至30Hz 范围内变化。 代码如下:

//转换为 LN 数量
VA = DEBUG_Vsp1;
VB = DEBUG_Vsp2;
Vc = DEBUG_ISP1;

//abc 至 α β
v_alpha =((2.0/3.0)*Va )-((1.0/3.0)*Vb )- Vc );
V_BETA =((1.0/1.7320508)* Vb)-((1.0/1.7320508)* Vc);

//Sogi 1
AFTER_GAIN=(V_alpha-I)* GAIN;

//反馈 β 电压
Ix;

//生成 α 电压
ERROR=AFTER_GAIN_SUM*Omega_DASH;
i=ip+(1.35e-5)*errorp);
IP=I;
errorp=错误;

//生成 β 电压
errorx=i*Omega_dash;
Ix = IXP+(1.35e-5)*errorxp);
IXP= Ix;
errorxp=错误;
//SOGI1完成

V_al=I;
qv_al = Ix;
// Sogi 2

//使 V_BETA 和 QV_BETA 生效
//生成 V_BETA
ERROR_BETA=(((V_BETA-I_BETA)* 0.8)- Ix_BETA)* Omega_DASH;
i_Beta=ip_Beta+((1.35e-5)* errorp_Beta);
IP_BETA=I_BETA;
errorp_Beta=错误 β;

//生成 QV_BETA 电压
errorx_Beta=i_Beta*Omega_dash;
ix_Beta=ixp_Beta+((1.35e-5)*errorxp_Beta);
iXP_BETA=Ix_BETA;
errorxp_Beta="错误 x_Beta";
//SOGI2完成

// SOGI1和 SOGI 2的输出为 I、Ix、I_BETA 和 Ix_BETA
V_be=i_BETA;
qv_be=ix_Beta;
//正序列计算
//Valpha=(v_al-qv_be)*0.5;
//vbeta=(qv_al+v_be)*0.5;
vbeta =(v_al+qv_be)*0.5;
Valpha =(v_BE-qv_al)* 0.5;

//part 2//转换为 α β 变量、并使 dq 为 θ

//alpha_beta 至 DQ
Vd1=(Valpha*cos (wt))+(Vbeta*sin (wt));
Vq1=(Vbeta*cos (wt))-(Valpha*sin (wt));


//PI PLL 的控制器代码
errorz = Vq1-0;
YN=Previos+(errorz*Ki*0.5*(1.35e-5)+(errorzprev*Ki*0.5*(1.35e-5));
errorzprev="错误";
previynos=yn;
y1=(errorz*Kp)+yn;

//将 PLL 输出的 theta 和 wt
OMEGA_dash=y1+(2*pi*30);
错误= Omega_DASH;


iy=Iyp+(0.5*(1.35e-5)*(errory+erroryp);
Iyp=Iy;
errorp=错误;

频率= Omega_DAS*(1/(2)*pi);
wt=Iy;//这是 Angle_theta

thetaout = wt;
如果(thetaout > 2*pi){
while (阈值> 2*pi)
thetaout = thetaout - 2 * pi;

否则、如果(thetaout < 0){
while (thetaout < 0)
thetaout = thetaout + 2*pi;

//输出将是 θ、频率、VD1
DAC_VD1=(VD1*45.5111111);
dac_theta=(thetaout*652.23);

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

    您好 Al Raji

    虽然我由于优先级较高的工作而无法浏览您的代码、但我建议 在 C2000中使用 PLL 库。 有很多使用 PLL 库的参考设计。 其中一些是  
    PMP23069
    PMP23338
    PMP40988。  

    这些参考设计在数字电源 SDK 中可用、您可以从以下链接下载该 SDK

    https://www.ti.com/tool/C2000WARE-DIGITALPOWER-SDK

    那么、是否可以在 TI LaunchPad 中使用 double 数据类型?

    关于这个问题、我将与我的同事讨论。 我将在获得最新信息后通知您。

    谢谢

    阿米尔

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

    您好 Al Raji

    您是否可以尝试使用 float64_t? 它等效于 C2000上的双精度型数值。

    谢谢

    阿米尔