AM263x Digital Power SDK  09.01.00
spll_3ph_srf.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: splll_3ph_srf.h
35 //
36 // TITLE: Software Phase Lock Loop for Three Phase Grid Tied Systems
37 //
38 //#############################################################################
39 
40 #ifndef SPLL_3PH_SRF_H
41 #define SPLL_3PH_SRF_H
42 
43 #ifdef __cplusplus
44 extern "C" {
45 #endif
46 
58 //
59 // Included Files
60 //
61 #include <stdint.h>
62 #include <math.h>
63 
64 //#############################################################################
65 //
66 // Macro Definitions
67 //
68 //#############################################################################
69 #ifndef IEEE754_TYPES
70 #define IEEE754_TYPES
71 typedef float float32_t;
72 typedef double float64_t;
73 
74 #endif // IEEE754_TYPES
75 
76 //
77 // Typedefs
78 //
79 
84 typedef struct{
88 
95 typedef struct{
96  float32_t v_q[2];
97  float32_t ylf[2];
100  float32_t theta[2];
103 } SPLL_3PH_SRF;
104 
110 static inline void SPLL_3PH_SRF_init(float32_t grid_freq, float32_t delta_t,
111  SPLL_3PH_SRF *spll_obj)
112 {
113  spll_obj->v_q[0] = (float32_t)(0.0);
114  spll_obj->v_q[1] = (float32_t)(0.0);
115 
116  spll_obj->ylf[0] = (float32_t)(0.0);
117  spll_obj->ylf[1] = (float32_t)(0.0);
118 
119  spll_obj->fo = (float32_t)(0.0);
120  spll_obj->fn = (float32_t)(grid_freq);
121 
122  spll_obj->theta[0] = (float32_t)(0.0);
123  spll_obj->theta[1] = (float32_t)(0.0);
124 
125  spll_obj->delta_t = (float32_t)delta_t;
126 }
127 
131 static inline void SPLL_3PH_SRF_reset(SPLL_3PH_SRF *spll_obj)
132 {
133  spll_obj->v_q[0] = (float32_t)(0.0);
134  spll_obj->v_q[1] = (float32_t)(0.0);
135 
136  spll_obj->ylf[0] = (float32_t)(0.0);
137  spll_obj->ylf[1] = (float32_t)(0.0);
138 
139  spll_obj->fo = (float32_t)(0.0);
140 
141  spll_obj->theta[0] = (float32_t)(0.0);
142  spll_obj->theta[1] = (float32_t)(0.0);
143 
144 }
145 
150 static inline void SPLL_3PH_SRF_run(float32_t v_q, SPLL_3PH_SRF *spll_obj)
151 {
152  //
153  // Update the spll_obj->v_q[0] with the grid value
154  //
155  spll_obj->v_q[0] = v_q;
156 
157  //
158  // Loop Filter
159  //
160  spll_obj->ylf[0] = spll_obj->ylf[1]
161  + (spll_obj->lpf_coeff.b0 * spll_obj->v_q[0])
162  + (spll_obj->lpf_coeff.b1 * spll_obj->v_q[1]);
163  spll_obj->ylf[1] = spll_obj->ylf[0];
164  spll_obj->v_q[1] = spll_obj->v_q[0];
165 
166  spll_obj->ylf[0] = (spll_obj->ylf[0] > (float32_t)(200.0)) ?
167  (float32_t)(200.0) : spll_obj->ylf[0];
168 
169  //
170  // VCO
171  //
172  spll_obj->fo = spll_obj->fn + spll_obj->ylf[0];
173 
174  spll_obj->theta[0] = spll_obj->theta[1] +
175  ((spll_obj->fo * spll_obj->delta_t) *
176  (float32_t)(2.0 * 3.1415926));
177  if(spll_obj->theta[0] > (float32_t)(2.0 * 3.1415926))
178  {
179  spll_obj->theta[0] = spll_obj->theta[0] - (float32_t)(2.0 * 3.1415926);
180  }
181 
182  spll_obj->theta[1] = spll_obj->theta[0];
183 }
184 
185 // Close the Doxygen group.
188 #ifdef __cplusplus
189 }
190 #endif // extern "C"
191 
192 #endif // end of _SPLL_3PH_SRF_H_ definition
193 
194 //
195 // End of File
196 //
SPLL_3PH_SRF::delta_t
float32_t delta_t
Inverse of the ISR rate at which module is called.
Definition: spll_3ph_srf.h:101
SPLL_3PH_SRF::fn
float32_t fn
Nominal frequency.
Definition: spll_3ph_srf.h:99
float32_t
float float32_t
Definition: spll_3ph_srf.h:71
SPLL_3PH_SRF::lpf_coeff
SPLL_3PH_SRF_LPF_COEFF lpf_coeff
Loop filter coefficients.
Definition: spll_3ph_srf.h:102
SPLL_3PH_SRF_reset
static void SPLL_3PH_SRF_reset(SPLL_3PH_SRF *spll_obj)
Reset SPLL_3PH_SRF module.
Definition: spll_3ph_srf.h:131
SPLL_3PH_SRF::v_q
float32_t v_q[2]
Rotating reference frame Q-axis value.
Definition: spll_3ph_srf.h:96
SPLL_3PH_SRF_LPF_COEFF
Defines the coefficients for a loop filter.
Definition: spll_3ph_srf.h:84
SPLL_3PH_SRF::ylf
float32_t ylf[2]
Data buffer for loop filter output.
Definition: spll_3ph_srf.h:97
SPLL_3PH_SRF_init
static void SPLL_3PH_SRF_init(float32_t grid_freq, float32_t delta_t, SPLL_3PH_SRF *spll_obj)
Initialize SPLL_3PH_SRF module.
Definition: spll_3ph_srf.h:110
SPLL_3PH_SRF_LPF_COEFF::b0
float32_t b0
Definition: spll_3ph_srf.h:86
SPLL_3PH_SRF
Defines the SPLL_3PH_SRF structure.
Definition: spll_3ph_srf.h:95
SPLL_3PH_SRF::theta
float32_t theta[2]
Grid phase angle.
Definition: spll_3ph_srf.h:100
SPLL_3PH_SRF::fo
float32_t fo
Output frequency of PLL.
Definition: spll_3ph_srf.h:98
SPLL_3PH_SRF_run
static void SPLL_3PH_SRF_run(float32_t v_q, SPLL_3PH_SRF *spll_obj)
Run SPLL_3PH_SRF module.
Definition: spll_3ph_srf.h:150
SPLL_3PH_SRF_LPF_COEFF::b1
float32_t b1
Definition: spll_3ph_srf.h:85
float64_t
double float64_t
Definition: spll_3ph_srf.h:72
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