ssipd.h
Go to the documentation of this file.
1 //#############################################################################
2 // $TI Release: MotorControl SDK v1.00.00.00 $
3 // $Release Date: Mon Mar 11 18:37:40 CDT 2019 $
4 // $Copyright:
5 // Copyright (C) 2017-2018 Texas Instruments Incorporated - http://www.ti.com/
6 //
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions
9 // are met:
10 //
11 // Redistributions of source code must retain the above copyright
12 // notice, this list of conditions and the following disclaimer.
13 //
14 // Redistributions in binary form must reproduce the above copyright
15 // notice, this list of conditions and the following disclaimer in the
16 // documentation and/or other materials provided with the
17 // distribution.
18 //
19 // Neither the name of Texas Instruments Incorporated nor the names of
20 // its contributors may be used to endorse or promote products derived
21 // from this software without specific prior written permission.
22 //
23 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 // $
35 //#############################################################################
36 
37 #ifndef SSIPD_H
38 #define SSIPS_H
39 
44 
45 
46 //*****************************************************************************
47 //
48 // If building with a C++ compiler, make all of the definitions in this header
49 // have a C binding.
50 //
51 //*****************************************************************************
52 #ifdef __cplusplus
53 extern "C"
54 {
55 #endif
56 
57 //*****************************************************************************
58 //
61 //
62 //*****************************************************************************
63 
64 // the includes
65 #ifdef __TMS320C28XX_CLA__
66 #include "libraries/math/src/float/CLAmath.h"
67 #else
68 #include <math.h>
69 #endif
70 
72 
73 //modules
74 #include "userParams.h"
75 
76 
77 #define SSIPD_DEBUG 1
78 
79 #define SSIPD_DETECT_NUM 24.0f
80 #define SSIPD_BUFF_NUM (uint16_t)(SSIPD_DETECT_NUM + 2)
81 
82 //*****************************************************************************
83 //
85 //
86 //*****************************************************************************
87 typedef struct _SSIPD_obj_
88 {
89  float32_t VqSet_V; // Output: Injection voltage
90  float32_t VqInject_V; // Output: Injection voltage
93  float32_t angleTemp_rad; // Output: detection command angle
94  float32_t angleCmd_rad; // Output: detection command angle
95  float32_t angleOut_rad; // Output: detection output angle
96  float32_t angleInc_rad; // Output: detection delta angle
97  float32_t angleMax_rad; // Output: detection maximum angle
98 
99  uint16_t pulseWidth; //
100  uint16_t pulseCount; //
101  bool flagDirection; //
102  bool flagEnablePWM; //
103  bool flagDoneStatus; //
104  bool flagRunState; //
105 } SSIPD_Obj;
106 
107 //*****************************************************************************
108 //
110 //
111 //*****************************************************************************
112 typedef struct _SSIPD_obj_ *SSIPD_Handle;
113 
114 #ifdef SSIPD_DEBUG
117 extern uint16_t peakBuffcnt;
118 #endif // SSIPD_DEBUG
119 
120 //*****************************************************************************
121 //
122 // Prototypes for the APIs
123 //
124 //*****************************************************************************
129 extern SSIPD_Handle SSIPD_init(void *pMemory, const size_t numBytes);
130 
136 extern void SSIPD_setParams(SSIPD_Handle handle, const float32_t volSet_V,
137  const float32_t angleInc_rad, const uint16_t pulseWidth);
138 
139 
143 static inline bool SSIPD_getFlagEnablePWM(SSIPD_Handle handle)
144 {
145  SSIPD_Obj *obj = (SSIPD_Obj *)handle;
146 
147  return(obj->flagEnablePWM);
148 }
149 
153 static inline bool SSIPD_getRunState(SSIPD_Handle handle)
154 {
155  SSIPD_Obj *obj = (SSIPD_Obj *)handle;
156 
157  return(obj->flagRunState);
158 }
159 
164 {
165  SSIPD_Obj *obj = (SSIPD_Obj *)handle;
166 
167  return(obj->flagDoneStatus);
168 }
169 
174 {
175  SSIPD_Obj *obj = (SSIPD_Obj *)handle;
176 
177  return(obj->angleOut_rad);
178 }
179 
184 {
185  SSIPD_Obj *obj = (SSIPD_Obj *)handle;
186 
187  return(obj->angleCmd_rad);
188 }
189 
194 {
195  SSIPD_Obj *obj = (SSIPD_Obj *)handle;
196 
197  return(obj->VqInject_V);
198 }
199 
204 static inline void SSIPD_start(SSIPD_Handle handle)
205 {
206  SSIPD_Obj *obj = (SSIPD_Obj *)handle;
207 
208  obj->flagRunState = true;
209  obj->flagDirection = false;
210 
211  obj->pulseCount = 0;
212  obj->angleCmd_rad = 0.0f;
213  obj->angleTemp_rad = 0.0f;
214  obj->angleOut_rad = 0.0f;
215 
216  obj->IsPeak_A = 0.0f;
217 
218 #ifdef SSIPD_DEBUG
219  peakBuffcnt = 0;
220 #endif // SSIPD_DEBUG
221 
222 }
223 
228 static inline void SSIPD_reset(SSIPD_Handle handle)
229 {
230  SSIPD_Obj *obj = (SSIPD_Obj *)handle;
231 
232  obj->flagDoneStatus = false;
233  obj->flagEnablePWM = false;
234  obj->flagRunState = false;
235  obj->flagDirection = false;
236 
237  obj->pulseCount = 0;
238 
239  obj->angleCmd_rad = 0.0f;
240  obj->angleTemp_rad = 0.0f;
241  obj->angleOut_rad = 0.0f;
242 
243  obj->IsPeak_A = 0.0f;
244 
245 #ifdef SSIPD_DEBUG
246  peakBuffcnt = 0;
247 #endif // SSIPD_DEBUG
248 }
249 
254 static inline void SSIPD_inine_run(SSIPD_Handle handle, MATH_Vec2 *pIab)
255 {
256  SSIPD_Obj *obj = (SSIPD_Obj *)handle;
257 
258  obj->pulseCount++;
259 
260  if(obj->pulseCount >= (obj->pulseWidth<<4))
261  {
262  obj->pulseCount = 0;
263 
264  if(obj->flagDirection == false)
265  {
266  obj->angleTemp_rad += obj->angleInc_rad;
267  obj->angleCmd_rad = obj->angleTemp_rad;
268 
269  obj->flagDirection = true;
270  }
271  else
272  {
273  obj->angleCmd_rad = obj->angleTemp_rad + MATH_PI;
274 
275  obj->flagDirection = false;
276  }
277 
278 #ifdef SSIPD_DEBUG
281  peakBuffcnt++;
283  {
284  peakBuffcnt = 0;
285  }
286 #endif // SSIPD_DEBUG
287  }
288  else if(obj->pulseCount <= obj->pulseWidth)
289  {
290  obj->flagEnablePWM = true;
291 
292  obj->VqInject_V = obj->VqSet_V;
293 
294  obj->IsTemp_A = pIab->value[0] * pIab->value[0] + pIab->value[1] * pIab->value[1];
295 
296  if(obj->IsTemp_A > obj->IsPeak_A)
297  {
298  obj->IsPeak_A = obj->IsTemp_A;
299  obj->angleOut_rad = obj->angleCmd_rad;
300  }
301  }
302  else
303  {
304  obj->VqInject_V = 0.0f;
305  obj->flagEnablePWM = false;
306  }
307 
308  if(obj->angleTemp_rad > obj->angleMax_rad)
309  {
310  obj->VqInject_V = 0.0f;
311  obj->IsTemp_A = 0.0f;
312 
313  obj->flagEnablePWM = false;
314  obj->flagDoneStatus = true;
315  obj->flagRunState = false;
316  }
317 
318  return;
319 } // end of SSIPD_run() function
320 
321 //*****************************************************************************
322 //
323 // Close the Doxygen group.
325 //
326 //*****************************************************************************
327 
328 //*****************************************************************************
329 //
330 // Mark the end of the C bindings section for C++ compilers.
331 //
332 //*****************************************************************************
333 #ifdef __cplusplus
334 }
335 #endif
336 
337 #endif //end of SSIPD_H definition
_MATH_Vec2_
Defines a two element vector.
Definition: math.h:218
_SSIPD_obj_::angleMax_rad
float32_t angleMax_rad
Definition: ssipd.h:97
_SSIPD_obj_::flagRunState
bool flagRunState
Definition: ssipd.h:104
_SSIPD_obj_::IsPeak_A
float32_t IsPeak_A
Definition: ssipd.h:92
_SSIPD_obj_
Defines the SSIPD_Obj object.
Definition: ssipd.h:87
float32_t
float float32_t
Definition: sfra_f32.h:42
SSIPD_BUFF_NUM
#define SSIPD_BUFF_NUM
Definition: ssipd.h:80
SSIPD_reset
static void SSIPD_reset(SSIPD_Handle handle)
Runs six-pulse initial position detection.
Definition: ssipd.h:228
_SSIPD_obj_::flagEnablePWM
bool flagEnablePWM
Definition: ssipd.h:102
IsPeakBuff
float32_t IsPeakBuff[(uint16_t)(24.0f+2)]
_SSIPD_obj_::flagDirection
bool flagDirection
Definition: ssipd.h:101
_SSIPD_obj_::VqInject_V
float32_t VqInject_V
Definition: ssipd.h:90
_SSIPD_obj_::angleCmd_rad
float32_t angleCmd_rad
Definition: ssipd.h:94
MATH_PI
#define MATH_PI
Defines pi.
Definition: math.h:140
SSIPD_getAngleCmd_rad
static float32_t SSIPD_getAngleCmd_rad(SSIPD_Handle handle)
Gets the SSIPD state.
Definition: ssipd.h:183
math.h
SSIPD_init
SSIPD_Handle SSIPD_init(void *pMemory, const size_t numBytes)
Initializes the SSIPD object.
AngleBuff
float32_t AngleBuff[(uint16_t)(24.0f+2)]
_SSIPD_obj_::angleOut_rad
float32_t angleOut_rad
Definition: ssipd.h:95
_SSIPD_obj_::flagDoneStatus
bool flagDoneStatus
Definition: ssipd.h:103
_SSIPD_obj_::IsTemp_A
float32_t IsTemp_A
Definition: ssipd.h:91
SSIPD_getFlagEnablePWM
static bool SSIPD_getFlagEnablePWM(SSIPD_Handle handle)
Gets the enable PWM flag.
Definition: ssipd.h:143
_SSIPD_obj_::angleTemp_rad
float32_t angleTemp_rad
Definition: ssipd.h:93
_SSIPD_obj_::VqSet_V
float32_t VqSet_V
Definition: ssipd.h:89
SSIPD_inine_run
static void SSIPD_inine_run(SSIPD_Handle handle, MATH_Vec2 *pIab)
Runs six-pulse initial position detection.
Definition: ssipd.h:254
SSIPD_getDoneStatus
static float32_t SSIPD_getDoneStatus(SSIPD_Handle handle)
Gets the SSIPD state.
Definition: ssipd.h:163
_SSIPD_obj_::pulseCount
uint16_t pulseCount
Definition: ssipd.h:100
SSIPD_Obj
struct _SSIPD_obj_ SSIPD_Obj
Defines the SSIPD_Obj object.
SSIPD_getAngleOut_rad
static float32_t SSIPD_getAngleOut_rad(SSIPD_Handle handle)
Gets the SSIPD state.
Definition: ssipd.h:173
SSIPD_setParams
void SSIPD_setParams(SSIPD_Handle handle, const float32_t volSet_V, const float32_t angleInc_rad, const uint16_t pulseWidth)
Sets the SSIPD parameters.
_SSIPD_obj_::pulseWidth
uint16_t pulseWidth
Definition: ssipd.h:99
_SSIPD_obj_::angleInc_rad
float32_t angleInc_rad
Definition: ssipd.h:96
SSIPD_getVolInject_V
static float32_t SSIPD_getVolInject_V(SSIPD_Handle handle)
Gets the SSIPD state.
Definition: ssipd.h:193
SSIPD_Handle
struct _SSIPD_obj_ * SSIPD_Handle
Defines the SSIPD handle.
Definition: ssipd.h:112
peakBuffcnt
uint16_t peakBuffcnt
SSIPD_start
static void SSIPD_start(SSIPD_Handle handle)
Runs six-pulse initial position detection.
Definition: ssipd.h:204
SSIPD_getRunState
static bool SSIPD_getRunState(SSIPD_Handle handle)
Gets the SSIPD state.
Definition: ssipd.h:153
_MATH_Vec2_::value
float32_t value[2]
Definition: math.h:220

Copyright 2023, Texas Instruments Incorporated