1/*
2 * File: rtwdemo_pmsmfoc.h
3 *
4 * Code generated for Simulink model 'rtwdemo_pmsmfoc'.
5 *
6 * Model version : 1.2949
7 * Simulink Coder version : 8.7 (R2014b) 11-Aug-2014
8 * C/C++ source code generated on : Sat Oct 11 02:05:41 2014
9 *
10 * Target selection: ert.tlc
11 * Embedded hardware selection: ARM Compatible->ARM Cortex
12 * Code generation objective: Execution efficiency
13 * Validation result: Not run
14 */
15
16#ifndef RTW_HEADER_rtwdemo_pmsmfoc_h_
17#define RTW_HEADER_rtwdemo_pmsmfoc_h_
18#include "rtwtypes.h"
19#include <float.h>
20#include <math.h>
21#include <string.h>
22#include <stddef.h>
23#ifndef rtwdemo_pmsmfoc_COMMON_INCLUDES_
24# define rtwdemo_pmsmfoc_COMMON_INCLUDES_
25#include "rtwtypes.h"
26#endif /* rtwdemo_pmsmfoc_COMMON_INCLUDES_ */
27
28#include "MW_target_hardware_resources.h"
29#include "mw_cmsis.h"
30
31/* Macros for accessing real-time model data structure */
32
33/* Forward declaration for rtModel */
34typedef struct tag_RTM RT_MODEL;
35
36#ifndef _DEFINED_TYPEDEF_FOR_EnumErrorType_
37#define _DEFINED_TYPEDEF_FOR_EnumErrorType_
38
39typedef enum {
40 NoError = 0, /* Default value */
41 MeasuredVelocityError
42} EnumErrorType;
43
44#endif
45
46#ifndef _DEFINED_TYPEDEF_FOR_EnumCommandType_
47#define _DEFINED_TYPEDEF_FOR_EnumCommandType_
48
49typedef enum {
50 Torque = 0, /* Default value */
51 Velocity,
52 Position
53} EnumCommandType;
54
55#endif
56
57#ifndef _DEFINED_TYPEDEF_FOR_EnumControllerMode_
58#define _DEFINED_TYPEDEF_FOR_EnumControllerMode_
59
60typedef enum {
61 StandBy = 0, /* Default value */
62 Startup,
63 TorqueControl,
64 VelocityControl,
65 PositionControl
66} EnumControllerMode;
67
68#endif
69
70#ifndef _DEFINED_TYPEDEF_FOR_SENSORS_STRUCT_
71#define _DEFINED_TYPEDEF_FOR_SENSORS_STRUCT_
72
73typedef struct {
74 uint16_T adc_phase_currents[2];
75 uint16_T encoder_valid;
76 uint16_T encoder_counter;
77} SENSORS_STRUCT;
78
79#endif
80
81#ifndef _DEFINED_TYPEDEF_FOR_CTRLPARAMS_STRUCT_
82#define _DEFINED_TYPEDEF_FOR_CTRLPARAMS_STRUCT_
83
84typedef struct {
85 real32_T Current_P;
86 real32_T Current_I;
87 real32_T Velocity_P;
88 real32_T Velocity_I;
89 real32_T Position_P;
90 real32_T Position_I;
91 real32_T StartupAcceleration;
92 real32_T StartupCurrent;
93 real32_T RampToStopVelocity;
94 real32_T AdcZeroOffsetDriverUnits;
95 real32_T AdcDriverUnitsToAmps;
96 real32_T EncoderToMechanicalZeroOffsetRads;
97 real32_T PmsmPolePairs;
98} CTRLPARAMS_STRUCT;
99
100#endif
101
102/* Block signals and states (auto storage) for system '<Root>' */
103typedef struct {
104 real32_T Merge; /* '<S5>/Merge' */
105 real32_T position; /* '<S65>/Integrate_To_Position' */
106 real32_T velocity_command; /* '<S1>/Controller_Mode_Scheduler' */
107 real32_T position_command; /* '<S1>/Controller_Mode_Scheduler' */
108 real32_T torque_command; /* '<S1>/Controller_Mode_Scheduler' */
109 real32_T Integrator_DSTATE; /* '<S17>/Integrator' */
110 real32_T Integrator_DSTATE_l; /* '<S18>/Integrator' */
111 real32_T Velocity_Delay_DSTATE; /* '<S60>/Velocity_Delay' */
112 real32_T Integrate_To_Position_DSTATE;/* '<S65>/Integrate_To_Position' */
113 real32_T Integrate_To_Velocity_DSTATE;/* '<S65>/Integrate_To_Velocity' */
114 real32_T Integrator_DSTATE_lc; /* '<S42>/Integrator' */
115 real32_T Integrator_DSTATE_f; /* '<S45>/Integrator' */
116 int32_T Position_Delay_DSTATE; /* '<S55>/Position_Delay' */
117 EnumErrorType error_l; /* '<Root>/Data Store Memory' */
118 int16_T DelayInput1_DSTATE; /* '<S13>/Delay Input1' */
119 uint16_T Position_Valid; /* '<S49>/Wait_For_Valid_Position' */
120 int8_T Integrator_PrevResetState; /* '<S17>/Integrator' */
121 int8_T SwitchCase_ActiveSubsystem; /* '<S5>/Switch Case' */
122 int8_T Integrator_PrevResetState_c; /* '<S18>/Integrator' */
123 uint8_T is_active_c2_rtwdemo_pmsmfoc;/* '<S49>/Wait_For_Valid_Position' */
124 uint8_T is_c2_rtwdemo_pmsmfoc; /* '<S49>/Wait_For_Valid_Position' */
125 uint8_T temporalCounter_i1; /* '<S49>/Wait_For_Valid_Position' */
126 uint8_T is_c1_rtwdemo_pmsmfoc; /* '<S1>/Controller_Mode_Scheduler' */
127 uint8_T is_Motor_On; /* '<S1>/Controller_Mode_Scheduler' */
128 uint8_T is_Motor_Control; /* '<S1>/Controller_Mode_Scheduler' */
129 boolean_T RelationalOperator_a; /* '<S51>/Relational Operator' */
130 boolean_T Lo_to_Hi_Rate_Transition3_Buffe;/* '<S6>/Lo_to_Hi_Rate_Transition3' */
131 boolean_T OpenLoopPosition_MODE; /* '<S51>/Open Loop Position' */
132} D_Work;
133
134/* Constant parameters (auto storage) */
135typedef struct {
136 /* Computed Parameter: Lookup_Table_table
137 * Referenced by: '<S28>/Lookup_Table'
138 */
139 uint16_T Lookup_Table_table[7];
140} ConstParam;
141
142/* Real-time Model Data Structure */
143struct tag_RTM {
144 /*
145 * Timing:
146 * The following substructure contains information regarding
147 * the timing information for the model.
148 */
149 struct {
150 struct {
151 uint8_T TID[2];
152 } TaskCounters;
153 } Timing;
154};
155
156/* Block signals and states (auto storage) */
157extern D_Work DWork;
158
159/* Constant parameters (auto storage) */
160extern const ConstParam ConstP;
161
162/*
163 * Exported Global Signals
164 *
165 * Note: Exported global signals are block signals with an exported global
166 * storage class designation. Code generation will declare the memory for
167 * these signals and export their symbols.
168 *
169 */
170extern real32_T phase_currents[2]; /* '<S48>/Product' */
171extern real32_T rotor_position; /* '<S49>/Add' */
172extern real32_T velocity_measured; /* '<S55>/Scale_Output' */
173extern real32_T d_current_error; /* '<S12>/Sum2' */
174extern real32_T q_current_command; /* '<S5>/Lo_to_Hi_Rate_Transition1' */
175extern real32_T q_current_measured; /* '<S22>/Add' */
176extern real32_T q_current_error; /* '<S12>/Sum' */
177extern real32_T phase_voltages[3]; /* '<S27>/Select_Sector' */
178extern real32_T velocity_error; /* '<S11>/Sum2' */
179extern EnumControllerMode controller_mode;/* '<S1>/Controller_Mode_Scheduler' */
180
181/*
182 * Exported Global Parameters
183 *
184 * Note: Exported global parameters are tunable parameters with an exported
185 * global storage class designation. Code generation will declare the memory for
186 * these parameters and exports their symbols.
187 *
188 */
189extern CTRLPARAMS_STRUCT ctrlParams; /* Variable: ctrlParams
190 * Referenced by:
191 * '<S1>/Controller_Mode_Scheduler'
192 * '<S48>/ADC_Driver_Units_To_Amps'
193 * '<S48>/ADC_Zero_Offset'
194 * '<S49>/Offset_Between_Encoder_Zero_And_Mechanical_Zero'
195 * '<S14>/number_of_pole_pairs'
196 * '<S42>/Integral Gain'
197 * '<S42>/Proportional Gain'
198 * '<S45>/Integral Gain'
199 * '<S45>/Proportional Gain'
200 * '<S65>/Startup_Acceleration_Constant'
201 * '<S17>/Integral Gain'
202 * '<S17>/Proportional Gain'
203 * '<S18>/Integral Gain'
204 * '<S18>/Proportional Gain'
205 */
206
207/* Model entry point functions */
208extern void Controller_Init(void);
209
210/* Customized model step function */
211extern EnumErrorType Controller(uint16_T motor_on, EnumCommandType command_type,
212 real32_T current_request, SENSORS_STRUCT *sensors, uint16_T pwm_compare[3]);
213
214/* Real-time Model object */
215extern RT_MODEL *const M;
216
217/*-
218 * The generated code includes comments that allow you to trace directly
219 * back to the appropriate location in the model. The basic format
220 * is <system>/block_name, where system is the system number (uniquely
221 * assigned by Simulink) and block_name is the name of the block.
222 *
223 * Use the MATLAB hilite_system command to trace the generated code back
224 * to the model. For example,
225 *
226 * hilite_system('<S3>') - opens system 3
227 * hilite_system('<S3>/Kp') - opens and selects block Kp which resides in S3
228 *
229 * Here is the system hierarchy for this model
230 *
231 * '<Root>' : 'rtwdemo_pmsmfoc'
232 * '<S1>' : 'rtwdemo_pmsmfoc/Mode_Scheduler'
233 * '<S2>' : 'rtwdemo_pmsmfoc/Model Info'
234 * '<S3>' : 'rtwdemo_pmsmfoc/Motor_Control'
235 * '<S4>' : 'rtwdemo_pmsmfoc/Mode_Scheduler/Controller_Mode_Scheduler'
236 * '<S5>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller'
237 * '<S6>' : 'rtwdemo_pmsmfoc/Motor_Control/Phase_Voltages_to_PWM_Compare_Values'
238 * '<S7>' : 'rtwdemo_pmsmfoc/Motor_Control/Sensors_To_Engineering_Units'
239 * '<S8>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control'
240 * '<S9>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Position_Control'
241 * '<S10>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Torque_Control'
242 * '<S11>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Velocity_Control'
243 * '<S12>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Current_Controllers'
244 * '<S13>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Detect_Change'
245 * '<S14>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Rotation_Coefficients_Sin_Cos'
246 * '<S15>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Transform_Coordinates_ABC_to_dq'
247 * '<S16>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Transform_Coordinates_dq_to_ABC'
248 * '<S17>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Current_Controllers/Direct_Current_Control'
249 * '<S18>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Current_Controllers/Quadrature_Current_Control'
250 * '<S19>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Current_Controllers/Direct_Current_Control/Clamping circuit'
251 * '<S20>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Current_Controllers/Quadrature_Current_Control/Clamping circuit'
252 * '<S21>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Transform_Coordinates_ABC_to_dq/Clarke_Transform'
253 * '<S22>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Transform_Coordinates_ABC_to_dq/Park_Transform'
254 * '<S23>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Transform_Coordinates_dq_to_ABC/Alpha_Beta_to_ABC'
255 * '<S24>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Transform_Coordinates_dq_to_ABC/Inverse_Park_Transform'
256 * '<S25>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Transform_Coordinates_dq_to_ABC/Alpha_Beta_to_ABC/Inverse_Clarke_Transform'
257 * '<S26>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Transform_Coordinates_dq_to_ABC/Alpha_Beta_to_ABC/Space_Vector_Modulation'
258 * '<S27>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Transform_Coordinates_dq_to_ABC/Alpha_Beta_to_ABC/Space_Vector_Modulation/Calculate_Phase_Voltages'
259 * '<S28>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Transform_Coordinates_dq_to_ABC/Alpha_Beta_to_ABC/Space_Vector_Modulation/Determine_Sector'
260 * '<S29>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Transform_Coordinates_dq_to_ABC/Alpha_Beta_to_ABC/Space_Vector_Modulation/Phase_Advanced_Inverse_Clarke'
261 * '<S30>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Transform_Coordinates_dq_to_ABC/Alpha_Beta_to_ABC/Space_Vector_Modulation/Calculate_Phase_Voltages/Va_Sectors_1_and_4'
262 * '<S31>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Transform_Coordinates_dq_to_ABC/Alpha_Beta_to_ABC/Space_Vector_Modulation/Calculate_Phase_Voltages/Va_Sectors_2_and_5'
263 * '<S32>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Transform_Coordinates_dq_to_ABC/Alpha_Beta_to_ABC/Space_Vector_Modulation/Calculate_Phase_Voltages/Va_Sectors_3_and_6'
264 * '<S33>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Transform_Coordinates_dq_to_ABC/Alpha_Beta_to_ABC/Space_Vector_Modulation/Calculate_Phase_Voltages/Vb_Sectors_1_and_4'
265 * '<S34>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Transform_Coordinates_dq_to_ABC/Alpha_Beta_to_ABC/Space_Vector_Modulation/Calculate_Phase_Voltages/Vb_Sectors_2_and_5'
266 * '<S35>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Transform_Coordinates_dq_to_ABC/Alpha_Beta_to_ABC/Space_Vector_Modulation/Calculate_Phase_Voltages/Vb_Sectors_3_and_6'
267 * '<S36>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Transform_Coordinates_dq_to_ABC/Alpha_Beta_to_ABC/Space_Vector_Modulation/Calculate_Phase_Voltages/Vc_Sectors_1_and_4'
268 * '<S37>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Transform_Coordinates_dq_to_ABC/Alpha_Beta_to_ABC/Space_Vector_Modulation/Calculate_Phase_Voltages/Vc_Sectors_2_and_5'
269 * '<S38>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Transform_Coordinates_dq_to_ABC/Alpha_Beta_to_ABC/Space_Vector_Modulation/Calculate_Phase_Voltages/Vc_Sectors_3_and_6'
270 * '<S39>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Transform_Coordinates_dq_to_ABC/Alpha_Beta_to_ABC/Space_Vector_Modulation/Determine_Sector/Compare_VA_To_Zero'
271 * '<S40>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Transform_Coordinates_dq_to_ABC/Alpha_Beta_to_ABC/Space_Vector_Modulation/Determine_Sector/Compare_VB_To_Zero'
272 * '<S41>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Current_Control/Transform_Coordinates_dq_to_ABC/Alpha_Beta_to_ABC/Space_Vector_Modulation/Determine_Sector/Compare_VC_To_Zero'
273 * '<S42>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Position_Control/Position_Control'
274 * '<S43>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Position_Control/Wrap_Error_pi'
275 * '<S44>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Position_Control/Position_Control/Clamping circuit'
276 * '<S45>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Velocity_Control/Rotor_Speed_Control'
277 * '<S46>' : 'rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller/Velocity_Control/Rotor_Speed_Control/Clamping circuit'
278 * '<S47>' : 'rtwdemo_pmsmfoc/Motor_Control/Phase_Voltages_to_PWM_Compare_Values/Enumerated_Constant'
279 * '<S48>' : 'rtwdemo_pmsmfoc/Motor_Control/Sensors_To_Engineering_Units/ADC_Level_to_Phase_Current'
280 * '<S49>' : 'rtwdemo_pmsmfoc/Motor_Control/Sensors_To_Engineering_Units/Encoder_To_Position'
281 * '<S50>' : 'rtwdemo_pmsmfoc/Motor_Control/Sensors_To_Engineering_Units/Position_To_Velocity'
282 * '<S51>' : 'rtwdemo_pmsmfoc/Motor_Control/Sensors_To_Engineering_Units/Startup_Open_Loop_Control'
283 * '<S52>' : 'rtwdemo_pmsmfoc/Motor_Control/Sensors_To_Engineering_Units/Encoder_To_Position/Wait_For_Valid_Position'
284 * '<S53>' : 'rtwdemo_pmsmfoc/Motor_Control/Sensors_To_Engineering_Units/Position_To_Velocity/Explicit_Angle_Wrap'
285 * '<S54>' : 'rtwdemo_pmsmfoc/Motor_Control/Sensors_To_Engineering_Units/Position_To_Velocity/Explicit_Angle_Wrap_With_Error'
286 * '<S55>' : 'rtwdemo_pmsmfoc/Motor_Control/Sensors_To_Engineering_Units/Position_To_Velocity/Implicit_Integer_Wrap_With_Error'
287 * '<S56>' : 'rtwdemo_pmsmfoc/Motor_Control/Sensors_To_Engineering_Units/Position_To_Velocity/Explicit_Angle_Wrap_With_Error/Detect_Velocity_Error'
288 * '<S57>' : 'rtwdemo_pmsmfoc/Motor_Control/Sensors_To_Engineering_Units/Position_To_Velocity/Explicit_Angle_Wrap_With_Error/Detect_Velocity_Error/Enumerated_Constant'
289 * '<S58>' : 'rtwdemo_pmsmfoc/Motor_Control/Sensors_To_Engineering_Units/Position_To_Velocity/Explicit_Angle_Wrap_With_Error/Detect_Velocity_Error/Generate_Error'
290 * '<S59>' : 'rtwdemo_pmsmfoc/Motor_Control/Sensors_To_Engineering_Units/Position_To_Velocity/Explicit_Angle_Wrap_With_Error/Detect_Velocity_Error/Generate_Error/Enumerated_Constant'
291 * '<S60>' : 'rtwdemo_pmsmfoc/Motor_Control/Sensors_To_Engineering_Units/Position_To_Velocity/Implicit_Integer_Wrap_With_Error/Detect_Velocity_Error'
292 * '<S61>' : 'rtwdemo_pmsmfoc/Motor_Control/Sensors_To_Engineering_Units/Position_To_Velocity/Implicit_Integer_Wrap_With_Error/Detect_Velocity_Error/Enumerated_Constant'
293 * '<S62>' : 'rtwdemo_pmsmfoc/Motor_Control/Sensors_To_Engineering_Units/Position_To_Velocity/Implicit_Integer_Wrap_With_Error/Detect_Velocity_Error/Generate_Error'
294 * '<S63>' : 'rtwdemo_pmsmfoc/Motor_Control/Sensors_To_Engineering_Units/Position_To_Velocity/Implicit_Integer_Wrap_With_Error/Detect_Velocity_Error/Generate_Error/Enumerated_Constant'
295 * '<S64>' : 'rtwdemo_pmsmfoc/Motor_Control/Sensors_To_Engineering_Units/Startup_Open_Loop_Control/Enumerated Constant'
296 * '<S65>' : 'rtwdemo_pmsmfoc/Motor_Control/Sensors_To_Engineering_Units/Startup_Open_Loop_Control/Open Loop Position'
297 */
298
299/*-
300 * Requirements for '<Root>': rtwdemo_pmsmfoc
301 */
302#endif /* RTW_HEADER_rtwdemo_pmsmfoc_h_ */
303
304/*
305 * File trailer for generated code.
306 *
307 * [EOF]
308 */
309