主题中讨论的其他器件:controlSUITE、 TMDSSOLARUINVKIT
工具/软件: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 下工作、但当我更改缓冲区的大小时、图形也会发生变化、因此我想系统可能会工作、 但是、我将仅在特定的缓冲器大小下看到正确的输出。
欢迎提供任何帮助/建议。
谢谢、
维克多