AM263x Motor Control SDK  09.01.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 typedef float float32_t;
52 
53 #define SQRT_THREE_OVER_TWO 0.8660254037844f
54 #define TWO_OVER_SQRT_THREE 1.15470053837926f
55 
56 
65 static __attribute__((always_inline))
66 void SVGEN_runCom(const float32_t oneOverDcBus_invV, const float32_t inValpha, const float32_t inVbeta, \
67  float32_t* pVa, float32_t* pVb, float32_t* pVc)
68 {
69  float32_t vmax_pu, vmin_pu, vcom_pu = 0;
70 
71  float32_t va_pu = inValpha * oneOverDcBus_invV;
72  float32_t vbeta_pu = inVbeta * oneOverDcBus_invV;
73 
74  float32_t va_tmp = -0.5f * va_pu;
75  float32_t vb_tmp = SQRT_THREE_OVER_TWO * vbeta_pu;
76 
77  //
78  // -0.5*Valpha + sqrt(3)/2 * Vbeta
79  //
80  float32_t vb_pu = va_tmp + vb_tmp;
81 
82  //
83  // -0.5*Valpha - sqrt(3)/2 * Vbeta
84  //
85  float32_t vc_pu = va_tmp - vb_tmp;
86 
87  //
88  // Find Vmax and Vmin
89  //
90  if(va_pu > vb_pu)
91  {
92  vmax_pu = va_pu;
93  vmin_pu = vb_pu;
94  }
95  else
96  {
97  vmax_pu = vb_pu;
98  vmin_pu = va_pu;
99  }
100  if(vc_pu > vmax_pu)
101  {
102  vmax_pu = vc_pu;
103  }
104  else if(vc_pu < vmin_pu)
105  {
106  vmin_pu = vc_pu;
107  }
108 
109  //
110  // Compute Vcom = 0.5*(Vmax+Vmin)
111  //
112  vcom_pu = 0.5f * (vmax_pu + vmin_pu);
113 
114  //
115  // Subtract common-mode term to achieve SV modulation
116  //
117  *pVa = (va_pu - vcom_pu);
118  *pVb = (vb_pu - vcom_pu);
119  *pVc = (vc_pu - vcom_pu);
120 
121 }
122 
131 static __attribute__((always_inline))
132 void SVGEN_runMax(const float32_t oneOverDcBus_invV, const float32_t inValpha, const float32_t inVbeta, \
133  float32_t* pVa, float32_t* pVb, float32_t* pVc)
134 {
135  float32_t vmax_pu = 0;
136 
137  float32_t va_pu = inValpha * oneOverDcBus_invV;
138  float32_t vbeta_pu = inVbeta * oneOverDcBus_invV;
139 
140  float32_t va_tmp = -0.5f * va_pu;
141  float32_t vb_tmp = SQRT_THREE_OVER_TWO * vbeta_pu;
142 
143  //
144  // -0.5*Valpha + sqrt(3)/2 * Vbeta
145  //
146  float32_t vb_pu = va_tmp + vb_tmp;
147 
148  //
149  // -0.5*Valpha - sqrt(3)/2 * Vbeta
150  //
151  float32_t vc_pu = va_tmp - vb_tmp;
152 
153  //
154  // Find Vmax
155  //
156  if(va_pu > vb_pu)
157  {
158  vmax_pu = va_pu;
159  }
160  else
161  {
162  vmax_pu = vb_pu;
163  }
164 
165  if(vc_pu > vmax_pu)
166  {
167  vmax_pu = vc_pu;
168  }
169 
170  //
171  // DPWM maximum modulation
172  //
173  *pVa = (va_pu - vmax_pu) + 0.5f;
174  *pVb = (vb_pu - vmax_pu) + 0.5f;
175  *pVc = (vc_pu - vmax_pu) + 0.5f;
176 }
177 
186 static __attribute__((always_inline))
187 void SVGEN_runMin(const float32_t oneOverDcBus_invV, const float32_t inValpha, const float32_t inVbeta, \
188  float32_t* pVa, float32_t* pVb, float32_t* pVc)
189 {
190  float32_t vmin_pu = 0;
191 
192  float32_t va_pu = inValpha * oneOverDcBus_invV;
193  float32_t vbeta_pu = inVbeta * oneOverDcBus_invV;
194 
195  float32_t va_tmp = -0.5f * va_pu;
196  float32_t vb_tmp = SQRT_THREE_OVER_TWO * vbeta_pu;
197 
198  //
199  // -0.5*Valpha + sqrt(3)/2 * Vbeta
200  //
201  float32_t vb_pu = va_tmp + vb_tmp;
202 
203  //
204  // -0.5*Valpha - sqrt(3)/2 * Vbeta
205  //
206  float32_t vc_pu = va_tmp - vb_tmp;
207 
208  //
209  // Find Vmin
210  //
211  if(va_pu < vb_pu)
212  {
213  vmin_pu = va_pu;
214  }
215  else
216  {
217  vmin_pu = vb_pu;
218  }
219 
220  if(vc_pu < vmin_pu)
221  {
222  vmin_pu = vc_pu;
223  }
224 
225  //
226  // DPWM minimum modulation
227  //
228  *pVa = (va_pu - vmin_pu) - 0.5f;
229  *pVb = (vb_pu - vmin_pu) - 0.5f;
230  *pVc = (vc_pu - vmin_pu) - 0.5f;
231 }
232 
240 static __attribute__((always_inline))
241 void SVGEN_clamp(const float32_t Umax, const float32_t Umin, \
242  float32_t* pVa, float32_t* pVb, float32_t* pVc)
243 {
244  *pVa = (*pVa > Umax) ? Umax : (*pVa < Umin) ? Umin : *pVa;
245  *pVb = (*pVb > Umax) ? Umax : (*pVb < Umin) ? Umin : *pVb;
246  *pVc = (*pVc > Umax) ? Umax : (*pVc < Umin) ? Umin : *pVc;
247 }
248 
251 #ifdef __cplusplus
252 }
253 #endif
254 
255 #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:66
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:187
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:132
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:241
float32_t
float float32_t
Definition: svgen.h:51
SQRT_THREE_OVER_TWO
#define SQRT_THREE_OVER_TWO
Definition: svgen.h:53
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