AM263x Motor Control SDK  09.02.00
svgen.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2023 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 #ifndef _SVGEN_H_
34 #define _SVGEN_H_
35 
36 #ifdef __cplusplus
37 extern "C"
38 {
39 #endif
40 
49 #include <stdint.h>
50 
51 #ifndef IEEE754_TYPES
52 #define IEEE754_TYPES
53 typedef float float32_t;
54 typedef double float64_t;
55 #endif // IEEE754_TYPES
56 
57 #define SQRT_THREE_OVER_TWO 0.8660254037844f
58 #define TWO_OVER_SQRT_THREE 1.15470053837926f
59 
60 
69 static __attribute__((always_inline))
70 void SVGEN_runCom(const float32_t oneOverDcBus_invV, const float32_t inValpha, const float32_t inVbeta, \
71  float32_t* pVa, float32_t* pVb, float32_t* pVc)
72 {
73  float32_t vmax_pu, vmin_pu, vcom_pu = 0;
74 
75  float32_t va_pu = inValpha * oneOverDcBus_invV;
76  float32_t vbeta_pu = inVbeta * oneOverDcBus_invV;
77 
78  float32_t va_tmp = -0.5f * va_pu;
79  float32_t vb_tmp = SQRT_THREE_OVER_TWO * vbeta_pu;
80 
81  //
82  // -0.5*Valpha + sqrt(3)/2 * Vbeta
83  //
84  float32_t vb_pu = va_tmp + vb_tmp;
85 
86  //
87  // -0.5*Valpha - sqrt(3)/2 * Vbeta
88  //
89  float32_t vc_pu = va_tmp - vb_tmp;
90 
91  //
92  // Find Vmax and Vmin
93  //
94  if(va_pu > vb_pu)
95  {
96  vmax_pu = va_pu;
97  vmin_pu = vb_pu;
98  }
99  else
100  {
101  vmax_pu = vb_pu;
102  vmin_pu = va_pu;
103  }
104  if(vc_pu > vmax_pu)
105  {
106  vmax_pu = vc_pu;
107  }
108  else if(vc_pu < vmin_pu)
109  {
110  vmin_pu = vc_pu;
111  }
112 
113  //
114  // Compute Vcom = 0.5*(Vmax+Vmin)
115  //
116  vcom_pu = 0.5f * (vmax_pu + vmin_pu);
117 
118  //
119  // Subtract common-mode term to achieve SV modulation
120  //
121  *pVa = (va_pu - vcom_pu);
122  *pVb = (vb_pu - vcom_pu);
123  *pVc = (vc_pu - vcom_pu);
124 
125 }
126 
135 static __attribute__((always_inline))
136 void SVGEN_runMax(const float32_t oneOverDcBus_invV, const float32_t inValpha, const float32_t inVbeta, \
137  float32_t* pVa, float32_t* pVb, float32_t* pVc)
138 {
139  float32_t vmax_pu = 0;
140 
141  float32_t va_pu = inValpha * oneOverDcBus_invV;
142  float32_t vbeta_pu = inVbeta * oneOverDcBus_invV;
143 
144  float32_t va_tmp = -0.5f * va_pu;
145  float32_t vb_tmp = SQRT_THREE_OVER_TWO * vbeta_pu;
146 
147  //
148  // -0.5*Valpha + sqrt(3)/2 * Vbeta
149  //
150  float32_t vb_pu = va_tmp + vb_tmp;
151 
152  //
153  // -0.5*Valpha - sqrt(3)/2 * Vbeta
154  //
155  float32_t vc_pu = va_tmp - vb_tmp;
156 
157  //
158  // Find Vmax
159  //
160  if(va_pu > vb_pu)
161  {
162  vmax_pu = va_pu;
163  }
164  else
165  {
166  vmax_pu = vb_pu;
167  }
168 
169  if(vc_pu > vmax_pu)
170  {
171  vmax_pu = vc_pu;
172  }
173 
174  //
175  // DPWM maximum modulation
176  //
177  *pVa = (va_pu - vmax_pu) + 0.5f;
178  *pVb = (vb_pu - vmax_pu) + 0.5f;
179  *pVc = (vc_pu - vmax_pu) + 0.5f;
180 }
181 
190 static __attribute__((always_inline))
191 void SVGEN_runMin(const float32_t oneOverDcBus_invV, const float32_t inValpha, const float32_t inVbeta, \
192  float32_t* pVa, float32_t* pVb, float32_t* pVc)
193 {
194  float32_t vmin_pu = 0;
195 
196  float32_t va_pu = inValpha * oneOverDcBus_invV;
197  float32_t vbeta_pu = inVbeta * oneOverDcBus_invV;
198 
199  float32_t va_tmp = -0.5f * va_pu;
200  float32_t vb_tmp = SQRT_THREE_OVER_TWO * vbeta_pu;
201 
202  //
203  // -0.5*Valpha + sqrt(3)/2 * Vbeta
204  //
205  float32_t vb_pu = va_tmp + vb_tmp;
206 
207  //
208  // -0.5*Valpha - sqrt(3)/2 * Vbeta
209  //
210  float32_t vc_pu = va_tmp - vb_tmp;
211 
212  //
213  // Find Vmin
214  //
215  if(va_pu < vb_pu)
216  {
217  vmin_pu = va_pu;
218  }
219  else
220  {
221  vmin_pu = vb_pu;
222  }
223 
224  if(vc_pu < vmin_pu)
225  {
226  vmin_pu = vc_pu;
227  }
228 
229  //
230  // DPWM minimum modulation
231  //
232  *pVa = (va_pu - vmin_pu) - 0.5f;
233  *pVb = (vb_pu - vmin_pu) - 0.5f;
234  *pVc = (vc_pu - vmin_pu) - 0.5f;
235 }
236 
244 static __attribute__((always_inline))
245 void SVGEN_clamp(const float32_t Umax, const float32_t Umin, \
246  float32_t* pVa, float32_t* pVb, float32_t* pVc)
247 {
248  *pVa = (*pVa > Umax) ? Umax : (*pVa < Umin) ? Umin : *pVa;
249  *pVb = (*pVb > Umax) ? Umax : (*pVb < Umin) ? Umin : *pVb;
250  *pVc = (*pVc > Umax) ? Umax : (*pVc < Umin) ? Umin : *pVc;
251 }
252 
255 #ifdef __cplusplus
256 }
257 #endif
258 
259 #endif // _SVGEN_H_
SVGEN_runCom
static void SVGEN_runCom(const float32_t oneOverDcBus_invV, const float32_t inValpha, const float32_t inVbeta, float32_t *pVa, float32_t *pVb, float32_t *pVc)
Implements a SVM that subtracts common-mode term to achieve SV modulation.
Definition: svgen.h:70
SVGEN_runMin
static void SVGEN_runMin(const float32_t oneOverDcBus_invV, const float32_t inValpha, const float32_t inVbeta, float32_t *pVa, float32_t *pVb, float32_t *pVc)
Implements a DPWM that uses minimum modulation.
Definition: svgen.h:191
SVGEN_runMax
static void SVGEN_runMax(const float32_t oneOverDcBus_invV, const float32_t inValpha, const float32_t inVbeta, float32_t *pVa, float32_t *pVb, float32_t *pVc)
Implements a DPWM that uses maximum modulation.
Definition: svgen.h:136
SVGEN_clamp
static void SVGEN_clamp(const float32_t Umax, const float32_t Umin, float32_t *pVa, float32_t *pVb, float32_t *pVc)
Saturates the SVM variable base on modulation limits.
Definition: svgen.h:245
float32_t
float float32_t
Definition: svgen.h:53
SQRT_THREE_OVER_TWO
#define SQRT_THREE_OVER_TWO
Definition: svgen.h:57
float64_t
double float64_t
Definition: svgen.h:54
float32_t
float float32_t
Definition: dcl_common.h:58