AM263x Digital Power SDK  09.01.00
spll_1ph_sogi_fll.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2024 Texas Instruments Incorporated
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *
11  * Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the
14  * distribution.
15  *
16  * Neither the name of Texas Instruments Incorporated nor the names of
17  * its contributors may be used to endorse or promote products derived
18  * from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 //#############################################################################
33 //
34 // FILE: spll_1ph_sogi_fll.h
35 //
36 // TITLE: Orthogonal Signal Generator Software Phase Lock Loop (SPLL) for
37 // Single Phase Grid with Frequency Locked Loop (FLL) Module
38 //
39 //#############################################################################
40 
41 #ifndef SPLL_1PH_SOGI_FLL_H
42 #define SPLL_1PH_SOGI_FLL_H
43 
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47 
60 //
61 // Included Files
62 //
63 #include <stdint.h>
64 #include <math.h>
65 
66 
67 //#############################################################################
68 //
69 // Macro Definitions
70 //
71 //#############################################################################
72 #ifndef IEEE754_TYPES
73 #define IEEE754_TYPES
74 typedef float float32_t;
75 typedef double float64_t;
76 #endif // IEEE754_TYPES
77 
78 
79 //
80 // Typedefs
81 //
82 
85 typedef volatile struct{
94 
97 typedef struct{
101 
111 typedef struct{
112  float32_t u[3];
113  float32_t osg_u[3];
114  float32_t osg_qu[3];
115  float32_t u_Q[2];
116  float32_t u_D[2];
117  float32_t ylf[2];
126  float32_t x3[2];
133 
137 static inline void SPLL_1PH_SOGI_FLL_reset(SPLL_1PH_SOGI_FLL *spll_obj)
138 {
139  spll_obj->u[0]=(float32_t)(0.0);
140  spll_obj->u[1]=(float32_t)(0.0);
141  spll_obj->u[2]=(float32_t)(0.0);
142 
143  spll_obj->osg_u[0]=(float32_t)(0.0);
144  spll_obj->osg_u[1]=(float32_t)(0.0);
145  spll_obj->osg_u[2]=(float32_t)(0.0);
146 
147  spll_obj->osg_qu[0]=(float32_t)(0.0);
148  spll_obj->osg_qu[1]=(float32_t)(0.0);
149  spll_obj->osg_qu[2]=(float32_t)(0.0);
150 
151  spll_obj->u_Q[0]=(float32_t)(0.0);
152  spll_obj->u_Q[1]=(float32_t)(0.0);
153 
154  spll_obj->u_D[0]=(float32_t)(0.0);
155  spll_obj->u_D[1]=(float32_t)(0.0);
156 
157  spll_obj->ylf[0]=(float32_t)(0.0);
158  spll_obj->ylf[1]=(float32_t)(0.0);
159 
160  spll_obj->fo=(float32_t)(0.0);
161 
162  spll_obj->theta=(float32_t)(0.0);
163 
164  spll_obj->sine=(float32_t)(0.0);
165  spll_obj->cosine=(float32_t)(0.0);
166 
167  spll_obj->x3[0]=0;
168  spll_obj->x3[1]=0;
169 
170  spll_obj->ef2=0;
171 }
172 
176 static inline void SPLL_1PH_SOGI_FLL_coeff_calc(SPLL_1PH_SOGI_FLL *spll_obj)
177 {
178  float32_t osgx,osgy,temp;
179 
180  osgx = (float32_t)(2.0f*spll_obj->k*spll_obj->w_dash*spll_obj->delta_t);
181  osgy = (float32_t)(spll_obj->w_dash*spll_obj->delta_t*spll_obj->w_dash*spll_obj->delta_t);
182  temp = (float32_t)1.0f/(osgx+osgy+4.0f);
183 
184  spll_obj->osg_coeff.osg_b0=((float32_t)osgx*temp);
185  spll_obj->osg_coeff.osg_b2=((float32_t)(-1.0f)*spll_obj->osg_coeff.osg_b0);
186  spll_obj->osg_coeff.osg_a1=((float32_t)(2.0f*(4.0f-osgy))*temp);
187  spll_obj->osg_coeff.osg_a2=((float32_t)(osgx-osgy-4)*temp);
188 
189  spll_obj->osg_coeff.osg_qb0=((float32_t)(spll_obj->k*osgy)*temp);
190  spll_obj->osg_coeff.osg_qb1=(spll_obj->osg_coeff.osg_qb0*(float32_t)(2.0));
191  spll_obj->osg_coeff.osg_qb2=spll_obj->osg_coeff.osg_qb0;
192 
193  spll_obj->x3[0]=0;
194  spll_obj->x3[1]=0;
195 }
196 
206 static inline void SPLL_1PH_SOGI_FLL_config(SPLL_1PH_SOGI_FLL *spll_obj,
207  float32_t acFreq,
208  float32_t isrFrequency,
209  float32_t lpf_b0,
210  float32_t lpf_b1,
211  float32_t k,
212  float32_t gamma)
213 {
214  spll_obj->fn=acFreq;
215  spll_obj->w_dash = 2*3.14159265f*acFreq;
216  spll_obj->wc = 2*3.14159265f*acFreq;
217  spll_obj->delta_t=((1.0f)/isrFrequency);
218  spll_obj->k=k;
219  spll_obj->gamma=gamma;
220 
222 
223  spll_obj->lpf_coeff.b0=lpf_b0;
224  spll_obj->lpf_coeff.b1=lpf_b1;
225 }
226 
231 static inline void SPLL_1PH_SOGI_FLL_run(SPLL_1PH_SOGI_FLL *spll_obj,
232  float32_t acValue)
233 {
234  float32_t osgx,osgy,temp;
235 
236  //
237  // Update the spll_obj->u[0] with the grid value
238  //
239  spll_obj->u[0]=acValue;
240 
241  //
242  // Orthogonal Signal Generator
243  //
244  spll_obj->osg_u[0]=(spll_obj->osg_coeff.osg_b0*
245  (spll_obj->u[0]-spll_obj->u[2])) +
246  (spll_obj->osg_coeff.osg_a1*spll_obj->osg_u[1]) +
247  (spll_obj->osg_coeff.osg_a2*spll_obj->osg_u[2]);
248 
249  spll_obj->osg_u[2]=spll_obj->osg_u[1];
250  spll_obj->osg_u[1]=spll_obj->osg_u[0];
251 
252  spll_obj->osg_qu[0]=(spll_obj->osg_coeff.osg_qb0*spll_obj->u[0]) +
253  (spll_obj->osg_coeff.osg_qb1*spll_obj->u[1]) +
254  (spll_obj->osg_coeff.osg_qb2*spll_obj->u[2]) +
255  (spll_obj->osg_coeff.osg_a1*spll_obj->osg_qu[1]) +
256  (spll_obj->osg_coeff.osg_a2*spll_obj->osg_qu[2]);
257 
258  spll_obj->osg_qu[2]=spll_obj->osg_qu[1];
259  spll_obj->osg_qu[1]=spll_obj->osg_qu[0];
260 
261  spll_obj->u[2]=spll_obj->u[1];
262  spll_obj->u[1]=spll_obj->u[0];
263 
264  //
265  // Park Transform from alpha beta to d-q axis
266  //
267  spll_obj->u_Q[0]=(spll_obj->cosine*spll_obj->osg_u[0]) +
268  (spll_obj->sine*spll_obj->osg_qu[0]);
269  spll_obj->u_D[0]=(spll_obj->cosine*spll_obj->osg_qu[0]) -
270  (spll_obj->sine*spll_obj->osg_u[0]);
271 
272  //
273  // Loop Filter
274  //
275  spll_obj->ylf[0]=spll_obj->ylf[1] +
276  (spll_obj->lpf_coeff.b0*spll_obj->u_Q[0]) +
277  (spll_obj->lpf_coeff.b1*spll_obj->u_Q[1]);
278  spll_obj->ylf[1]=spll_obj->ylf[0];
279 
280  //spll_obj->ylf[0] = (spll_obj->ylf[0]>0.5)?0.5:spll_obj->ylf[0];
281  //spll_obj->ylf[0] = (spll_obj->ylf[0]<-0.5)?-0.5:spll_obj->ylf[0];
282 
283  spll_obj->u_Q[1]=spll_obj->u_Q[0];
284 
285  //
286  // VCO
287  //
288  spll_obj->fo=spll_obj->fn+spll_obj->ylf[0];
289 
290  spll_obj->theta=spll_obj->theta + (spll_obj->fo*spll_obj->delta_t)*
291  (float32_t)(2.0*3.1415926f);
292 
293  if(spll_obj->theta>(float32_t)(2.0*3.1415926f))
294  {
295  spll_obj->theta=spll_obj->theta-(float32_t)(2.0*3.1415926f);
296  }
297 
298  spll_obj->sine=(float32_t)sinf(spll_obj->theta);
299  spll_obj->cosine=(float32_t)cosf(spll_obj->theta);
300 
301  //
302  // FLL
303  //
304  spll_obj->ef2 = ((spll_obj->u[0] - spll_obj->osg_u[0])*spll_obj->osg_qu[0])
305  * spll_obj->gamma * spll_obj->delta_t*-1.0f;
306 
307  spll_obj->x3[0]=spll_obj->x3[1] + spll_obj->ef2;
308 
309  //spll_obj->x3[0]= (spll_obj->x3[0]>1.0)?1.0:spll_obj->x3[0];
310  //spll_obj->x3[0]= (spll_obj->x3[0]<-1.0)?-1.0:spll_obj->x3[0];
311 
312  spll_obj->x3[1]=spll_obj->x3[0];
313 
314  spll_obj->w_dash = spll_obj->wc + spll_obj->x3[0];
315 
316  spll_obj->fn = spll_obj->w_dash / (2.0*3.1415926f);
317 
318  osgx = (float32_t)(2.0f*spll_obj->k*spll_obj->w_dash*spll_obj->delta_t);
319  osgy = (float32_t)(spll_obj->w_dash * spll_obj->delta_t * spll_obj->w_dash *
320  spll_obj->delta_t);
321  temp = (float32_t)1.0f/(osgx+osgy+4.0f);
322 
323  spll_obj->osg_coeff.osg_b0=((float32_t)osgx*temp);
324  spll_obj->osg_coeff.osg_b2=((float32_t)(-1.0f)*spll_obj->osg_coeff.osg_b0);
325  spll_obj->osg_coeff.osg_a1=((float32_t)(2.0f*(4.0f-osgy))*temp);
326  spll_obj->osg_coeff.osg_a2=((float32_t)(osgx-osgy-4)*temp);
327 
328  spll_obj->osg_coeff.osg_qb0=((float32_t)(spll_obj->k*osgy)*temp);
329  spll_obj->osg_coeff.osg_qb1=(spll_obj->osg_coeff.osg_qb0*(float32_t)(2.0));
330  spll_obj->osg_coeff.osg_qb2=spll_obj->osg_coeff.osg_qb0;
331 }
332 
333 // Close the Doxygen group.
336 #ifdef __cplusplus
337 }
338 #endif // extern "C"
339 
340 #endif // end of _SPLL_1PH_SOGI_H_ definition
341 
342 //
343 // End of File
344 //
345 
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:176
SPLL_1PH_SOGI_FLL::osg_coeff
SPLL_1PH_SOGI_FLL_OSG_COEFF osg_coeff
Orthogonal signal generator coefficient.
Definition: spll_1ph_sogi_fll.h:130
float32_t
float float32_t
Definition: spll_1ph_sogi_fll.h:74
SPLL_1PH_SOGI_FLL_LPF_COEFF
Defines the SPLL_1PH_SOGI_FLL_LPF_COEFF structure.
Definition: spll_1ph_sogi_fll.h:97
SPLL_1PH_SOGI_FLL_OSG_COEFF::osg_qb1
float32_t osg_qb1
Definition: spll_1ph_sogi_fll.h:91
SPLL_1PH_SOGI_FLL_OSG_COEFF::osg_a2
float32_t osg_a2
Definition: spll_1ph_sogi_fll.h:89
SPLL_1PH_SOGI_FLL::fo
float32_t fo
Output frequency of PLL(Hz)
Definition: spll_1ph_sogi_fll.h:118
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:137
SPLL_1PH_SOGI_FLL::k
float32_t k
K parameter for FLL.
Definition: spll_1ph_sogi_fll.h:129
SPLL_1PH_SOGI_FLL::ef2
float32_t ef2
FLL parameter.
Definition: spll_1ph_sogi_fll.h:125
SPLL_1PH_SOGI_FLL_OSG_COEFF::osg_b0
float32_t osg_b0
Definition: spll_1ph_sogi_fll.h:86
SPLL_1PH_SOGI_FLL::fn
float32_t fn
Nominal frequency (Hz)
Definition: spll_1ph_sogi_fll.h:119
SPLL_1PH_SOGI_FLL::u_D
float32_t u_D[2]
D-axis component.
Definition: spll_1ph_sogi_fll.h:116
SPLL_1PH_SOGI_FLL::gamma
float32_t gamma
Gamma parameter for FLL.
Definition: spll_1ph_sogi_fll.h:128
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:124
SPLL_1PH_SOGI_FLL::ylf
float32_t ylf[2]
Loop filter data storage.
Definition: spll_1ph_sogi_fll.h:117
SPLL_1PH_SOGI_FLL::u_Q
float32_t u_Q[2]
Q-axis component.
Definition: spll_1ph_sogi_fll.h:115
SPLL_1PH_SOGI_FLL::sine
float32_t sine
Sine value of the PLL angle.
Definition: spll_1ph_sogi_fll.h:123
SPLL_1PH_SOGI_FLL_OSG_COEFF::osg_b2
float32_t osg_b2
Definition: spll_1ph_sogi_fll.h:87
SPLL_1PH_SOGI_FLL_OSG_COEFF
Defines the SPLL_1PH_SOGI_FLL_OSG_COEFF structure.
Definition: spll_1ph_sogi_fll.h:85
SPLL_1PH_SOGI_FLL_OSG_COEFF::osg_qb0
float32_t osg_qb0
Definition: spll_1ph_sogi_fll.h:90
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:231
SPLL_1PH_SOGI_FLL::x3
float32_t x3[2]
FLL data storage.
Definition: spll_1ph_sogi_fll.h:126
SPLL_1PH_SOGI_FLL_OSG_COEFF::osg_qb2
float32_t osg_qb2
Definition: spll_1ph_sogi_fll.h:92
SPLL_1PH_SOGI_FLL::w_dash
float32_t w_dash
Output frequency of PLL(radians)
Definition: spll_1ph_sogi_fll.h:127
SPLL_1PH_SOGI_FLL::cosine
float32_t cosine
Cosine value of the PLL angle.
Definition: spll_1ph_sogi_fll.h:122
SPLL_1PH_SOGI_FLL::wc
float32_t wc
Center (Nominal) frequency in radians.
Definition: spll_1ph_sogi_fll.h:120
SPLL_1PH_SOGI_FLL::osg_qu
float32_t osg_qu[3]
Orthogonal signal generator quadrature data buffer.
Definition: spll_1ph_sogi_fll.h:114
SPLL_1PH_SOGI_FLL::lpf_coeff
SPLL_1PH_SOGI_FLL_LPF_COEFF lpf_coeff
Loop filter coeffcient structure.
Definition: spll_1ph_sogi_fll.h:131
SPLL_1PH_SOGI_FLL::u
float32_t u[3]
AC input data buffer.
Definition: spll_1ph_sogi_fll.h:112
SPLL_1PH_SOGI_FLL::osg_u
float32_t osg_u[3]
Orthogonal signal generator data buffer.
Definition: spll_1ph_sogi_fll.h:113
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:206
float64_t
double float64_t
Definition: spll_1ph_sogi_fll.h:75
SPLL_1PH_SOGI_FLL_LPF_COEFF::b0
float32_t b0
Definition: spll_1ph_sogi_fll.h:99
float32_t
float float32_t
Defines single,double precision data type. Note: Assumes ABI to be TI_EABI, does not support legacy T...
Definition: dcl_common.h:54
SPLL_1PH_SOGI_FLL::theta
float32_t theta
Angle output (0-2*pi)
Definition: spll_1ph_sogi_fll.h:121
SPLL_1PH_SOGI_FLL_OSG_COEFF::osg_a1
float32_t osg_a1
Definition: spll_1ph_sogi_fll.h:88
SPLL_1PH_SOGI_FLL_LPF_COEFF::b1
float32_t b1
Definition: spll_1ph_sogi_fll.h:98
SPLL_1PH_SOGI_FLL
Defines the Orthogonal Signal Generator SPLL_1PH_SOGI_FLL structure.
Definition: spll_1ph_sogi_fll.h:111