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.

[参考译文] CCS/LAUNCHXL-F28027F:单相 PLL -(输出错误)

Guru**** 2587345 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/798144/ccs-launchxl-f28027f-single-phase-pll---wrong-output

器件型号:LAUNCHXL-F28027F
主题中讨论的其他器件:controlSUITETMDSSOLARUINVKIT

工具/软件:Code Composer Studio

尊敬的 TI 成员:

我正在尝试实施单相 PLL 以确定交流信号的相位。 我已经设法使我的系统测量交流信号、并输出一个相位(使用 CCSUITE 1ph_PLL 模板)、然而 PLL 的输出相位一直在上下移动、有时会显示可怕的瞬变、如下面的图所示:

我还在信号发生器中包含了一个偏移、以便 ADC 捕获正值和负值

我的 ADC 在某些电网频率值时也会显示错误的结果(它适用于100Hz、500Hz、1000Hz)、但它会显示60Hz 等可怕结果。  

ISR:

中断 void ADCINT1_ISR (void)
{
static uint16 * AdcBufPtr1 = VA;//指向缓冲区的指针- static 因此永不丢失
静态 uint16 * AdcBufPtr2 = Vb;
// static uint32 * AdcBufPtr3 = VC;
static volatile Uint16 GPIO34_count = 0;
// splog_1pin 1;static voltile_flue_pin 1;static voltoggle COUNTER

//ADC 有12位、值范围为0至4095

PieCtrlRegs.PIEACK.all = PIEACK_Group1;//必须确认 PIE 组

//-管理 ADC 寄存器
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 ADCINT1标志

//-读取 ADC 结果
* AdcBufPtr1+=AdcResult.ADCRESULT0;//读取结果

spll1.ac_input =(long)(AdcResult.ADCRESULT0<<3);
SPLL_1ph_IQ_FUNC (&spll1);

//* AdcBufPtr2++=AdcResult.ADCRESULT1;
* AdcBufPtr2+
= ADcReseta+;* AdcBufP3+=AdcRest2+;/AdcAdcESP3+=AdcAddr1+=AdcRest2+;* AdcAdcTr1

//---强力强制循环缓冲
器 if (AdcBufPtr1 ==(VA + ADC_BUF_LEN)
{
AdcBufPtr1 = VA;//将指针



回卷到开头} if (AdcBufPtr2 =(Vb + ADC_BUF_LEN)){ AdcBufPtr2 =开头/ 


if (debug_toggle = 1)
{
GpioDataRegs.GPATOGGLE.bit.GPIO18 = 1;//切换引脚
}

//-示例:以0.5秒的速率切换 GPIO34 (连接到 controlSTICK 上的 LED)。
// (1/50000秒/采样)*(1个采样/内部)*(x 个中断/切换)=(0.5秒/切换)
// => x = 25000
if (GPIO34_count++>25000)//缓慢切换以查看 LED 闪烁
{
GpioDataRegs.GPBTOGGL.bit.GPIO34=1;//切换引脚
GPIO34_count = 0;//重置计数
器}

主:

#include "Lab.h"
#include "SPLL_1ph_IQ.h"
#include "Solar_IQ.h"
#include "IQmathLib.h"

#define GRGE_FREQ 100
#define PI 3.141592653589
#define ISR_FREQUENCY 250000.0
USTALE 16 DEBUF_TOGGLE = 1;//用于实时模式调查测试;










void 1ULEVREF_ADC_INTRUSTU16


;// USTUSTUSTUCC_IN_IN_IN_INUFF_1ENTRENTRU16;void

1 USTUSTUCC_IN_IN_IN_IN_IN_INTRIP_1ENTRUSTUFF_IN_INTRIP_INTRIP_INTRIP_1ENTRUSTUFF_ENTRIP_END/ ENTRIP_INUSTUV1ENTRU16;// USTU//初始化 CPU (文件:sysctrl.c)
InitGpio();//初始化共享的 GPIO 引脚(文件:gpio.c)
InitPieCtrl();//初始化并启用 PIE (文件:pieCtrl.c)
InitWatchdog();//初始化看门狗计时器(文件:watchdog.c)

//
初始化 Initm-(文件
:eadc)ePWM.c)


//--启用全局中断
asm (" CLRC INTM、DBGM");//启用全局中断和实时调试

//此处开始 PLL
//--- 用于并网应用的软件 PLL ---


#define B0_LPF SPLL_Q (166.877556)
#define B1_LPF SPLL_Q (-166.322444)
#define A1_LPF SPLL_Q (-1.0)

SPLL_1ph_IQ_init (grid_FREQ、_IQ21 (-166.322444))#define A1_LPF SPLL_Q (-1.0)、SPLL_Q_Q (-1.0



)(-1.0)、仅

适用于1)/SPLL_INIT (1)、1)、1)/SPLL_INIT (1)(1)(1)(1)(1)(1)(1)(1)、1)(1)(1)(1)(1)(1)(1)(1)(1)(1)、1)(1)(1)(1)(1)(1)(1)(1)(1


PLL (来自 controlSUITE):

#ifndef SPLL_1ph_IQ_H_
#define SPLL_1ph_IQ_H_

#define SPLL_Q _IQ21
#define SPLL_Qmpy _IQ21mpy

//******* 结构定义***** //
typedef 结构{
int32b2_陷 波;
int32b1_陷 波;
int32b0_陷 波;
int32a2_陷 波;
int32a1_陷 波;
{SPLL_1ph_IQ_陷 波_COeff;

typedef 结构{
int32B1_LF;
int32B0_LF;
int32A1_LF;
}SPLL_1ph_IQ_LPF_Coeff;

typedef 结构{
int32AC_input;
int32theta[2];
int32cos[2]

;int32 wo[2];int32 wo
int32wn;

SPLL_1ph_IQ_陷 波_COeff 陷波_COeff;
SPLL_1ph_IQ_LPF_COeffLPF_COeff;

int32Upt[3];
int32ybot[3];
int32ylf[2];
int32delta_t;
}SPLL_1ph_IQ;

//******* 函数声明***** //
void SPLL_1ph_IQ_init (int Grid_freq、long Delta_T、SPLL_1ph_IQ * spll);
void SPLL_1ph_IQ_bot_coeff_update (long delta_T、long wn、long c2、 长 C1、SPLL_1ph_IQ * spll_obj);
void SPLL_1ph_IQ_FUNC (SPLL_1ph_IQ * spll1);

//******* 宏定义********* //
#define SPLL_1ph_IQ_MACRO (v)\/*
相位检测*/\
v.Upd[0]= SPLL_QLF (v.ac_input、v.cos[1]);\/*
v.pnp Filter*/
\ v.ybet[0]=-SPLL_QpF (v.notch_coeff.A1_notch,v.ynotch[1])-SPLL_Qmpy(v.notch_coeff.A2_notch,v.ynotch[2])+SPLL_Qmpy(v.notch_coeff.B0_notch,v.Upd[0])+SPLL_Qmpy(v.notch_coeff.B1_notch,v.Upd[1])+SPLL_Qmpy(v.notch_coeff.B2_notch,v.Upd[2]);\
/* Update vymp1)



/vr1*、vrf_.ale[vrf]/vr.png./vr.eff

(vrf_vr.eff)\/vr.aleF[vr.1]/vrf_vr.aleF[vr1]/vr.p1]/vr.aleF[vr.coeF[vr1]/vr.aleF_1.b1]/vr.aleF[vr.aleF]+vr.aleF]+vr.aleF[vr.eF]+vr.eF]/vr.al]/vr.pn.png.al



\/*
集成过程*/\
v.sin [0]=v.sin [1]+SPLL_Qmpy ((SPLL_Qmpy (v.delta_t,v.wo)),v.cos[1]);\
v.cos[0]=v.Cos[1]-SPLL_Qmpy ((SPLL_Qmpy (v.delta_t,v.wo)),v.sin[1]);\
if (v.sin [0])>SPLL_Q (0.99)=v.sin
(0.99));\[vSin 0]0 (
如果 vSin 0.99) SPLL_Q (0.99))\
v.cos[0]= SPLL_Q (0.99);\
否则 if (v.cos[0]) SPLL_Q (0.0)&& v.sin [1]<=SPLL_Q (0.0))\
{\
v.theta[0]=SPLL_Q (0.0);\
}\
v.theta[1]=v.theta[0];\
v.sin [1]=v.sin [0];\ v.thetcos_1*
=v.f_q_.f_.eq_#.f_.c.h



我怀疑以下几点(但我不确定如何解决)

1 -我需要将偏移量插入代码中、 而不是信号发生器中  

2 -我需要向 PLL 发送一个偏移为0的正弦信号。

更新->我将信号减去平均值、但仍然得到相同的输出相位

 

3 -我还注意到、当缓冲区大小为500时、我的图形函数在100Hz 下工作、但当我更改缓冲区的大小时、图形也会发生变化、因此我想系统可能会工作、 但是、我将仅在特定的缓冲器大小下看到正确的输出。

欢迎提供任何帮助/建议。

谢谢、

维克多

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

    您使用的缓冲器也会被触发?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Manish、感谢您的回复!

    我的缓冲区在 ISR 内部进行了更新:

    * AdcBufPtr1++=AdcResult.ADCRESULT0; //读取结果

    spll1.ac_input =(long)(AdcResult.ADCRESULT0<<3);
    SPLL_1ph_IQ_FUNC (&spll1); //调用 PLL 函数

    * AdcBufPtr2++=spll1.theta[1]; //将 PLL 的新 theta 输出发送到缓冲器

    只要到缓冲区的指针达到结束值、指针就会复位到初始值。 系统仅在中断时工作、因此我的主命令是 NOP 命令。

    除了这里显示的内容、我不对缓冲器执行任何其他操作。 我需要做什么来"触发"我的缓冲器?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    维克多

    就像示波器一样、如果您的数据未被触发、您将看到运行中的波形、这可能看起来是毛刺脉冲。

    您需要触发缓冲区以便了解数据、我们有服务器模块这样做。  

    您可以使用加倍  

    C:\ti\controlSUITE\libs\app_libs\solar\v1.2\IQ\source

    DLOG 单通道或四通道  

    请参阅太阳能库的用户指南、了解将其包含在系统中的步骤  

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

    尊敬的 Manish:

    感谢您在这一问题上的帮助。 我目前正在尝试使用 DLOG_4CH 模块来实现触发范围。

    我应该 从 ADC 的 ISR 内部调用函数 DLOG_4CH 吗?  (DLOG_4ch_IQ_FUNC (&dlog_4ch1)  

    当我尝试从 ISR 内部调用函数时、我抱怨没有定义 dlog_4ch1。 如果我尝试在 ISR 中定义它、那么我将丢失我在 main 中为它设置的初始化参数。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您将需要声明一个在 ISR 和 main.c 内部可见的全局变量、我们有几个使用此变量的示例、

    请参阅

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

    我明白了。 我成功地使用命令 extern 实现了这一点(以便 ISR.c 可以使用与 main.c 相同的变量)。 谢谢!  

    下面是 PLL 在60Hz 下工作的图形  

    最后一个问题与 ADC 值有关。 我使用的 ADC 为12位、因此值范围为0 - 4095。

    当将测量值发送到 D log _4CH 时 、我只是发送 dval1= AdcResult.ADCRESULT0<<3;但是、如果我也想发送负信号、而不是仅发送正值、那么在这种情况下、最好的方法是什么? 我想从 ADC 测量值中减去平均值(2047)、但我想知道是否有更好的方法来实现这一点。

    谢谢、

    维克多