spll_1ph_sogi_fll.h
Go to the documentation of this file.
1 //#############################################################################
2 //
3 // FILE: spll_1ph_sogi_fll.h
4 //
5 // TITLE: Orthogonal Signal Generator Software Phase Lock Loop (SPLL) for
6 // Single Phase Grid with Frequency Locked Loop (FLL) Module
7 //
8 //#############################################################################
9 // $TI Release: Software Phase Lock Loop Library v1.03.00.00 $
10 // $Release Date: Wed Oct 5 02:42:52 CDT 2022 $
11 // $Copyright:
12 // Copyright (C) 2022 Texas Instruments Incorporated - http://www.ti.com/
13 //
14 // ALL RIGHTS RESERVED
15 // $
16 //#############################################################################
17 
18 #ifndef SPLL_1PH_SOGI_FLL_H
19 #define SPLL_1PH_SOGI_FLL_H
20 
21 #ifdef __cplusplus
22 extern "C" {
23 #endif
24 
25 //*****************************************************************************
26 //
29 //
30 //*****************************************************************************
31 
32 //
33 // Included Files
34 //
35 #include <stdint.h>
36 #ifndef __TMS320C28XX_CLA__
37 #include <math.h>
38 #else
39 #include <CLAmath.h>
40 #endif
41 
42 //#############################################################################
43 //
44 // Macro Definitions
45 //
46 //#############################################################################
47 #ifndef C2000_IEEE754_TYPES
48 #define C2000_IEEE754_TYPES
49 #ifdef __TI_EABI__
50 typedef float float32_t;
51 typedef double float64_t;
52 #else // TI COFF
53 typedef float float32_t;
54 typedef long double float64_t;
55 #endif // __TI_EABI__
56 #endif // C2000_IEEE754_TYPES
57 
58 //
59 // Typedefs
60 //
61 
64 typedef volatile struct{
73 
76 typedef struct{
80 
90 typedef struct{
91  float32_t u[3];
92  float32_t osg_u[3];
93  float32_t osg_qu[3];
94  float32_t u_Q[2];
95  float32_t u_D[2];
96  float32_t ylf[2];
105  float32_t x3[2];
112 
117 static inline void SPLL_1PH_SOGI_FLL_reset(SPLL_1PH_SOGI_FLL *spll_obj)
118 {
119  spll_obj->u[0]=(float32_t)(0.0);
120  spll_obj->u[1]=(float32_t)(0.0);
121  spll_obj->u[2]=(float32_t)(0.0);
122 
123  spll_obj->osg_u[0]=(float32_t)(0.0);
124  spll_obj->osg_u[1]=(float32_t)(0.0);
125  spll_obj->osg_u[2]=(float32_t)(0.0);
126 
127  spll_obj->osg_qu[0]=(float32_t)(0.0);
128  spll_obj->osg_qu[1]=(float32_t)(0.0);
129  spll_obj->osg_qu[2]=(float32_t)(0.0);
130 
131  spll_obj->u_Q[0]=(float32_t)(0.0);
132  spll_obj->u_Q[1]=(float32_t)(0.0);
133 
134  spll_obj->u_D[0]=(float32_t)(0.0);
135  spll_obj->u_D[1]=(float32_t)(0.0);
136 
137  spll_obj->ylf[0]=(float32_t)(0.0);
138  spll_obj->ylf[1]=(float32_t)(0.0);
139 
140  spll_obj->fo=(float32_t)(0.0);
141 
142  spll_obj->theta=(float32_t)(0.0);
143 
144  spll_obj->sine=(float32_t)(0.0);
145  spll_obj->cosine=(float32_t)(0.0);
146 
147  spll_obj->x3[0]=0;
148  spll_obj->x3[1]=0;
149 
150  spll_obj->ef2=0;
151 }
152 
157 static inline void SPLL_1PH_SOGI_FLL_coeff_calc(SPLL_1PH_SOGI_FLL *spll_obj)
158 {
159  float32_t osgx,osgy,temp;
160 
161  osgx = (float32_t)(2.0f*spll_obj->k*spll_obj->w_dash*spll_obj->delta_t);
162  osgy = (float32_t)(spll_obj->w_dash*spll_obj->delta_t*spll_obj->w_dash*spll_obj->delta_t);
163  temp = (float32_t)1.0f/(osgx+osgy+4.0f);
164 
165  spll_obj->osg_coeff.osg_b0=((float32_t)osgx*temp);
166  spll_obj->osg_coeff.osg_b2=((float32_t)(-1.0f)*spll_obj->osg_coeff.osg_b0);
167  spll_obj->osg_coeff.osg_a1=((float32_t)(2.0f*(4.0f-osgy))*temp);
168  spll_obj->osg_coeff.osg_a2=((float32_t)(osgx-osgy-4)*temp);
169 
170  spll_obj->osg_coeff.osg_qb0=((float32_t)(spll_obj->k*osgy)*temp);
171  spll_obj->osg_coeff.osg_qb1=(spll_obj->osg_coeff.osg_qb0*(float32_t)(2.0));
172  spll_obj->osg_coeff.osg_qb2=spll_obj->osg_coeff.osg_qb0;
173 
174  spll_obj->x3[0]=0;
175  spll_obj->x3[1]=0;
176 }
177 
188 static inline void SPLL_1PH_SOGI_FLL_config(SPLL_1PH_SOGI_FLL *spll_obj,
189  float32_t acFreq,
190  float32_t isrFrequency,
191  float32_t lpf_b0,
192  float32_t lpf_b1,
193  float32_t k,
194  float32_t gamma)
195 {
196  spll_obj->fn=acFreq;
197  spll_obj->w_dash = 2*3.14159265f*acFreq;
198  spll_obj->wc = 2*3.14159265f*acFreq;
199  spll_obj->delta_t=((1.0f)/isrFrequency);
200  spll_obj->k=k;
201  spll_obj->gamma=gamma;
202 
204 
205  spll_obj->lpf_coeff.b0=lpf_b0;
206  spll_obj->lpf_coeff.b1=lpf_b1;
207 }
208 
214 static inline void SPLL_1PH_SOGI_FLL_run(SPLL_1PH_SOGI_FLL *spll_obj,
215  float32_t acValue)
216 {
217  float32_t osgx,osgy,temp;
218 
219  //
220  // Update the spll_obj->u[0] with the grid value
221  //
222  spll_obj->u[0]=acValue;
223 
224  //
225  // Orthogonal Signal Generator
226  //
227  spll_obj->osg_u[0]=(spll_obj->osg_coeff.osg_b0*
228  (spll_obj->u[0]-spll_obj->u[2])) +
229  (spll_obj->osg_coeff.osg_a1*spll_obj->osg_u[1]) +
230  (spll_obj->osg_coeff.osg_a2*spll_obj->osg_u[2]);
231 
232  spll_obj->osg_u[2]=spll_obj->osg_u[1];
233  spll_obj->osg_u[1]=spll_obj->osg_u[0];
234 
235  spll_obj->osg_qu[0]=(spll_obj->osg_coeff.osg_qb0*spll_obj->u[0]) +
236  (spll_obj->osg_coeff.osg_qb1*spll_obj->u[1]) +
237  (spll_obj->osg_coeff.osg_qb2*spll_obj->u[2]) +
238  (spll_obj->osg_coeff.osg_a1*spll_obj->osg_qu[1]) +
239  (spll_obj->osg_coeff.osg_a2*spll_obj->osg_qu[2]);
240 
241  spll_obj->osg_qu[2]=spll_obj->osg_qu[1];
242  spll_obj->osg_qu[1]=spll_obj->osg_qu[0];
243 
244  spll_obj->u[2]=spll_obj->u[1];
245  spll_obj->u[1]=spll_obj->u[0];
246 
247  //
248  // Park Transform from alpha beta to d-q axis
249  //
250  spll_obj->u_Q[0]=(spll_obj->cosine*spll_obj->osg_u[0]) +
251  (spll_obj->sine*spll_obj->osg_qu[0]);
252  spll_obj->u_D[0]=(spll_obj->cosine*spll_obj->osg_qu[0]) -
253  (spll_obj->sine*spll_obj->osg_u[0]);
254 
255  //
256  // Loop Filter
257  //
258  spll_obj->ylf[0]=spll_obj->ylf[1] +
259  (spll_obj->lpf_coeff.b0*spll_obj->u_Q[0]) +
260  (spll_obj->lpf_coeff.b1*spll_obj->u_Q[1]);
261  spll_obj->ylf[1]=spll_obj->ylf[0];
262 
263  //spll_obj->ylf[0] = (spll_obj->ylf[0]>0.5)?0.5:spll_obj->ylf[0];
264  //spll_obj->ylf[0] = (spll_obj->ylf[0]<-0.5)?-0.5:spll_obj->ylf[0];
265 
266  spll_obj->u_Q[1]=spll_obj->u_Q[0];
267 
268  //
269  // VCO
270  //
271  spll_obj->fo=spll_obj->fn+spll_obj->ylf[0];
272 
273  spll_obj->theta=spll_obj->theta + (spll_obj->fo*spll_obj->delta_t)*
274  (float32_t)(2.0*3.1415926f);
275 
276  if(spll_obj->theta>(float32_t)(2.0*3.1415926f))
277  {
278  spll_obj->theta=spll_obj->theta-(float32_t)(2.0*3.1415926f);
279  }
280 
281  spll_obj->sine=(float32_t)sinf(spll_obj->theta);
282  spll_obj->cosine=(float32_t)cosf(spll_obj->theta);
283 
284  //
285  // FLL
286  //
287  spll_obj->ef2 = ((spll_obj->u[0] - spll_obj->osg_u[0])*spll_obj->osg_qu[0])
288  * spll_obj->gamma * spll_obj->delta_t*-1.0f;
289 
290  spll_obj->x3[0]=spll_obj->x3[1] + spll_obj->ef2;
291 
292  //spll_obj->x3[0]= (spll_obj->x3[0]>1.0)?1.0:spll_obj->x3[0];
293  //spll_obj->x3[0]= (spll_obj->x3[0]<-1.0)?-1.0:spll_obj->x3[0];
294 
295  spll_obj->x3[1]=spll_obj->x3[0];
296 
297  spll_obj->w_dash = spll_obj->wc + spll_obj->x3[0];
298 
299  spll_obj->fn = spll_obj->w_dash / (2.0*3.1415926f);
300 
301  osgx = (float32_t)(2.0f*spll_obj->k*spll_obj->w_dash*spll_obj->delta_t);
302  osgy = (float32_t)(spll_obj->w_dash * spll_obj->delta_t * spll_obj->w_dash *
303  spll_obj->delta_t);
304  temp = (float32_t)1.0f/(osgx+osgy+4.0f);
305 
306  spll_obj->osg_coeff.osg_b0=((float32_t)osgx*temp);
307  spll_obj->osg_coeff.osg_b2=((float32_t)(-1.0f)*spll_obj->osg_coeff.osg_b0);
308  spll_obj->osg_coeff.osg_a1=((float32_t)(2.0f*(4.0f-osgy))*temp);
309  spll_obj->osg_coeff.osg_a2=((float32_t)(osgx-osgy-4)*temp);
310 
311  spll_obj->osg_coeff.osg_qb0=((float32_t)(spll_obj->k*osgy)*temp);
312  spll_obj->osg_coeff.osg_qb1=(spll_obj->osg_coeff.osg_qb0*(float32_t)(2.0));
313  spll_obj->osg_coeff.osg_qb2=spll_obj->osg_coeff.osg_qb0;
314 }
315 
316 //*****************************************************************************
317 //
318 // Close the Doxygen group.
320 //
321 //*****************************************************************************
322 
323 #ifdef __cplusplus
324 }
325 #endif // extern "C"
326 
327 #endif // end of _SPLL_1PH_SOGI_H_ definition
328 
329 //
330 // End of File
331 //
332 
SPLL_1PH_SOGI_FLL::gamma
float32_t gamma
Gamma parameter for FLL.
Definition: spll_1ph_sogi_fll.h:107
float32_t
float float32_t
Definition: sfra_f32.h:42
SPLL_1PH_SOGI_FLL::theta
float32_t theta
Angle output (0-2*pi)
Definition: spll_1ph_sogi_fll.h:100
SPLL_1PH_SOGI_FLL::osg_qu
float32_t osg_qu[3]
Orthogonal signal generator quadrature data buffer.
Definition: spll_1ph_sogi_fll.h:93
SPLL_1PH_SOGI_FLL::fo
float32_t fo
Output frequency of PLL(Hz)
Definition: spll_1ph_sogi_fll.h:97
SPLL_1PH_SOGI_FLL::fn
float32_t fn
Nominal frequency (Hz)
Definition: spll_1ph_sogi_fll.h:98
SPLL_1PH_SOGI_FLL::osg_coeff
SPLL_1PH_SOGI_FLL_OSG_COEFF osg_coeff
Orthogonal signal generator coefficient.
Definition: spll_1ph_sogi_fll.h:109
SPLL_1PH_SOGI_FLL
Defines the Orthogonal Signal Generator SPLL_1PH_SOGI_FLL structure.
Definition: spll_1ph_sogi_fll.h:90
SPLL_1PH_SOGI_FLL::x3
float32_t x3[2]
FLL data storage.
Definition: spll_1ph_sogi_fll.h:105
SPLL_1PH_SOGI_FLL::u_Q
float32_t u_Q[2]
Q-axis component.
Definition: spll_1ph_sogi_fll.h:94
SPLL_1PH_SOGI_FLL::k
float32_t k
K parameter for FLL.
Definition: spll_1ph_sogi_fll.h:108
SPLL_1PH_SOGI_FLL_OSG_COEFF::osg_a1
float32_t osg_a1
Definition: spll_1ph_sogi_fll.h:67
SPLL_1PH_SOGI_FLL_OSG_COEFF::osg_qb2
float32_t osg_qb2
Definition: spll_1ph_sogi_fll.h:71
SPLL_1PH_SOGI_FLL::u_D
float32_t u_D[2]
D-axis component.
Definition: spll_1ph_sogi_fll.h:95
math.h
SPLL_1PH_SOGI_FLL_LPF_COEFF
Defines the SPLL_1PH_SOGI_FLL_LPF_COEFF structure.
Definition: spll_1ph_sogi_fll.h:76
SPLL_1PH_SOGI_FLL_run
static void SPLL_1PH_SOGI_FLL_run(SPLL_1PH_SOGI_FLL *spll_obj, float32_t acValue)
Runs SPLL_1PH_SOGI_FLL module.
Definition: spll_1ph_sogi_fll.h:214
SPLL_1PH_SOGI_FLL::lpf_coeff
SPLL_1PH_SOGI_FLL_LPF_COEFF lpf_coeff
Loop filter coeffcient structure.
Definition: spll_1ph_sogi_fll.h:110
SPLL_1PH_SOGI_FLL::wc
float32_t wc
Center (Nominal) frequency in radians.
Definition: spll_1ph_sogi_fll.h:99
SPLL_1PH_SOGI_FLL::osg_u
float32_t osg_u[3]
Orthogonal signal generator data buffer.
Definition: spll_1ph_sogi_fll.h:92
SPLL_1PH_SOGI_FLL_OSG_COEFF
Defines the SPLL_1PH_SOGI_FLL_OSG_COEFF structure.
Definition: spll_1ph_sogi_fll.h:64
SPLL_1PH_SOGI_FLL_OSG_COEFF::osg_qb0
float32_t osg_qb0
Definition: spll_1ph_sogi_fll.h:69
SPLL_1PH_SOGI_FLL_coeff_calc
static void SPLL_1PH_SOGI_FLL_coeff_calc(SPLL_1PH_SOGI_FLL *spll_obj)
Calculates the SPLL_1PH_SOGI_FLL coefficients.
Definition: spll_1ph_sogi_fll.h:157
SPLL_1PH_SOGI_FLL::w_dash
float32_t w_dash
Output frequency of PLL(radians)
Definition: spll_1ph_sogi_fll.h:106
float32_t
float float32_t
Definition: spll_1ph_sogi_fll.h:53
SPLL_1PH_SOGI_FLL_OSG_COEFF::osg_qb1
float32_t osg_qb1
Definition: spll_1ph_sogi_fll.h:70
SPLL_1PH_SOGI_FLL_LPF_COEFF::b1
float32_t b1
Definition: spll_1ph_sogi_fll.h:77
SPLL_1PH_SOGI_FLL::u
float32_t u[3]
AC input data buffer.
Definition: spll_1ph_sogi_fll.h:91
SPLL_1PH_SOGI_FLL_config
static void SPLL_1PH_SOGI_FLL_config(SPLL_1PH_SOGI_FLL *spll_obj, float32_t acFreq, float32_t isrFrequency, float32_t lpf_b0, float32_t lpf_b1, float32_t k, float32_t gamma)
Configures the SPLL_1PH_SOGI_FLL coefficients.
Definition: spll_1ph_sogi_fll.h:188
SPLL_1PH_SOGI_FLL_OSG_COEFF::osg_a2
float32_t osg_a2
Definition: spll_1ph_sogi_fll.h:68
SPLL_1PH_SOGI_FLL::sine
float32_t sine
Sine value of the PLL angle.
Definition: spll_1ph_sogi_fll.h:102
SPLL_1PH_SOGI_FLL::ef2
float32_t ef2
FLL parameter.
Definition: spll_1ph_sogi_fll.h:104
SPLL_1PH_SOGI_FLL_LPF_COEFF::b0
float32_t b0
Definition: spll_1ph_sogi_fll.h:78
SPLL_1PH_SOGI_FLL_OSG_COEFF::osg_b0
float32_t osg_b0
Definition: spll_1ph_sogi_fll.h:65
SPLL_1PH_SOGI_FLL::ylf
float32_t ylf[2]
Loop filter data storage.
Definition: spll_1ph_sogi_fll.h:96
SPLL_1PH_SOGI_FLL::delta_t
float32_t delta_t
Inverse of the ISR rate at which module is called.
Definition: spll_1ph_sogi_fll.h:103
SPLL_1PH_SOGI_FLL_OSG_COEFF::osg_b2
float32_t osg_b2
Definition: spll_1ph_sogi_fll.h:66
SPLL_1PH_SOGI_FLL_reset
static void SPLL_1PH_SOGI_FLL_reset(SPLL_1PH_SOGI_FLL *spll_obj)
Resets internal data to zero,.
Definition: spll_1ph_sogi_fll.h:117
SPLL_1PH_SOGI_FLL::cosine
float32_t cosine
Cosine value of the PLL angle.
Definition: spll_1ph_sogi_fll.h:101
float64_t
long double float64_t
Definition: spll_1ph_sogi_fll.h:54

Copyright 2023, Texas Instruments Incorporated