AM263x Digital Power SDK  09.01.00
spll_1ph_sogi.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.h
35 //
36 // TITLE: Orthogonal Signal Generator Software Phase Lock Loop (SPLL)
37 // for Single Phase Grid Module
38 //
39 //#############################################################################
40 
41 
42 #ifndef SPLL_1PH_SOGI_H
43 #define SPLL_1PH_SOGI_H
44 
45 #ifdef __cplusplus
46 extern "C" {
47 #endif
48 
60 //
61 // Included Files
62 //
63 #include <stdint.h>
64 #include <math.h>
65 
66 
67 
68 //#############################################################################
69 //
70 // Macro Definitions
71 //
72 //#############################################################################
73 #ifndef IEEE754_TYPES
74 #define IEEE754_TYPES
75 typedef float float32_t;
76 typedef double float64_t;
77 #endif // IEEE754_TYPES
78 
79 //
80 // Typedefs
81 //
82 
85 typedef struct{
97 
100 typedef struct{
104 
112 typedef struct{
113  float32_t u[3];
114  float32_t osg_u[3];
115  float32_t osg_qu[3];
116  float32_t u_Q[2];
117  float32_t u_D[2];
118  float32_t ylf[2];
127 } SPLL_1PH_SOGI;
128 
132 static inline void SPLL_1PH_SOGI_reset(SPLL_1PH_SOGI *spll_obj)
133 {
134  spll_obj->u[0]=(float32_t)(0.0);
135  spll_obj->u[1]=(float32_t)(0.0);
136  spll_obj->u[2]=(float32_t)(0.0);
137 
138  spll_obj->osg_u[0]=(float32_t)(0.0);
139  spll_obj->osg_u[1]=(float32_t)(0.0);
140  spll_obj->osg_u[2]=(float32_t)(0.0);
141 
142  spll_obj->osg_qu[0]=(float32_t)(0.0);
143  spll_obj->osg_qu[1]=(float32_t)(0.0);
144  spll_obj->osg_qu[2]=(float32_t)(0.0);
145 
146  spll_obj->u_Q[0]=(float32_t)(0.0);
147  spll_obj->u_Q[1]=(float32_t)(0.0);
148 
149  spll_obj->u_D[0]=(float32_t)(0.0);
150  spll_obj->u_D[1]=(float32_t)(0.0);
151 
152  spll_obj->ylf[0]=(float32_t)(0.0);
153  spll_obj->ylf[1]=(float32_t)(0.0);
154 
155  spll_obj->fo=(float32_t)(0.0);
156 
157  spll_obj->theta=(float32_t)(0.0);
158 
159  spll_obj->sine=(float32_t)(0.0);
160  spll_obj->cosine=(float32_t)(0.0);
161 }
162 
166 static inline void SPLL_1PH_SOGI_coeff_calc(SPLL_1PH_SOGI *spll_obj)
167 {
168  float32_t osgx,osgy,temp, wn;
169  wn= spll_obj->fn *(float32_t) 2.0f * (float32_t) 3.14159265f;
170  spll_obj->osg_coeff.osg_k=(float32_t)(0.5);
171  osgx = (float32_t)(2.0f*0.5f*wn*spll_obj->delta_t);
172  spll_obj->osg_coeff.osg_x=(float32_t)(osgx);
173  osgy = (float32_t)(wn*spll_obj->delta_t*wn*spll_obj->delta_t);
174  spll_obj->osg_coeff.osg_y=(float32_t)(osgy);
175  temp = (float32_t)1.0/(osgx+osgy+4.0f);
176  spll_obj->osg_coeff.osg_b0=((float32_t)osgx*temp);
177  spll_obj->osg_coeff.osg_b2=((float32_t)(-1.0f)*spll_obj->osg_coeff.osg_b0);
178  spll_obj->osg_coeff.osg_a1=((float32_t)(2.0*(4.0f-osgy))*temp);
179  spll_obj->osg_coeff.osg_a2=((float32_t)(osgx-osgy-4)*temp);
180  spll_obj->osg_coeff.osg_qb0=((float32_t)(0.5f*osgy)*temp);
181  spll_obj->osg_coeff.osg_qb1=(spll_obj->osg_coeff.osg_qb0*(float32_t)(2.0));
182  spll_obj->osg_coeff.osg_qb2=spll_obj->osg_coeff.osg_qb0;
183 }
184 
192 static inline void SPLL_1PH_SOGI_config(SPLL_1PH_SOGI *spll_obj,
193  float32_t acFreq,
194  float32_t isrFrequency,
195  float32_t lpf_b0,
196  float32_t lpf_b1)
197 {
198  spll_obj->fn=acFreq;
199  spll_obj->delta_t=((1.0f)/isrFrequency);
200 
201  SPLL_1PH_SOGI_coeff_calc(spll_obj);
202 
203  spll_obj->lpf_coeff.b0=lpf_b0;
204  spll_obj->lpf_coeff.b1=lpf_b1;
205 }
206 
211 static inline void SPLL_1PH_SOGI_run(SPLL_1PH_SOGI *spll_obj,
212  float32_t acValue)
213 {
214  // Update the spll_obj->u[0] with the grid value
215  spll_obj->u[0]=acValue;
216 
217  //
218  // Orthogonal Signal Generator
219  //
220  spll_obj->osg_u[0]=(spll_obj->osg_coeff.osg_b0*
221  (spll_obj->u[0]-spll_obj->u[2])) +
222  (spll_obj->osg_coeff.osg_a1*spll_obj->osg_u[1]) +
223  (spll_obj->osg_coeff.osg_a2*spll_obj->osg_u[2]);
224 
225  spll_obj->osg_u[2]=spll_obj->osg_u[1];
226  spll_obj->osg_u[1]=spll_obj->osg_u[0];
227 
228  spll_obj->osg_qu[0]=(spll_obj->osg_coeff.osg_qb0*spll_obj->u[0]) +
229  (spll_obj->osg_coeff.osg_qb1*spll_obj->u[1]) +
230  (spll_obj->osg_coeff.osg_qb2*spll_obj->u[2]) +
231  (spll_obj->osg_coeff.osg_a1*spll_obj->osg_qu[1]) +
232  (spll_obj->osg_coeff.osg_a2*spll_obj->osg_qu[2]);
233 
234  spll_obj->osg_qu[2]=spll_obj->osg_qu[1];
235  spll_obj->osg_qu[1]=spll_obj->osg_qu[0];
236 
237  spll_obj->u[2]=spll_obj->u[1];
238  spll_obj->u[1]=spll_obj->u[0];
239 
240  //
241  // Park Transform from alpha beta to d-q axis
242  //
243  spll_obj->u_Q[0]=(spll_obj->cosine*spll_obj->osg_u[0]) +
244  (spll_obj->sine*spll_obj->osg_qu[0]);
245  spll_obj->u_D[0]=(spll_obj->cosine*spll_obj->osg_qu[0]) -
246  (spll_obj->sine*spll_obj->osg_u[0]);
247 
248  //
249  // Loop Filter
250  //
251  spll_obj->ylf[0]=spll_obj->ylf[1] +
252  (spll_obj->lpf_coeff.b0*spll_obj->u_Q[0]) +
253  (spll_obj->lpf_coeff.b1*spll_obj->u_Q[1]);
254  spll_obj->ylf[1]=spll_obj->ylf[0];
255 
256  spll_obj->u_Q[1]=spll_obj->u_Q[0];
257 
258  //
259  // VCO
260  //
261  spll_obj->fo=spll_obj->fn+spll_obj->ylf[0];
262 
263  spll_obj->theta=spll_obj->theta + (spll_obj->fo*spll_obj->delta_t)*
264  (float32_t)(2.0*3.1415926f);
265 
266  if(spll_obj->theta>(float32_t)(2.0*3.1415926f))
267  {
268  spll_obj->theta=spll_obj->theta - (float32_t)(2.0*3.1415926f);
269  //spll_obj->theta=0;
270  }
271 
272 
273  spll_obj->sine=(float32_t)sinf(spll_obj->theta);
274  spll_obj->cosine=(float32_t)cosf(spll_obj->theta);
275 }
276 
277 // Close the Doxygen group.
280 #ifdef __cplusplus
281 }
282 #endif // extern "C"
283 
284 
285 #endif // end of _SPLL_1PH_SOGI_H_ definition
286 
287 //
288 // End of File
289 //
290 
SPLL_1PH_SOGI::theta
float32_t theta
Angle output (0-2*pi)
Definition: spll_1ph_sogi.h:121
SPLL_1PH_SOGI::u
float32_t u[3]
AC input data buffer.
Definition: spll_1ph_sogi.h:113
SPLL_1PH_SOGI_OSG_COEFF::osg_b2
float32_t osg_b2
Definition: spll_1ph_sogi.h:90
float32_t
float float32_t
Definition: spll_1ph_sogi.h:75
SPLL_1PH_SOGI::sine
float32_t sine
Sine value of the PLL angle.
Definition: spll_1ph_sogi.h:123
SPLL_1PH_SOGI_config
static void SPLL_1PH_SOGI_config(SPLL_1PH_SOGI *spll_obj, float32_t acFreq, float32_t isrFrequency, float32_t lpf_b0, float32_t lpf_b1)
Configures the SPLL_1PH_SOGI module.
Definition: spll_1ph_sogi.h:192
SPLL_1PH_SOGI_LPF_COEFF
Defines the SPLL_1PH_SOGI_LPF_COEFF structure.
Definition: spll_1ph_sogi.h:100
SPLL_1PH_SOGI_OSG_COEFF::osg_k
float32_t osg_k
Definition: spll_1ph_sogi.h:86
SPLL_1PH_SOGI_OSG_COEFF::osg_qb0
float32_t osg_qb0
Definition: spll_1ph_sogi.h:93
SPLL_1PH_SOGI::cosine
float32_t cosine
Cosine value of the PLL angle.
Definition: spll_1ph_sogi.h:122
SPLL_1PH_SOGI::u_Q
float32_t u_Q[2]
Q-axis component.
Definition: spll_1ph_sogi.h:116
SPLL_1PH_SOGI_OSG_COEFF::osg_a1
float32_t osg_a1
Definition: spll_1ph_sogi.h:91
SPLL_1PH_SOGI::osg_u
float32_t osg_u[3]
Orthogonal signal generator data buffer.
Definition: spll_1ph_sogi.h:114
SPLL_1PH_SOGI_reset
static void SPLL_1PH_SOGI_reset(SPLL_1PH_SOGI *spll_obj)
Resets internal storage data of the module.
Definition: spll_1ph_sogi.h:132
SPLL_1PH_SOGI::u_D
float32_t u_D[2]
D-axis component.
Definition: spll_1ph_sogi.h:117
SPLL_1PH_SOGI_OSG_COEFF::osg_b0
float32_t osg_b0
Definition: spll_1ph_sogi.h:89
SPLL_1PH_SOGI_LPF_COEFF::b1
float32_t b1
Definition: spll_1ph_sogi.h:101
SPLL_1PH_SOGI_run
static void SPLL_1PH_SOGI_run(SPLL_1PH_SOGI *spll_obj, float32_t acValue)
Run the SPLL_1PH_SOGI module.
Definition: spll_1ph_sogi.h:211
SPLL_1PH_SOGI
Defines the Orthogonal Signal Generator SPLL_1PH_SOGI structure.
Definition: spll_1ph_sogi.h:112
SPLL_1PH_SOGI::fo
float32_t fo
Output frequency of PLL(Hz)
Definition: spll_1ph_sogi.h:119
SPLL_1PH_SOGI_OSG_COEFF
Defines the SPLL_1PH_SOGI_OSG_COEFF structure.
Definition: spll_1ph_sogi.h:85
SPLL_1PH_SOGI_OSG_COEFF::osg_a2
float32_t osg_a2
Definition: spll_1ph_sogi.h:92
SPLL_1PH_SOGI_LPF_COEFF::b0
float32_t b0
Definition: spll_1ph_sogi.h:102
SPLL_1PH_SOGI::fn
float32_t fn
Nominal frequency (Hz)
Definition: spll_1ph_sogi.h:120
SPLL_1PH_SOGI_OSG_COEFF::osg_x
float32_t osg_x
Definition: spll_1ph_sogi.h:87
SPLL_1PH_SOGI_OSG_COEFF::osg_y
float32_t osg_y
Definition: spll_1ph_sogi.h:88
SPLL_1PH_SOGI_OSG_COEFF::osg_qb2
float32_t osg_qb2
Definition: spll_1ph_sogi.h:95
SPLL_1PH_SOGI_coeff_calc
static void SPLL_1PH_SOGI_coeff_calc(SPLL_1PH_SOGI *spll_obj)
Calculates the SPLL_1PH_SOGI coefficient.
Definition: spll_1ph_sogi.h:166
SPLL_1PH_SOGI::osg_qu
float32_t osg_qu[3]
Orthogonal signal generator quadrature data buffer.
Definition: spll_1ph_sogi.h:115
SPLL_1PH_SOGI::osg_coeff
SPLL_1PH_SOGI_OSG_COEFF osg_coeff
Orthogonal signal generator coefficient.
Definition: spll_1ph_sogi.h:125
SPLL_1PH_SOGI_OSG_COEFF::osg_qb1
float32_t osg_qb1
Definition: spll_1ph_sogi.h:94
SPLL_1PH_SOGI::lpf_coeff
SPLL_1PH_SOGI_LPF_COEFF lpf_coeff
Loop filter coeffcient structure.
Definition: spll_1ph_sogi.h:126
float64_t
double float64_t
Definition: spll_1ph_sogi.h:76
SPLL_1PH_SOGI::ylf
float32_t ylf[2]
Loop filter data storage.
Definition: spll_1ph_sogi.h:118
SPLL_1PH_SOGI::delta_t
float32_t delta_t
Inverse of the ISR rate at which module is called.
Definition: spll_1ph_sogi.h:124
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