AM263x Digital Power SDK  09.01.00
spll_3ph_ddsrf.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_3ph_ddsrf.h
35 //
36 // TITLE: DDSRF PLL for Three Phase Grid Tied Systems
37 //
38 //#############################################################################
39 
40 #ifndef SPLL_3PH_DDSRF_H
41 #define SPLL_3PH_DDSRF_H
42 
43 #ifdef __cplusplus
44 extern "C" {
45 #endif
46 
59 //
60 // Included Files
61 //
62 #include <stdint.h>
63 #include <math.h>
64 
65 //#############################################################################
66 //
67 // Macro Definitions
68 //
69 //#############################################################################
70 #ifndef IEEE754_TYPES
71 #define IEEE754_TYPES
72 typedef float float32_t;
73 typedef double float64_t;
74 #endif // IEEE754_TYPES
75 
76 //
77 // Typedefs
78 //
79 
84 typedef struct{
88 
95 typedef struct{
100 
103 
104  float32_t y[2];
105  float32_t x[2];
106  float32_t w[2];
107  float32_t z[2];
114 
115  float32_t v_q[2];
116  float32_t theta[2];
117  float32_t ylf[2];
123 
131 static inline void SPLL_3PH_DDSRF_init(float32_t grid_freq, float32_t delta_t,
132  float32_t k1, float32_t k2,
133  SPLL_3PH_DDSRF *spll_obj)
134 {
135  spll_obj->d_p_decoupl = (float32_t)(0.0);
136  spll_obj->d_n_decoupl = (float32_t)(0.0);
137 
138  spll_obj->q_p_decoupl = (float32_t)(0.0);
139  spll_obj->q_n_decoupl = (float32_t)(0.0);
140 
141  spll_obj->d_p_decoupl_lpf = (float32_t)(0.0);
142  spll_obj->d_n_decoupl_lpf = (float32_t)(0.0);
143 
144  spll_obj->q_p_decoupl_lpf = (float32_t)(0.0);
145  spll_obj->q_n_decoupl_lpf = (float32_t)(0.0);
146 
147  spll_obj->y[0] = (float32_t)(0.0);
148  spll_obj->y[1] = (float32_t)(0.0);
149 
150  spll_obj->x[0] = (float32_t)(0.0);
151  spll_obj->x[1] = (float32_t)(0.0);
152 
153  spll_obj->w[0] = (float32_t)(0.0);
154  spll_obj->w[1] = (float32_t)(0.0);
155 
156  spll_obj->z[0] = (float32_t)(0.0);
157  spll_obj->z[1] = (float32_t)(0.0);
158 
159  spll_obj->k1 = k1;
160  spll_obj->k2 = k2;
161 
162  spll_obj->v_q[0] = (float32_t)(0.0);
163  spll_obj->v_q[1] = (float32_t)(0.0);
164 
165  spll_obj->ylf[0] = (float32_t)(0.0);
166  spll_obj->ylf[1] = (float32_t)(0.0);
167 
168  spll_obj->fo = (float32_t)(0.0);
169  spll_obj->fn = (float32_t)(grid_freq);
170 
171  spll_obj->theta[0] = (float32_t)(0.0);
172  spll_obj->theta[1] = (float32_t)(0.0);
173 
174  spll_obj->delta_t = delta_t;
175 }
176 
177 //
181 static inline void SPLL_3PH_DDSRF_reset(SPLL_3PH_DDSRF *spll_obj)
182 {
183  spll_obj->d_p_decoupl = (float32_t)(0.0);
184  spll_obj->d_n_decoupl = (float32_t)(0.0);
185 
186  spll_obj->q_p_decoupl = (float32_t)(0.0);
187  spll_obj->q_n_decoupl = (float32_t)(0.0);
188 
189  spll_obj->d_p_decoupl_lpf = (float32_t)(0.0);
190  spll_obj->d_n_decoupl_lpf = (float32_t)(0.0);
191 
192  spll_obj->q_p_decoupl_lpf = (float32_t)(0.0);
193  spll_obj->q_n_decoupl_lpf = (float32_t)(0.0);
194 
195  spll_obj->y[0] = (float32_t)(0.0);
196  spll_obj->y[1] = (float32_t)(0.0);
197 
198  spll_obj->x[0] = (float32_t)(0.0);
199  spll_obj->x[1] = (float32_t)(0.0);
200 
201  spll_obj->w[0] = (float32_t)(0.0);
202  spll_obj->w[1] = (float32_t)(0.0);
203 
204  spll_obj->z[0] = (float32_t)(0.0);
205  spll_obj->z[1] = (float32_t)(0.0);
206 
207  spll_obj->v_q[0] = (float32_t)(0.0);
208  spll_obj->v_q[1] = (float32_t)(0.0);
209 
210  spll_obj->ylf[0] = (float32_t)(0.0);
211  spll_obj->ylf[1] = (float32_t)(0.0);
212 
213  spll_obj->fo = (float32_t)(0.0);
214 
215  spll_obj->theta[0] = (float32_t)(0.0);
216  spll_obj->theta[1] = (float32_t)(0.0);
217 }
218 
219 //
227 static inline void SPLL_3PH_DDSRF_run(SPLL_3PH_DDSRF *spll_obj,
228  float32_t d_p, float32_t d_n,
229  float32_t q_p, float32_t q_n)
230 {
231  //
232  // before calling this routine run the ABC_DQ0_Pos & Neg run routines
233  // pass updated values for d_p,d_n,q_p,q_n
234  // and update the cos_2theta and sin_2theta values with the prev angle
235  //
236 
237  //
238  // Decoupling Network
239  //
240  spll_obj->d_p_decoupl = d_p
241  - (spll_obj->d_n_decoupl_lpf * spll_obj->cos_2theta)
242  - (spll_obj->q_n_decoupl * spll_obj->sin_2theta);
243  spll_obj->q_p_decoupl = q_p
244  + (spll_obj->d_n_decoupl_lpf * spll_obj->sin_2theta)
245  - (spll_obj->q_n_decoupl * spll_obj->cos_2theta);
246 
247  spll_obj->d_n_decoupl = d_n
248  - (spll_obj->d_p_decoupl_lpf * spll_obj->cos_2theta)
249  + (spll_obj->q_p_decoupl * spll_obj->sin_2theta);
250  spll_obj->q_n_decoupl = q_n
251  - (spll_obj->d_p_decoupl_lpf * spll_obj->sin_2theta)
252  - (spll_obj->q_p_decoupl * spll_obj->cos_2theta);
253 
254  //
255  // Low pass filter
256  //
257 
258  spll_obj->y[1] = (spll_obj->d_p_decoupl * spll_obj->k1)
259  - (spll_obj->y[0] * spll_obj->k2);
260  spll_obj->d_p_decoupl_lpf = spll_obj->y[1] + spll_obj->y[0];
261  spll_obj->y[0] = spll_obj->y[1];
262 
263  spll_obj->x[1] = (spll_obj->q_p_decoupl * spll_obj->k1)
264  - (spll_obj->x[0] * spll_obj->k2);
265  spll_obj->q_p_decoupl_lpf = spll_obj->x[1] + spll_obj->x[0];
266  spll_obj->x[0] = spll_obj->x[1];
267 
268  spll_obj->w[1] = (spll_obj->d_n_decoupl * spll_obj->k1)
269  - (spll_obj->w[0] * spll_obj->k2);
270  spll_obj->d_n_decoupl_lpf = spll_obj->w[1] + spll_obj->w[0];
271  spll_obj->w[0] = spll_obj->w[1];
272 
273  spll_obj->z[1] = (spll_obj->q_n_decoupl * spll_obj->k1)
274  - (spll_obj->z[0] * spll_obj->k2);
275  spll_obj->q_n_decoupl_lpf = spll_obj->z[1] + spll_obj->z[0];
276  spll_obj->z[0] = spll_obj->z[1];
277 
278  spll_obj->v_q[0] = spll_obj->q_p_decoupl;
279 
280  //
281  // Loop Filter
282  //
283  spll_obj->ylf[0] = spll_obj->ylf[1]
284  + (spll_obj->lpf_coeff.b0 * spll_obj->v_q[0])
285  + (spll_obj->lpf_coeff.b1 * spll_obj->v_q[1]);
286  spll_obj->ylf[1] = spll_obj->ylf[0];
287  spll_obj->v_q[1] = spll_obj->v_q[0];
288 
289  //
290  // VCO
291  //
292  spll_obj->fo = spll_obj->fn + spll_obj->ylf[0];
293 
294  spll_obj->theta[0] = spll_obj->theta[1] +
295  ((spll_obj->fo * spll_obj->delta_t)
296  * (float32_t)(2.0f * 3.1415926f));
297 
298  if(spll_obj->theta[0] > (float32_t)(2.0f * 3.1415926f))
299  {
300  spll_obj->theta[0] = spll_obj->theta[0] -
301  (float32_t)(2.0f * 3.1415926f);
302  }
303 
304 
305  spll_obj->theta[1] = spll_obj->theta[0];
306 
307  spll_obj->cos_2theta = cosf(spll_obj->theta[1] * 2.0f);
308  spll_obj->sin_2theta = sinf(spll_obj->theta[1] * 2.0f);
309 }
310 
311 // Close the Doxygen group.
314 #ifdef __cplusplus
315 }
316 #endif // extern "C"
317 
318 #endif // end of _SPLL_3PH_DDSRF_H_ definition
319 
320 //
321 // End of File
322 //
SPLL_3PH_DDSRF::q_n_decoupl_lpf
float32_t q_n_decoupl_lpf
Decoupled negative sequence Q-axis component filtered.
Definition: spll_3ph_ddsrf.h:113
SPLL_3PH_DDSRF::fo
float32_t fo
Instantaneous Grid Frequency in Hz.
Definition: spll_3ph_ddsrf.h:118
SPLL_3PH_DDSRF::fn
float32_t fn
Nominal Grid Frequency in Hz.
Definition: spll_3ph_ddsrf.h:119
float32_t
float float32_t
Definition: spll_3ph_ddsrf.h:72
SPLL_3PH_DDSRF_run
static void SPLL_3PH_DDSRF_run(SPLL_3PH_DDSRF *spll_obj, float32_t d_p, float32_t d_n, float32_t q_p, float32_t q_n)
Run spll_3PH_srf module.
Definition: spll_3ph_ddsrf.h:227
SPLL_3PH_DDSRF_LPF_COEFF::b1
float32_t b1
Definition: spll_3ph_ddsrf.h:85
SPLL_3PH_DDSRF::delta_t
float32_t delta_t
1/Frequency of calling the PLL routine
Definition: spll_3ph_ddsrf.h:120
SPLL_3PH_DDSRF::sin_2theta
float32_t sin_2theta
Sin of twice the grid frequency angle.
Definition: spll_3ph_ddsrf.h:102
SPLL_3PH_DDSRF::z
float32_t z[2]
Used to store history for filtering the decoupled D and Q axis components.
Definition: spll_3ph_ddsrf.h:107
SPLL_3PH_DDSRF::d_p_decoupl
float32_t d_p_decoupl
Positive Rotating reference Frame D-axis value.
Definition: spll_3ph_ddsrf.h:96
SPLL_3PH_DDSRF::v_q
float32_t v_q[2]
Definition: spll_3ph_ddsrf.h:115
SPLL_3PH_DDSRF::k2
float32_t k2
Lpf coefficient
Definition: spll_3ph_ddsrf.h:109
SPLL_3PH_DDSRF::k1
float32_t k1
Lpf coefficient.
Definition: spll_3ph_ddsrf.h:108
SPLL_3PH_DDSRF::w
float32_t w[2]
Used to store history for filtering the decoupled D and Q axis components.
Definition: spll_3ph_ddsrf.h:106
SPLL_3PH_DDSRF::y
float32_t y[2]
Used to store history for filtering the decoupled D and Q axis components
Definition: spll_3ph_ddsrf.h:104
SPLL_3PH_DDSRF::q_p_decoupl_lpf
float32_t q_p_decoupl_lpf
Decoupled positive sequence Q-axis component filtered.
Definition: spll_3ph_ddsrf.h:112
SPLL_3PH_DDSRF::d_p_decoupl_lpf
float32_t d_p_decoupl_lpf
Decoupled positive sequence D-axis component filtered.
Definition: spll_3ph_ddsrf.h:110
SPLL_3PH_DDSRF::ylf
float32_t ylf[2]
Internal Data Buffer for Loop Filter output.
Definition: spll_3ph_ddsrf.h:117
SPLL_3PH_DDSRF::cos_2theta
float32_t cos_2theta
Cos of twice the grid frequency angle.
Definition: spll_3ph_ddsrf.h:101
SPLL_3PH_DDSRF::lpf_coeff
SPLL_3PH_DDSRF_LPF_COEFF lpf_coeff
Definition: spll_3ph_ddsrf.h:121
SPLL_3PH_DDSRF_reset
static void SPLL_3PH_DDSRF_reset(SPLL_3PH_DDSRF *spll_obj)
Reset SPLL_3PH_DDSRF module.
Definition: spll_3ph_ddsrf.h:181
SPLL_3PH_DDSRF
Defines the SPLL_3PH_DDSRF structure.
Definition: spll_3ph_ddsrf.h:95
SPLL_3PH_DDSRF::theta
float32_t theta[2]
Grid phase angle.
Definition: spll_3ph_ddsrf.h:116
SPLL_3PH_DDSRF_LPF_COEFF::b0
float32_t b0
Definition: spll_3ph_ddsrf.h:86
SPLL_3PH_DDSRF_LPF_COEFF
Defines the coefficients for a loop filter.
Definition: spll_3ph_ddsrf.h:84
SPLL_3PH_DDSRF::q_n_decoupl
float32_t q_n_decoupl
Negative Rotating reference Frame Q-axis value.
Definition: spll_3ph_ddsrf.h:99
SPLL_3PH_DDSRF::q_p_decoupl
float32_t q_p_decoupl
Positive Rotating reference Frame Q-axis value.
Definition: spll_3ph_ddsrf.h:98
SPLL_3PH_DDSRF::d_n_decoupl
float32_t d_n_decoupl
Negative Rotating reference Frame D-axis value.
Definition: spll_3ph_ddsrf.h:97
float64_t
double float64_t
Definition: spll_3ph_ddsrf.h:73
SPLL_3PH_DDSRF::d_n_decoupl_lpf
float32_t d_n_decoupl_lpf
Decoupled negative sequence D-axis component filtered.
Definition: spll_3ph_ddsrf.h:111
SPLL_3PH_DDSRF_init
static void SPLL_3PH_DDSRF_init(float32_t grid_freq, float32_t delta_t, float32_t k1, float32_t k2, SPLL_3PH_DDSRF *spll_obj)
Initialize SPLL_3PH_DDSRF module.
Definition: spll_3ph_ddsrf.h:131
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_3PH_DDSRF::x
float32_t x[2]
Used to store history for filtering the decoupled D and Q axis components.
Definition: spll_3ph_ddsrf.h:105