1/*
2 * File: PMSM_Controller.c
3 *
4 * Code generated for Simulink model 'PMSM_Controller'.
5 *
6 * Model version : 1.1455
7 * Simulink Coder version : 9.4 (R2020b) 29-Jul-2020
8 * C/C++ source code generated on : Fri May 27 11:51:11 2022
9 *
10 * Target selection: ert.tlc
11 * Embedded hardware selection: ARM Compatible->ARM Cortex-M
12 * Code generation objectives:
13 * 1. Execution efficiency
14 * 2. RAM efficiency
15 * Validation result: Not run
16 */
17
18#include "PMSM_Controller.h"
19
20/* Named constants for Chart: '<S4>/Control_Mode_Manager' */
21#define IN_ACTIVE ((uint8_T)1U)
22#define IN_NO_ACTIVE_CHILD ((uint8_T)0U)
23#define IN_OPEN ((uint8_T)2U)
24#define IN_SPEED_MODE ((uint8_T)1U)
25#define IN_TORQUE_MODE ((uint8_T)2U)
26#define OPEN_MODE ((uint8_T)0U)
27#define SPD_MODE ((uint8_T)1U)
28#define TRQ_MODE ((uint8_T)2U)
29#ifndef UCHAR_MAX
30#include <limits.h>
31#endif
32
33#if ( UCHAR_MAX != (0xFFU) ) || ( SCHAR_MAX != (0x7F) )
34#error Code was generated for compiler with different sized uchar/char. \
35Consider adjusting Test hardware word size settings on the \
36Hardware Implementation pane to match your compiler word sizes as \
37defined in limits.h of the compiler. Alternatively, you can \
38select the Test hardware is the same as production hardware option and \
39select the Enable portable word sizes option on the Code Generation > \
40Verification pane for ERT based targets, which will disable the \
41preprocessor word size checks.
42#endif
43
44#if ( USHRT_MAX != (0xFFFFU) ) || ( SHRT_MAX != (0x7FFF) )
45#error Code was generated for compiler with different sized ushort/short. \
46Consider adjusting Test hardware word size settings on the \
47Hardware Implementation pane to match your compiler word sizes as \
48defined in limits.h of the compiler. Alternatively, you can \
49select the Test hardware is the same as production hardware option and \
50select the Enable portable word sizes option on the Code Generation > \
51Verification pane for ERT based targets, which will disable the \
52preprocessor word size checks.
53#endif
54
55#if ( UINT_MAX != (0xFFFFFFFFU) ) || ( INT_MAX != (0x7FFFFFFF) )
56#error Code was generated for compiler with different sized uint/int. \
57Consider adjusting Test hardware word size settings on the \
58Hardware Implementation pane to match your compiler word sizes as \
59defined in limits.h of the compiler. Alternatively, you can \
60select the Test hardware is the same as production hardware option and \
61select the Enable portable word sizes option on the Code Generation > \
62Verification pane for ERT based targets, which will disable the \
63preprocessor word size checks.
64#endif
65
66#if ( ULONG_MAX != (0xFFFFFFFFU) ) || ( LONG_MAX != (0x7FFFFFFF) )
67#error Code was generated for compiler with different sized ulong/long. \
68Consider adjusting Test hardware word size settings on the \
69Hardware Implementation pane to match your compiler word sizes as \
70defined in limits.h of the compiler. Alternatively, you can \
71select the Test hardware is the same as production hardware option and \
72select the Enable portable word sizes option on the Code Generation > \
73Verification pane for ERT based targets, which will disable the \
74preprocessor word size checks.
75#endif
76
77/* Skipping ulong_long/long_long check: insufficient preprocessor integer range. */
78extern int16_T rt_sqrt_Us32En10_Ys16E_7VJYwqF9(int32_T u);
79extern uint16_T rt_sqrt_Uu16En14_Yu16E_WMwW1mku(uint16_T u);
80uint16_T plook_u16s16_evencka(int16_T u, int16_T bp0, uint16_T bpSpace, uint32_T
81 maxIndex);
82extern void Low_Pass_Filter(const int16_T rtu_u[2], uint16_T rtu_coef, int16_T
83 rty_y[2], DW_Low_Pass_Filter *localDW);
84extern void PI_backCalc_fixdt_Init(DW_PI_backCalc_fixdt *localDW);
85extern int32_T PI_backCalc_fixdt(int32_T rtu_err, int16_T rtu_P, int16_T rtu_I,
86 int16_T rtu_Kb, int16_T rtu_satMax, int16_T rtu_satMin, int16_T rtu_init,
87 uint8_T rtu_reset, DW_PI_backCalc_fixdt *localDW, ZCE_PI_backCalc_fixdt
88 *localZCE);
89extern void PI_backCalc_fixdt_p_Init(DW_PI_backCalc_fixdt_i *localDW);
90extern int32_T PI_backCalc_fixdt_o(int16_T rtu_err, int16_T rtu_P, int16_T rtu_I,
91 int16_T rtu_Kb, int16_T rtu_satMax, int16_T rtu_satMin, int16_T rtu_init,
92 uint8_T rtu_reset, DW_PI_backCalc_fixdt_i *localDW, ZCE_PI_backCalc_fixdt_e
93 *localZCE);
94extern void RateInit(int16_T rtu_initVal, int16_T rtu_target, int16_T rtu_step,
95 int16_T *rty_s_step, int16_T *rty_High, int16_T *rty_Low);
96uint16_T plook_u16s16_evencka(int16_T u, int16_T bp0, uint16_T bpSpace, uint32_T
97 maxIndex)
98{
99 uint16_T bpIndex;
100
101 /* Prelookup - Index only
102 Index Search method: 'even'
103 Extrapolation method: 'Clip'
104 Use previous index: 'off'
105 Use last breakpoint for index at or above upper limit: 'on'
106 Remove protection against out-of-range input in generated code: 'off'
107 */
108 if (u <= bp0) {
109 bpIndex = 0U;
110 } else {
111 bpIndex = (uint16_T)((uint32_T)(uint16_T)(u - bp0) / bpSpace);
112 if (bpIndex < maxIndex) {
113 } else {
114 bpIndex = (uint16_T)maxIndex;
115 }
116 }
117
118 return bpIndex;
119}
120
121/*
122 * Output and update for atomic system:
123 * '<S48>/Low_Pass_Filter'
124 * '<S76>/Low_Pass_Filter'
125 */
126void Low_Pass_Filter(const int16_T rtu_u[2], uint16_T rtu_coef, int16_T rty_y[2],
127 DW_Low_Pass_Filter *localDW)
128{
129 int32_T rtb_Sum3_m;
130
131 /* Sum: '<S56>/Sum2' incorporates:
132 * UnitDelay: '<S56>/UnitDelay1'
133 */
134 rtb_Sum3_m = rtu_u[0] - (localDW->UnitDelay1_DSTATE[0] >> 16);
135 if (rtb_Sum3_m > 32767) {
136 rtb_Sum3_m = 32767;
137 } else {
138 if (rtb_Sum3_m < -32768) {
139 rtb_Sum3_m = -32768;
140 }
141 }
142
143 /* Sum: '<S56>/Sum3' incorporates:
144 * Product: '<S56>/Divide3'
145 * Sum: '<S56>/Sum2'
146 * UnitDelay: '<S56>/UnitDelay1'
147 */
148 rtb_Sum3_m = rtu_coef * rtb_Sum3_m + localDW->UnitDelay1_DSTATE[0];
149
150 /* DataTypeConversion: '<S56>/Data Type Conversion' */
151 rty_y[0] = (int16_T)(rtb_Sum3_m >> 16);
152
153 /* Update for UnitDelay: '<S56>/UnitDelay1' */
154 localDW->UnitDelay1_DSTATE[0] = rtb_Sum3_m;
155
156 /* Sum: '<S56>/Sum2' incorporates:
157 * UnitDelay: '<S56>/UnitDelay1'
158 */
159 rtb_Sum3_m = rtu_u[1] - (localDW->UnitDelay1_DSTATE[1] >> 16);
160 if (rtb_Sum3_m > 32767) {
161 rtb_Sum3_m = 32767;
162 } else {
163 if (rtb_Sum3_m < -32768) {
164 rtb_Sum3_m = -32768;
165 }
166 }
167
168 /* Sum: '<S56>/Sum3' incorporates:
169 * Product: '<S56>/Divide3'
170 * Sum: '<S56>/Sum2'
171 * UnitDelay: '<S56>/UnitDelay1'
172 */
173 rtb_Sum3_m = rtu_coef * rtb_Sum3_m + localDW->UnitDelay1_DSTATE[1];
174
175 /* DataTypeConversion: '<S56>/Data Type Conversion' */
176 rty_y[1] = (int16_T)(rtb_Sum3_m >> 16);
177
178 /* Update for UnitDelay: '<S56>/UnitDelay1' */
179 localDW->UnitDelay1_DSTATE[1] = rtb_Sum3_m;
180}
181
182/* System initialize for atomic system: '<S87>/PI_Speed' */
183void PI_backCalc_fixdt_Init(DW_PI_backCalc_fixdt *localDW)
184{
185 /* InitializeConditions for Delay: '<S90>/Resettable Delay' */
186 localDW->icLoad = 1U;
187}
188
189/* Output and update for atomic system: '<S87>/PI_Speed' */
190int32_T PI_backCalc_fixdt(int32_T rtu_err, int16_T rtu_P, int16_T rtu_I, int16_T
191 rtu_Kb, int16_T rtu_satMax, int16_T rtu_satMin, int16_T rtu_init, uint8_T
192 rtu_reset, DW_PI_backCalc_fixdt *localDW, ZCE_PI_backCalc_fixdt *localZCE)
193{
194 int32_T rty_pi_out_0;
195 int64_T tmp;
196 int64_T tmp_0;
197
198 /* Product: '<S89>/Divide4' */
199 tmp_0 = (int64_T)rtu_err * rtu_P;
200 if (tmp_0 > 2147483647LL) {
201 tmp_0 = 2147483647LL;
202 } else {
203 if (tmp_0 < -2147483648LL) {
204 tmp_0 = -2147483648LL;
205 }
206 }
207
208 /* Delay: '<S90>/Resettable Delay' incorporates:
209 * DataTypeConversion: '<S90>/Data Type Conversion2'
210 */
211 if ((rtu_reset > 0) && (localZCE->ResettableDelay_Reset_ZCE_f != POS_ZCSIG)) {
212 localDW->icLoad = 1U;
213 }
214
215 localZCE->ResettableDelay_Reset_ZCE_f = (ZCSigState)(rtu_reset > 0);
216 if (localDW->icLoad != 0) {
217 localDW->ResettableDelay_DSTATE = rtu_init << 7;
218 }
219
220 /* Product: '<S89>/Divide1' incorporates:
221 * Product: '<S89>/Divide4'
222 */
223 tmp = ((int64_T)(int32_T)tmp_0 * rtu_I) >> 14;
224 if (tmp > 2147483647LL) {
225 tmp = 2147483647LL;
226 } else {
227 if (tmp < -2147483648LL) {
228 tmp = -2147483648LL;
229 }
230 }
231
232 /* Sum: '<S89>/Sum2' incorporates:
233 * Product: '<S89>/Divide1'
234 * UnitDelay: '<S89>/UnitDelay'
235 */
236 tmp = (int64_T)(int32_T)tmp + localDW->UnitDelay_DSTATE;
237 if (tmp > 2147483647LL) {
238 tmp = 2147483647LL;
239 } else {
240 if (tmp < -2147483648LL) {
241 tmp = -2147483648LL;
242 }
243 }
244
245 /* Sum: '<S90>/Sum1' incorporates:
246 * Delay: '<S90>/Resettable Delay'
247 * Sum: '<S89>/Sum2'
248 */
249 tmp = (((int64_T)localDW->ResettableDelay_DSTATE << 2) + (int32_T)tmp) >> 2;
250 if (tmp > 2147483647LL) {
251 tmp = 2147483647LL;
252 } else {
253 if (tmp < -2147483648LL) {
254 tmp = -2147483648LL;
255 }
256 }
257
258 /* Sum: '<S89>/Sum6' incorporates:
259 * DataTypeConversion: '<S90>/Data Type Conversion1'
260 * Product: '<S89>/Divide4'
261 * Sum: '<S90>/Sum1'
262 */
263 tmp_0 = (int64_T)((int32_T)tmp << 2) + (int32_T)tmp_0;
264 if (tmp_0 > 2147483647LL) {
265 tmp_0 = 2147483647LL;
266 } else {
267 if (tmp_0 < -2147483648LL) {
268 tmp_0 = -2147483648LL;
269 }
270 }
271
272 /* RelationalOperator: '<S91>/LowerRelop1' incorporates:
273 * Switch: '<S91>/Switch2'
274 */
275 rty_pi_out_0 = rtu_satMax << 9;
276
277 /* Switch: '<S91>/Switch2' incorporates:
278 * RelationalOperator: '<S91>/LowerRelop1'
279 * Sum: '<S89>/Sum6'
280 */
281 if ((int32_T)tmp_0 <= rty_pi_out_0) {
282 /* RelationalOperator: '<S91>/UpperRelop' incorporates:
283 * Switch: '<S91>/Switch'
284 */
285 rty_pi_out_0 = rtu_satMin << 9;
286
287 /* Switch: '<S91>/Switch' incorporates:
288 * RelationalOperator: '<S91>/UpperRelop'
289 */
290 if ((int32_T)tmp_0 >= rty_pi_out_0) {
291 rty_pi_out_0 = (int32_T)tmp_0;
292 }
293 }
294
295 /* Update for UnitDelay: '<S89>/UnitDelay' incorporates:
296 * Product: '<S89>/Divide2'
297 * Sum: '<S89>/Sum3'
298 * Sum: '<S89>/Sum6'
299 */
300 localDW->UnitDelay_DSTATE = (int32_T)(((int64_T)(rty_pi_out_0 - (int32_T)tmp_0)
301 * rtu_Kb) >> 14);
302
303 /* Update for Delay: '<S90>/Resettable Delay' incorporates:
304 * Sum: '<S90>/Sum1'
305 */
306 localDW->icLoad = 0U;
307 localDW->ResettableDelay_DSTATE = (int32_T)tmp;
308 return rty_pi_out_0;
309}
310
311/*
312 * System initialize for atomic system:
313 * '<S95>/PI_backCalc_fixdt'
314 * '<S95>/PI_backCalc_fixdt1'
315 */
316void PI_backCalc_fixdt_p_Init(DW_PI_backCalc_fixdt_i *localDW)
317{
318 /* InitializeConditions for Delay: '<S102>/Resettable Delay' */
319 localDW->icLoad = 1U;
320}
321
322/*
323 * Output and update for atomic system:
324 * '<S95>/PI_backCalc_fixdt'
325 * '<S95>/PI_backCalc_fixdt1'
326 */
327int32_T PI_backCalc_fixdt_o(int16_T rtu_err, int16_T rtu_P, int16_T rtu_I,
328 int16_T rtu_Kb, int16_T rtu_satMax, int16_T rtu_satMin, int16_T rtu_init,
329 uint8_T rtu_reset, DW_PI_backCalc_fixdt_i *localDW, ZCE_PI_backCalc_fixdt_e
330 *localZCE)
331{
332 int32_T rty_pi_out_0;
333 int64_T tmp;
334 int64_T tmp_0;
335 int32_T rtb_Divide4_n;
336
337 /* Product: '<S100>/Divide4' */
338 rtb_Divide4_n = (rtu_err * rtu_P) >> 1;
339
340 /* Delay: '<S102>/Resettable Delay' incorporates:
341 * DataTypeConversion: '<S102>/Data Type Conversion2'
342 */
343 if ((rtu_reset > 0) && (localZCE->ResettableDelay_Reset_ZCE != POS_ZCSIG)) {
344 localDW->icLoad = 1U;
345 }
346
347 localZCE->ResettableDelay_Reset_ZCE = (ZCSigState)(rtu_reset > 0);
348 if (localDW->icLoad != 0) {
349 localDW->ResettableDelay_DSTATE = rtu_init << 7;
350 }
351
352 /* Product: '<S100>/Divide1' incorporates:
353 * Product: '<S100>/Divide4'
354 */
355 tmp_0 = ((int64_T)rtb_Divide4_n * rtu_I) >> 14;
356 if (tmp_0 > 2147483647LL) {
357 tmp_0 = 2147483647LL;
358 } else {
359 if (tmp_0 < -2147483648LL) {
360 tmp_0 = -2147483648LL;
361 }
362 }
363
364 /* Sum: '<S100>/Sum2' incorporates:
365 * Product: '<S100>/Divide1'
366 * UnitDelay: '<S100>/UnitDelay'
367 */
368 tmp_0 = (int64_T)(int32_T)tmp_0 + localDW->UnitDelay_DSTATE;
369 if (tmp_0 > 2147483647LL) {
370 tmp_0 = 2147483647LL;
371 } else {
372 if (tmp_0 < -2147483648LL) {
373 tmp_0 = -2147483648LL;
374 }
375 }
376
377 /* Sum: '<S102>/Sum1' incorporates:
378 * Delay: '<S102>/Resettable Delay'
379 * Sum: '<S100>/Sum2'
380 */
381 tmp_0 = (((int64_T)localDW->ResettableDelay_DSTATE << 2) + (int32_T)tmp_0) >>
382 2;
383 if (tmp_0 > 2147483647LL) {
384 tmp_0 = 2147483647LL;
385 } else {
386 if (tmp_0 < -2147483648LL) {
387 tmp_0 = -2147483648LL;
388 }
389 }
390
391 /* Sum: '<S100>/Sum6' incorporates:
392 * DataTypeConversion: '<S102>/Data Type Conversion1'
393 * Product: '<S100>/Divide4'
394 * Sum: '<S102>/Sum1'
395 */
396 tmp = (int64_T)((int32_T)tmp_0 << 2) + rtb_Divide4_n;
397 if (tmp > 2147483647LL) {
398 tmp = 2147483647LL;
399 } else {
400 if (tmp < -2147483648LL) {
401 tmp = -2147483648LL;
402 }
403 }
404
405 /* RelationalOperator: '<S103>/LowerRelop1' incorporates:
406 * Switch: '<S103>/Switch2'
407 */
408 rty_pi_out_0 = rtu_satMax << 9;
409
410 /* Switch: '<S103>/Switch2' incorporates:
411 * RelationalOperator: '<S103>/LowerRelop1'
412 * Sum: '<S100>/Sum6'
413 */
414 if ((int32_T)tmp <= rty_pi_out_0) {
415 /* RelationalOperator: '<S103>/UpperRelop' incorporates:
416 * Switch: '<S103>/Switch'
417 */
418 rty_pi_out_0 = rtu_satMin << 9;
419
420 /* Switch: '<S103>/Switch' incorporates:
421 * RelationalOperator: '<S103>/UpperRelop'
422 */
423 if ((int32_T)tmp >= rty_pi_out_0) {
424 rty_pi_out_0 = (int32_T)tmp;
425 }
426 }
427
428 /* Update for UnitDelay: '<S100>/UnitDelay' incorporates:
429 * Product: '<S100>/Divide2'
430 * Sum: '<S100>/Sum3'
431 * Sum: '<S100>/Sum6'
432 */
433 localDW->UnitDelay_DSTATE = (int32_T)(((int64_T)(rty_pi_out_0 - (int32_T)tmp) *
434 rtu_Kb) >> 14);
435
436 /* Update for Delay: '<S102>/Resettable Delay' incorporates:
437 * Sum: '<S102>/Sum1'
438 */
439 localDW->icLoad = 0U;
440 localDW->ResettableDelay_DSTATE = (int32_T)tmp_0;
441 return rty_pi_out_0;
442}
443
444/*
445 * Output and update for action system:
446 * '<S108>/RateInit'
447 * '<S115>/RateInit'
448 */
449void RateInit(int16_T rtu_initVal, int16_T rtu_target, int16_T rtu_step, int16_T
450 *rty_s_step, int16_T *rty_High, int16_T *rty_Low)
451{
452 int16_T rtb_Add_b;
453
454 /* Sum: '<S109>/Add' */
455 rtb_Add_b = (int16_T)((rtu_target - rtu_initVal) >> 1);
456
457 /* Signum: '<S109>/Sign' incorporates:
458 * Sum: '<S109>/Add'
459 */
460 if (rtb_Add_b < 0) {
461 rtb_Add_b = -1;
462 } else {
463 rtb_Add_b = (int16_T)(rtb_Add_b > 0);
464 }
465
466 /* End of Signum: '<S109>/Sign' */
467
468 /* Product: '<S109>/Divide' */
469 *rty_s_step = (int16_T)(rtu_step * rtb_Add_b);
470
471 /* MinMax: '<S109>/Max' */
472 if (rtu_target > rtu_initVal) {
473 *rty_High = rtu_target;
474 } else {
475 *rty_High = rtu_initVal;
476 }
477
478 /* End of MinMax: '<S109>/Max' */
479
480 /* MinMax: '<S109>/Max1' */
481 if (rtu_initVal < rtu_target) {
482 *rty_Low = rtu_initVal;
483 } else {
484 *rty_Low = rtu_target;
485 }
486
487 /* End of MinMax: '<S109>/Max1' */
488}
489
490int16_T rt_sqrt_Us32En10_Ys16E_7VJYwqF9(int32_T u)
491{
492 int32_T iBit;
493 int16_T shiftMask;
494 int16_T tmp01_y;
495 int16_T y;
496
497 /* Fixed-Point Sqrt Computation by the bisection method. */
498 if (u > 0) {
499 y = 0;
500 shiftMask = 16384;
501 for (iBit = 0; iBit < 15; iBit++) {
502 tmp01_y = (int16_T)(y | shiftMask);
503 if (tmp01_y * tmp01_y <= u) {
504 y = tmp01_y;
505 }
506
507 shiftMask = (int16_T)((uint32_T)shiftMask >> 1U);
508 }
509 } else {
510 y = 0;
511 }
512
513 return y;
514}
515
516uint16_T rt_sqrt_Uu16En14_Yu16E_WMwW1mku(uint16_T u)
517{
518 int32_T iBit;
519 uint32_T tmp03_u;
520 uint16_T shiftMask;
521 uint16_T tmp01_y;
522 uint16_T y;
523
524 /* Fixed-Point Sqrt Computation by the bisection method. */
525 if (u > 0) {
526 y = 0U;
527 shiftMask = 32768U;
528 tmp03_u = (uint32_T)u << 14;
529 for (iBit = 0; iBit < 16; iBit++) {
530 tmp01_y = (uint16_T)(y | shiftMask);
531 if ((uint32_T)tmp01_y * tmp01_y <= tmp03_u) {
532 y = tmp01_y;
533 }
534
535 shiftMask = (uint16_T)((uint32_T)shiftMask >> 1U);
536 }
537 } else {
538 y = 0U;
539 }
540
541 return y;
542}
543
544/* Model step function */
545void PMSM_Controller_step(RT_MODEL *const rtM)
546{
547 DW *rtDW = rtM->dwork;
548 PrevZCX *rtPrevZCX = rtM->prevZCSigState;
549 ExtU *rtU = (ExtU *) rtM->inputs;
550 ExtY *rtY = (ExtY *) rtM->outputs;
551 int64_T tmp;
552 uint64_T tmp_3;
553 int32_T rtb_Gain_b0;
554 int32_T rtb_Gain_p2;
555 int32_T rtb_Sum1;
556 int32_T rtb_Switch;
557 int32_T rtb_Switch3;
558 int32_T tmp_0;
559 int32_T tmp_1;
560 int32_T tmp_2;
561 uint32_T qY;
562 uint32_T rtb_Switch2;
563 int16_T rtb_Multiply[2];
564 int16_T rtb_UnitDelay1[2];
565 int16_T rtb_Divide1_m;
566 int16_T rtb_Divide3_k;
567 int16_T rtb_Sum1_a;
568 int16_T rtb_Sum3_jm;
569 int16_T rtb_Sum6_k;
570 int16_T rtb_Sum6_p;
571 int16_T rtb_Switch_f_idx_0;
572 int16_T rtb_Switch_f_idx_1;
573 int16_T rtb_r_cos_M1;
574 uint16_T rtb_BitwiseOperator2;
575 uint16_T rtb_LogicalOperator3;
576 int8_T UnitDelay3;
577 int8_T rtb_Sum2;
578 int8_T rtb_Sum2_tmp;
579 uint8_T rtb_Add_gf;
580 uint8_T rtb_DataTypeConversion_j;
581 uint8_T rtb_Sum_i;
582 uint8_T rtb_UnitDelay_bc;
583 uint8_T rtb_z_ctrlMod;
584 boolean_T rtb_Equal_k;
585 boolean_T rtb_LogicalOperator12;
586 boolean_T rtb_LogicalOperator2_h;
587 boolean_T rtb_LogicalOperator4_e;
588 boolean_T rtb_RelationalOperator4_f;
589 boolean_T rtb_n_commDeacv;
590
591 /* Outputs for Atomic SubSystem: '<Root>/PMSM_Controller' */
592 /* UnitDelay: '<S6>/UnitDelay1' */
593 rtb_UnitDelay1[0] = rtDW->UnitDelay1_DSTATE_f[0];
594 rtb_UnitDelay1[1] = rtDW->UnitDelay1_DSTATE_f[1];
595
596 /* S-Function (sfix_bitop): '<S4>/Bitwise Operator2' incorporates:
597 * Inport: '<Root>/FOC_Flags'
598 */
599 rtb_BitwiseOperator2 = (uint16_T)(rtU->FOC_Flags & 1);
600
601 /* UnitDelay: '<S37>/UnitDelay' */
602 rtb_UnitDelay_bc = rtDW->UnitDelay_DSTATE_j;
603
604 /* Logic: '<S9>/Edge_Detect' incorporates:
605 * Delay: '<S9>/Delay'
606 * Delay: '<S9>/Delay1'
607 * Delay: '<S9>/Delay2'
608 * Inport: '<Root>/hall_A'
609 * Inport: '<Root>/hall_B'
610 * Inport: '<Root>/hall_C'
611 */
612 rtb_Equal_k = (boolean_T)((rtU->hall_A != 0) ^ (rtDW->Delay_DSTATE_d != 0) ^
613 (rtU->hall_B != 0) ^ (rtDW->Delay1_DSTATE != 0) ^ (rtU->hall_C != 0)) ^
614 (rtDW->Delay2_DSTATE != 0);
615
616 /* Sum: '<S11>/Add' incorporates:
617 * Gain: '<S11>/Gain'
618 * Gain: '<S11>/Gain1'
619 * Inport: '<Root>/hall_A'
620 * Inport: '<Root>/hall_B'
621 * Inport: '<Root>/hall_C'
622 */
623 rtb_Add_gf = (uint8_T)((uint32_T)(uint8_T)((uint32_T)(uint8_T)(rtU->hall_C <<
624 2) + (uint8_T)(rtU->hall_B << 1)) + rtU->hall_A);
625
626 /* If: '<S3>/If2' incorporates:
627 * If: '<S14>/If2'
628 * Inport: '<S20>/z_counterRawPrev'
629 * UnitDelay: '<S14>/UnitDelay3'
630 */
631 if (rtb_Equal_k) {
632 /* Outputs for IfAction SubSystem: '<S3>/Direction_Detection' incorporates:
633 * ActionPort: '<S8>/Action Port'
634 */
635 /* UnitDelay: '<S8>/UnitDelay3' */
636 UnitDelay3 = rtDW->Switch2_i;
637
638 /* End of Outputs for SubSystem: '<S3>/Direction_Detection' */
639
640 /* Selector: '<S11>/Selector' incorporates:
641 * Constant: '<S11>/vec_hallToPos'
642 */
643 rtb_Sum2_tmp = rtConstP.vec_hallToPos_Value[rtb_Add_gf];
644
645 /* Outputs for IfAction SubSystem: '<S3>/Direction_Detection' incorporates:
646 * ActionPort: '<S8>/Action Port'
647 */
648 /* Sum: '<S8>/Sum2' incorporates:
649 * Constant: '<S11>/vec_hallToPos'
650 * Selector: '<S11>/Selector'
651 * UnitDelay: '<S8>/UnitDelay2'
652 */
653 rtb_Sum2 = (int8_T)(rtb_Sum2_tmp - rtDW->UnitDelay2_DSTATE_j);
654
655 /* Switch: '<S8>/Switch2' incorporates:
656 * Constant: '<S8>/Constant20'
657 * Constant: '<S8>/Constant8'
658 * Logic: '<S8>/Logical Operator3'
659 * RelationalOperator: '<S8>/Relational Operator1'
660 * RelationalOperator: '<S8>/Relational Operator6'
661 */
662 if ((rtb_Sum2 == 1) || (rtb_Sum2 == -5)) {
663 /* Switch: '<S8>/Switch2' incorporates:
664 * Constant: '<S8>/Constant24'
665 */
666 rtDW->Switch2_i = 1;
667 } else {
668 /* Switch: '<S8>/Switch2' incorporates:
669 * Constant: '<S8>/Constant23'
670 */
671 rtDW->Switch2_i = -1;
672 }
673
674 /* End of Switch: '<S8>/Switch2' */
675
676 /* Update for UnitDelay: '<S8>/UnitDelay2' */
677 rtDW->UnitDelay2_DSTATE_j = rtb_Sum2_tmp;
678
679 /* End of Outputs for SubSystem: '<S3>/Direction_Detection' */
680
681 /* Outputs for IfAction SubSystem: '<S14>/Raw_Motor_Speed_Estimation' incorporates:
682 * ActionPort: '<S20>/Action Port'
683 */
684 /* RelationalOperator: '<S20>/Relational Operator4' */
685 rtb_RelationalOperator4_f = (rtDW->Switch2_i != UnitDelay3);
686 rtDW->z_counterRawPrev = rtDW->UnitDelay3_DSTATE;
687
688 /* Switch: '<S20>/Switch3' incorporates:
689 * Constant: '<S20>/Constant4'
690 * Inport: '<S20>/z_counterRawPrev'
691 * Logic: '<S20>/Logical Operator1'
692 * Switch: '<S20>/Switch2'
693 * UnitDelay: '<S14>/UnitDelay3'
694 * UnitDelay: '<S20>/UnitDelay1'
695 */
696 if (rtb_RelationalOperator4_f && rtDW->UnitDelay1_DSTATE_iv) {
697 rtb_Switch3 = 0;
698 } else {
699 if (rtb_RelationalOperator4_f) {
700 /* Switch: '<S20>/Switch2' incorporates:
701 * UnitDelay: '<S14>/UnitDelay4'
702 */
703 rtb_Switch2 = rtDW->UnitDelay4_DSTATE;
704 } else {
705 /* Sum: '<S20>/Sum13' incorporates:
706 * Switch: '<S20>/Switch2'
707 * UnitDelay: '<S20>/UnitDelay2'
708 * UnitDelay: '<S20>/UnitDelay3'
709 * UnitDelay: '<S20>/UnitDelay5'
710 */
711 tmp_3 = (((uint64_T)rtDW->UnitDelay2_DSTATE + rtDW->UnitDelay3_DSTATE_l)
712 + rtDW->UnitDelay5_DSTATE) + rtDW->z_counterRawPrev;
713 if (tmp_3 > 4294967295ULL) {
714 tmp_3 = 4294967295ULL;
715 }
716
717 /* Product: '<S20>/Divide13' incorporates:
718 * Constant: '<S20>/cf_speedCoef'
719 * Constant: '<S20>/cf_speedCoef1'
720 * Gain: '<S20>/g_Ha'
721 * Product: '<S20>/Divide'
722 * Sum: '<S20>/Sum13'
723 * Switch: '<S20>/Switch2'
724 */
725 tmp_3 = ((uint64_T)((10000000U / rtP.n_polePairs) << 2) << 4) /
726 (uint32_T)tmp_3;
727 if (tmp_3 > 4294967295ULL) {
728 tmp_3 = 4294967295ULL;
729 }
730
731 /* Switch: '<S20>/Switch2' incorporates:
732 * Product: '<S20>/Divide13'
733 */
734 rtb_Switch2 = (uint32_T)tmp_3;
735 }
736
737 rtb_Switch3 = (int32_T)rtb_Switch2;
738 }
739
740 /* End of Switch: '<S20>/Switch3' */
741
742 /* Product: '<S20>/Divide11' incorporates:
743 * Switch: '<S20>/Switch3'
744 */
745 rtDW->Divide11 = rtb_Switch3 * rtDW->Switch2_i;
746
747 /* Update for UnitDelay: '<S20>/UnitDelay1' */
748 rtDW->UnitDelay1_DSTATE_iv = rtb_RelationalOperator4_f;
749
750 /* Update for UnitDelay: '<S20>/UnitDelay2' incorporates:
751 * UnitDelay: '<S20>/UnitDelay3'
752 */
753 rtDW->UnitDelay2_DSTATE = rtDW->UnitDelay3_DSTATE_l;
754
755 /* Update for UnitDelay: '<S20>/UnitDelay3' incorporates:
756 * UnitDelay: '<S20>/UnitDelay5'
757 */
758 rtDW->UnitDelay3_DSTATE_l = rtDW->UnitDelay5_DSTATE;
759
760 /* Update for UnitDelay: '<S20>/UnitDelay5' */
761 rtDW->UnitDelay5_DSTATE = rtDW->z_counterRawPrev;
762
763 /* End of Outputs for SubSystem: '<S14>/Raw_Motor_Speed_Estimation' */
764 }
765
766 /* End of If: '<S3>/If2' */
767
768 /* Switch: '<S14>/Switch2' incorporates:
769 * Constant: '<S14>/Constant4'
770 * Constant: '<S14>/z_maxCntRst'
771 * Gain: '<S14>/Gain'
772 * Inport: '<Root>/us_Count'
773 * Product: '<S20>/Divide11'
774 * RelationalOperator: '<S14>/Relational Operator2'
775 */
776 if (rtU->us_Count >= (rtP.n_hall_count_ps << 1)) {
777 rtb_Switch3 = 0;
778 } else {
779 rtb_Switch3 = rtDW->Divide11;
780 }
781
782 /* End of Switch: '<S14>/Switch2' */
783
784 /* Abs: '<S14>/Abs5' incorporates:
785 * Switch: '<S14>/Switch2'
786 */
787 if (rtb_Switch3 < 0) {
788 rtb_Switch2 = (uint32_T)-rtb_Switch3;
789 } else {
790 rtb_Switch2 = (uint32_T)rtb_Switch3;
791 }
792
793 /* End of Abs: '<S14>/Abs5' */
794
795 /* If: '<S14>/If1' */
796 if (rtb_Equal_k) {
797 /* Outputs for IfAction SubSystem: '<S14>/AdvCtrlDetect' incorporates:
798 * ActionPort: '<S19>/Action Port'
799 */
800 /* Relay: '<S19>/n_commDeacv' incorporates:
801 * Abs: '<S14>/Abs5'
802 */
803 rtDW->n_commDeacv_Mode = ((rtb_Switch2 >= 480U) || ((rtb_Switch2 > 240U) &&
804 rtDW->n_commDeacv_Mode));
805
806 /* RelationalOperator: '<S21>/Compare' incorporates:
807 * Constant: '<S21>/Constant'
808 * Relay: '<S19>/n_commDeacv'
809 * Sum: '<S19>/Sum13'
810 * UnitDelay: '<S19>/UnitDelay2'
811 * UnitDelay: '<S19>/UnitDelay3'
812 * UnitDelay: '<S19>/UnitDelay5'
813 */
814 rtDW->Compare = ((uint16_T)((uint32_T)(uint16_T)((uint32_T)(uint16_T)
815 ((uint32_T)rtDW->UnitDelay2_DSTATE_f + rtDW->UnitDelay3_DSTATE_lh) +
816 rtDW->UnitDelay5_DSTATE_f) + rtDW->n_commDeacv_Mode) >= 4);
817
818 /* Update for UnitDelay: '<S19>/UnitDelay2' incorporates:
819 * UnitDelay: '<S19>/UnitDelay3'
820 */
821 rtDW->UnitDelay2_DSTATE_f = rtDW->UnitDelay3_DSTATE_lh;
822
823 /* Update for UnitDelay: '<S19>/UnitDelay3' incorporates:
824 * UnitDelay: '<S19>/UnitDelay5'
825 */
826 rtDW->UnitDelay3_DSTATE_lh = rtDW->UnitDelay5_DSTATE_f;
827
828 /* Update for UnitDelay: '<S19>/UnitDelay5' incorporates:
829 * Logic: '<S19>/Logical Operator3'
830 * Relay: '<S19>/n_commDeacv'
831 */
832 rtDW->UnitDelay5_DSTATE_f = rtDW->n_commDeacv_Mode;
833
834 /* End of Outputs for SubSystem: '<S14>/AdvCtrlDetect' */
835 }
836
837 /* End of If: '<S14>/If1' */
838
839 /* Switch: '<S37>/Switch3' incorporates:
840 * Abs: '<S14>/Abs5'
841 * Abs: '<S37>/Abs4'
842 * Constant: '<S37>/CTRL_COMM4'
843 * Inport: '<Root>/b_motEna'
844 * Logic: '<S37>/Logical Operator1'
845 * RelationalOperator: '<S14>/Relational Operator9'
846 * RelationalOperator: '<S37>/Relational Operator7'
847 * S-Function (sfix_bitop): '<S37>/Bitwise Operator1'
848 * UnitDelay: '<S6>/UnitDelay1'
849 */
850 if ((rtb_UnitDelay_bc & 4U) != 0U) {
851 rtb_Equal_k = true;
852 } else {
853 if (rtDW->UnitDelay1_DSTATE_f[1] < 0) {
854 /* Abs: '<S37>/Abs4' incorporates:
855 * UnitDelay: '<S6>/UnitDelay1'
856 */
857 rtb_Sum6_p = (int16_T)-rtDW->UnitDelay1_DSTATE_f[1];
858 } else {
859 /* Abs: '<S37>/Abs4' incorporates:
860 * UnitDelay: '<S6>/UnitDelay1'
861 */
862 rtb_Sum6_p = rtDW->UnitDelay1_DSTATE_f[1];
863 }
864
865 rtb_Equal_k = (rtU->b_motEna && (rtb_Switch2 < 48U) && (rtb_Sum6_p > 9920));
866 }
867
868 /* End of Switch: '<S37>/Switch3' */
869
870 /* Sum: '<S37>/Sum' incorporates:
871 * Constant: '<S37>/CTRL_COMM'
872 * Constant: '<S37>/CTRL_COMM1'
873 * DataTypeConversion: '<S37>/Data Type Conversion3'
874 * Gain: '<S37>/g_Hb'
875 * Gain: '<S37>/g_Hb1'
876 * RelationalOperator: '<S37>/Relational Operator1'
877 * RelationalOperator: '<S37>/Relational Operator3'
878 */
879 rtb_Sum_i = (uint8_T)(((uint32_T)((rtb_Add_gf == 7) << 1) + (rtb_Add_gf == 0))
880 + (rtb_Equal_k << 2));
881
882 /* RelationalOperator: '<S37>/Relational Operator2' incorporates:
883 * Constant: '<S37>/CTRL_COMM2'
884 */
885 rtb_RelationalOperator4_f = (rtb_Sum_i != 0);
886
887 /* RelationalOperator: '<S42>/Relational Operator' incorporates:
888 * UnitDelay: '<S42>/UnitDelay'
889 */
890 rtb_n_commDeacv = (rtb_RelationalOperator4_f != rtDW->UnitDelay_DSTATE_n);
891
892 /* If: '<S38>/If2' incorporates:
893 * Inport: '<S40>/yPrev'
894 * Logic: '<S38>/Logical Operator1'
895 * Logic: '<S38>/Logical Operator2'
896 * Logic: '<S38>/Logical Operator3'
897 * Logic: '<S38>/Logical Operator4'
898 * UnitDelay: '<S38>/UnitDelay'
899 */
900 if (rtb_RelationalOperator4_f && (!rtDW->UnitDelay_DSTATE_k)) {
901 /* Outputs for IfAction SubSystem: '<S38>/Qualification' incorporates:
902 * ActionPort: '<S43>/Action Port'
903 */
904 /* Switch: '<S47>/Switch1' incorporates:
905 * Constant: '<S47>/Constant23'
906 * UnitDelay: '<S47>/UnitDelay'
907 */
908 if (rtb_n_commDeacv) {
909 rtb_LogicalOperator3 = 0U;
910 } else {
911 rtb_LogicalOperator3 = rtDW->UnitDelay_DSTATE_p;
912 }
913
914 /* End of Switch: '<S47>/Switch1' */
915
916 /* Switch: '<S43>/Switch2' incorporates:
917 * Constant: '<S37>/t_errQual'
918 * Constant: '<S43>/Constant6'
919 * RelationalOperator: '<S43>/Relational Operator2'
920 * Sum: '<S46>/Sum1'
921 */
922 rtb_n_commDeacv = (((uint16_T)(rtb_LogicalOperator3 + 1U) > 1600) ||
923 rtDW->UnitDelay_DSTATE_k);
924
925 /* MinMax: '<S46>/MinMax' incorporates:
926 * Constant: '<S43>/Constant6'
927 * Sum: '<S46>/Sum1'
928 */
929 if ((uint16_T)(rtb_LogicalOperator3 + 1U) < 1600) {
930 /* Update for UnitDelay: '<S47>/UnitDelay' */
931 rtDW->UnitDelay_DSTATE_p = (uint16_T)(rtb_LogicalOperator3 + 1U);
932 } else {
933 /* Update for UnitDelay: '<S47>/UnitDelay' */
934 rtDW->UnitDelay_DSTATE_p = 1600U;
935 }
936
937 /* End of MinMax: '<S46>/MinMax' */
938 /* End of Outputs for SubSystem: '<S38>/Qualification' */
939 } else if ((!rtb_RelationalOperator4_f) && rtDW->UnitDelay_DSTATE_k) {
940 /* Outputs for IfAction SubSystem: '<S38>/Dequalification' incorporates:
941 * ActionPort: '<S41>/Action Port'
942 */
943 /* Switch: '<S45>/Switch1' incorporates:
944 * Constant: '<S45>/Constant23'
945 * UnitDelay: '<S45>/UnitDelay'
946 */
947 if (rtb_n_commDeacv) {
948 rtb_LogicalOperator3 = 0U;
949 } else {
950 rtb_LogicalOperator3 = rtDW->UnitDelay_DSTATE_f;
951 }
952
953 /* End of Switch: '<S45>/Switch1' */
954
955 /* Switch: '<S41>/Switch2' incorporates:
956 * Constant: '<S37>/t_errDequal'
957 * Constant: '<S41>/Constant6'
958 * RelationalOperator: '<S41>/Relational Operator2'
959 * Sum: '<S44>/Sum1'
960 */
961 rtb_n_commDeacv = (((uint16_T)(rtb_LogicalOperator3 + 1U) <= 12000) &&
962 rtDW->UnitDelay_DSTATE_k);
963
964 /* MinMax: '<S44>/MinMax' incorporates:
965 * Constant: '<S41>/Constant6'
966 * Sum: '<S44>/Sum1'
967 */
968 if ((uint16_T)(rtb_LogicalOperator3 + 1U) < 12000) {
969 /* Update for UnitDelay: '<S45>/UnitDelay' */
970 rtDW->UnitDelay_DSTATE_f = (uint16_T)(rtb_LogicalOperator3 + 1U);
971 } else {
972 /* Update for UnitDelay: '<S45>/UnitDelay' */
973 rtDW->UnitDelay_DSTATE_f = 12000U;
974 }
975
976 /* End of MinMax: '<S44>/MinMax' */
977 /* End of Outputs for SubSystem: '<S38>/Dequalification' */
978 } else {
979 /* Outputs for IfAction SubSystem: '<S38>/Default' incorporates:
980 * ActionPort: '<S40>/Action Port'
981 */
982 rtb_n_commDeacv = rtDW->UnitDelay_DSTATE_k;
983
984 /* End of Outputs for SubSystem: '<S38>/Default' */
985 }
986
987 /* End of If: '<S38>/If2' */
988
989 /* Logic: '<S25>/Logical Operator12' incorporates:
990 * Inport: '<Root>/b_motEna'
991 * Logic: '<S25>/Logical Operator7'
992 */
993 rtb_LogicalOperator12 = ((!rtb_n_commDeacv) && rtU->b_motEna);
994
995 /* Logic: '<S25>/Logical Operator4' incorporates:
996 * Constant: '<S25>/constant8'
997 * Inport: '<Root>/n_ctrlModReq'
998 * Logic: '<S25>/Logical Operator11'
999 * Logic: '<S25>/Logical Operator8'
1000 * RelationalOperator: '<S25>/Relational Operator10'
1001 */
1002 rtb_LogicalOperator4_e = ((rtb_BitwiseOperator2 != 0) || (!rtDW->Compare) || (
1003 !rtb_LogicalOperator12) || (rtU->n_ctrlModReq == 0));
1004
1005 /* Abs: '<S4>/Abs2' incorporates:
1006 * Switch: '<S14>/Switch2'
1007 */
1008 if (rtb_Switch3 < 0) {
1009 rtb_LogicalOperator3 = (uint16_T)((uint32_T)-rtb_Switch3 >> 4);
1010 } else {
1011 rtb_LogicalOperator3 = (uint16_T)((uint32_T)rtb_Switch3 >> 4);
1012 }
1013
1014 /* End of Abs: '<S4>/Abs2' */
1015
1016 /* Relay: '<S25>/n_SpeedCtrl' */
1017 rtDW->n_SpeedCtrl_Mode = ((rtb_LogicalOperator3 >= 300) ||
1018 ((rtb_LogicalOperator3 > 200) && rtDW->n_SpeedCtrl_Mode));
1019
1020 /* Logic: '<S25>/Logical Operator10' incorporates:
1021 * Inport: '<Root>/b_cruiseEna'
1022 * Relay: '<S25>/n_SpeedCtrl'
1023 */
1024 rtb_Equal_k = (rtDW->n_SpeedCtrl_Mode && rtU->b_cruiseEna);
1025
1026 /* Logic: '<S25>/Logical Operator2' incorporates:
1027 * Constant: '<S25>/constant'
1028 * Inport: '<Root>/n_ctrlModReq'
1029 * Logic: '<S25>/Logical Operator5'
1030 * RelationalOperator: '<S25>/Relational Operator4'
1031 */
1032 rtb_LogicalOperator2_h = ((rtU->n_ctrlModReq == 2) && (!rtb_Equal_k));
1033
1034 /* Logic: '<S25>/Logical Operator1' incorporates:
1035 * Constant: '<S25>/constant1'
1036 * Inport: '<Root>/n_ctrlModReq'
1037 * RelationalOperator: '<S25>/Relational Operator1'
1038 */
1039 rtb_Equal_k = ((rtU->n_ctrlModReq == 1) || rtb_Equal_k);
1040
1041 /* Chart: '<S4>/Control_Mode_Manager' incorporates:
1042 * Logic: '<S25>/Logical Operator3'
1043 * Logic: '<S25>/Logical Operator6'
1044 * Logic: '<S25>/Logical Operator9'
1045 */
1046 if (rtDW->is_active_c5_PMSM_Controller == 0U) {
1047 rtDW->is_active_c5_PMSM_Controller = 1U;
1048 rtDW->is_c5_PMSM_Controller = IN_OPEN;
1049 rtb_z_ctrlMod = OPEN_MODE;
1050 } else if (rtDW->is_c5_PMSM_Controller == 1) {
1051 if (rtb_LogicalOperator4_e) {
1052 rtDW->is_ACTIVE = IN_NO_ACTIVE_CHILD;
1053 rtDW->is_c5_PMSM_Controller = IN_OPEN;
1054 rtb_z_ctrlMod = OPEN_MODE;
1055 } else if (rtDW->is_ACTIVE == 1) {
1056 rtb_z_ctrlMod = SPD_MODE;
1057 if (!rtb_Equal_k) {
1058 if (rtb_LogicalOperator2_h) {
1059 rtDW->is_ACTIVE = IN_TORQUE_MODE;
1060 rtb_z_ctrlMod = TRQ_MODE;
1061 } else {
1062 rtDW->is_ACTIVE = IN_SPEED_MODE;
1063 }
1064 }
1065 } else {
1066 /* case IN_TORQUE_MODE: */
1067 rtb_z_ctrlMod = TRQ_MODE;
1068 if (!rtb_LogicalOperator2_h) {
1069 rtDW->is_ACTIVE = IN_SPEED_MODE;
1070 rtb_z_ctrlMod = SPD_MODE;
1071 }
1072 }
1073 } else {
1074 /* case IN_OPEN: */
1075 rtb_z_ctrlMod = OPEN_MODE;
1076 if ((!rtb_LogicalOperator4_e) && (rtb_LogicalOperator2_h || rtb_Equal_k)) {
1077 rtDW->is_c5_PMSM_Controller = IN_ACTIVE;
1078 if (rtb_LogicalOperator2_h) {
1079 rtDW->is_ACTIVE = IN_TORQUE_MODE;
1080 rtb_z_ctrlMod = TRQ_MODE;
1081 } else {
1082 rtDW->is_ACTIVE = IN_SPEED_MODE;
1083 rtb_z_ctrlMod = SPD_MODE;
1084 }
1085 }
1086 }
1087
1088 /* End of Chart: '<S4>/Control_Mode_Manager' */
1089
1090 /* Gain: '<S52>/Multiply' incorporates:
1091 * Inport: '<Root>/adc_Pha'
1092 * Inport: '<Root>/adc_Phb'
1093 */
1094 rtb_Gain_b0 = (12351 * rtU->adc_Pha) >> 12;
1095 if (rtb_Gain_b0 > 32767) {
1096 rtb_Gain_b0 = 32767;
1097 } else {
1098 if (rtb_Gain_b0 < -32768) {
1099 rtb_Gain_b0 = -32768;
1100 }
1101 }
1102
1103 tmp_2 = (12351 * rtU->adc_Phb) >> 12;
1104 if (tmp_2 > 32767) {
1105 tmp_2 = 32767;
1106 } else {
1107 if (tmp_2 < -32768) {
1108 tmp_2 = -32768;
1109 }
1110 }
1111
1112 /* Sum: '<S48>/Add' incorporates:
1113 * Gain: '<S52>/Multiply'
1114 */
1115 tmp_0 = (int16_T)rtb_Gain_b0 + (int16_T)tmp_2;
1116 if (tmp_0 > 32767) {
1117 tmp_0 = 32767;
1118 } else {
1119 if (tmp_0 < -32768) {
1120 tmp_0 = -32768;
1121 }
1122 }
1123
1124 /* Sum: '<S48>/Add1' incorporates:
1125 * Sum: '<S48>/Add'
1126 */
1127 tmp_1 = -tmp_0;
1128 if (-tmp_0 > 32767) {
1129 tmp_1 = 32767;
1130 }
1131
1132 /* Sum: '<S55>/Add3' incorporates:
1133 * Gain: '<S52>/Multiply'
1134 * Sum: '<S48>/Add1'
1135 */
1136 tmp_0 = (int16_T)tmp_2 + (int16_T)tmp_1;
1137
1138 /* Gain: '<S55>/Gain' incorporates:
1139 * Gain: '<S52>/Multiply'
1140 */
1141 if ((int16_T)rtb_Gain_b0 > 16383) {
1142 rtb_Sum6_p = MAX_int16_T;
1143 } else if ((int16_T)rtb_Gain_b0 <= -16384) {
1144 rtb_Sum6_p = MIN_int16_T;
1145 } else {
1146 rtb_Sum6_p = (int16_T)((int16_T)rtb_Gain_b0 << 1);
1147 }
1148
1149 /* End of Gain: '<S55>/Gain' */
1150
1151 /* Sum: '<S55>/Add3' */
1152 if (tmp_0 > 16383) {
1153 rtb_Divide1_m = MAX_int16_T;
1154 } else if (tmp_0 <= -16384) {
1155 rtb_Divide1_m = MIN_int16_T;
1156 } else {
1157 rtb_Divide1_m = (int16_T)(tmp_0 << 1);
1158 }
1159
1160 /* Sum: '<S55>/Add' */
1161 rtb_Gain_b0 = ((rtb_Sum6_p << 1) - rtb_Divide1_m) >> 1;
1162 if (rtb_Gain_b0 > 32767) {
1163 rtb_Gain_b0 = 32767;
1164 } else {
1165 if (rtb_Gain_b0 < -32768) {
1166 rtb_Gain_b0 = -32768;
1167 }
1168 }
1169
1170 /* Gain: '<S55>/Gain1' incorporates:
1171 * Product: '<S57>/Divide1'
1172 * Sum: '<S55>/Add'
1173 */
1174 rtb_Divide1_m = (int16_T)((21845 * rtb_Gain_b0) >> 16);
1175
1176 /* Switch: '<S10>/Switch3' incorporates:
1177 * Constant: '<S10>/Constant16'
1178 * Constant: '<S10>/Constant2'
1179 * Constant: '<S11>/vec_hallToPos'
1180 * RelationalOperator: '<S10>/Relational Operator7'
1181 * Selector: '<S11>/Selector'
1182 * Sum: '<S10>/Sum1'
1183 */
1184 if (rtDW->Switch2_i == 1) {
1185 rtb_Sum2 = rtConstP.vec_hallToPos_Value[rtb_Add_gf];
1186 } else {
1187 rtb_Sum2 = (int8_T)(rtConstP.vec_hallToPos_Value[rtb_Add_gf] + 1);
1188 }
1189
1190 /* End of Switch: '<S10>/Switch3' */
1191
1192 /* MinMax: '<S10>/MinMax' incorporates:
1193 * Inport: '<Root>/us_Count'
1194 */
1195 if (rtU->us_Count < rtDW->z_counterRawPrev) {
1196 qY = rtU->us_Count;
1197 } else {
1198 qY = rtDW->z_counterRawPrev;
1199 }
1200
1201 /* End of MinMax: '<S10>/MinMax' */
1202
1203 /* Sum: '<S10>/Sum3' incorporates:
1204 * Product: '<S10>/Divide1'
1205 * Product: '<S10>/Divide3'
1206 */
1207 rtb_Sum3_jm = (int16_T)(((int16_T)((int16_T)(((uint64_T)qY << 14) /
1208 rtDW->z_counterRawPrev) * rtDW->Switch2_i) + (rtb_Sum2 << 14)) >> 2);
1209
1210 /* MinMax: '<S10>/MinMax1' incorporates:
1211 * Constant: '<S10>/Constant1'
1212 * Sum: '<S10>/Sum3'
1213 * Switch: '<S10>/Switch2'
1214 */
1215 if (rtb_Sum3_jm <= 0) {
1216 rtb_Sum3_jm = 0;
1217 }
1218
1219 /* End of MinMax: '<S10>/MinMax1' */
1220
1221 /* Sum: '<S15>/Add2' incorporates:
1222 * Constant: '<S15>/Constant2'
1223 * Product: '<S10>/Divide2'
1224 */
1225 rtb_Sum3_jm = (int16_T)((((15 * rtb_Sum3_jm) >> 4) + (rtP.i_hall_offset << 2))
1226 >> 2);
1227
1228 /* DataTypeConversion: '<S15>/Data Type Conversion' incorporates:
1229 * Sum: '<S15>/Add2'
1230 */
1231 rtb_r_cos_M1 = (int16_T)(rtb_Sum3_jm >> 4);
1232
1233 /* If: '<S15>/If' incorporates:
1234 * Constant: '<S15>/Constant1'
1235 * Constant: '<S15>/Constant3'
1236 * Inport: '<S16>/In1'
1237 * Inport: '<S18>/In1'
1238 * Merge: '<S15>/Merge'
1239 * Sum: '<S15>/Add'
1240 * Sum: '<S15>/Add1'
1241 * Sum: '<S15>/Add2'
1242 */
1243 if (rtb_r_cos_M1 >= 360) {
1244 /* Outputs for IfAction SubSystem: '<S15>/If Action Subsystem' incorporates:
1245 * ActionPort: '<S16>/Action Port'
1246 */
1247 rtb_Sum3_jm = (int16_T)(rtb_Sum3_jm - 5760);
1248
1249 /* End of Outputs for SubSystem: '<S15>/If Action Subsystem' */
1250 } else {
1251 if (rtb_r_cos_M1 < 0) {
1252 /* Outputs for IfAction SubSystem: '<S15>/If Action Subsystem2' incorporates:
1253 * ActionPort: '<S18>/Action Port'
1254 */
1255 rtb_Sum3_jm = (int16_T)(rtb_Sum3_jm + 5760);
1256
1257 /* End of Outputs for SubSystem: '<S15>/If Action Subsystem2' */
1258 }
1259 }
1260
1261 /* End of If: '<S15>/If' */
1262
1263 /* If: '<S3>/If' incorporates:
1264 * Inport: '<Root>/FOC_Flags'
1265 */
1266 if ((rtU->FOC_Flags == 0) || (rtU->FOC_Flags == 2)) {
1267 /* Outputs for IfAction SubSystem: '<S3>/If Action Subsystem' incorporates:
1268 * ActionPort: '<S12>/Action Port'
1269 */
1270 /* Merge: '<S3>/Merge' incorporates:
1271 * Inport: '<S12>/In1'
1272 * Merge: '<S15>/Merge'
1273 */
1274 rtDW->Merge_i = rtb_Sum3_jm;
1275
1276 /* End of Outputs for SubSystem: '<S3>/If Action Subsystem' */
1277 } else {
1278 if (rtU->FOC_Flags == 1) {
1279 /* Outputs for IfAction SubSystem: '<S3>/If Action Subsystem1' incorporates:
1280 * ActionPort: '<S13>/Action Port'
1281 */
1282 /* Merge: '<S3>/Merge' incorporates:
1283 * Inport: '<Root>/theta_Open'
1284 * Inport: '<S13>/In1'
1285 */
1286 rtDW->Merge_i = rtU->theta_Open;
1287
1288 /* End of Outputs for SubSystem: '<S3>/If Action Subsystem1' */
1289 }
1290 }
1291
1292 /* End of If: '<S3>/If' */
1293
1294 /* PreLookup: '<S58>/a_elecAngle_XA' incorporates:
1295 * Merge: '<S3>/Merge'
1296 */
1297 rtb_LogicalOperator3 = plook_u16s16_evencka(rtDW->Merge_i, 0, 16U, 360U);
1298
1299 /* Sum: '<S55>/Add2' incorporates:
1300 * Gain: '<S52>/Multiply'
1301 * Sum: '<S48>/Add1'
1302 */
1303 rtb_Gain_b0 = (int16_T)tmp_2 - (int16_T)tmp_1;
1304 if (rtb_Gain_b0 > 32767) {
1305 rtb_Gain_b0 = 32767;
1306 } else {
1307 if (rtb_Gain_b0 < -32768) {
1308 rtb_Gain_b0 = -32768;
1309 }
1310 }
1311
1312 /* Gain: '<S55>/Gain2' incorporates:
1313 * Sum: '<S55>/Add2'
1314 * Sum: '<S57>/Sum6'
1315 */
1316 rtb_Sum6_p = (int16_T)((18919 * rtb_Gain_b0) >> 15);
1317
1318 /* Sum: '<S57>/Sum1' incorporates:
1319 * Interpolation_n-D: '<S58>/r_cos_M1'
1320 * Interpolation_n-D: '<S58>/r_sin_M1'
1321 * Product: '<S57>/Divide1'
1322 * Product: '<S57>/Divide2'
1323 * Product: '<S57>/Divide3'
1324 * Sum: '<S57>/Sum6'
1325 */
1326 rtb_Gain_b0 = ((rtb_Divide1_m * rtConstP.pooled8[rtb_LogicalOperator3]) >> 14)
1327 + (int16_T)((rtb_Sum6_p * rtConstP.pooled7[rtb_LogicalOperator3]) >> 14);
1328 if (rtb_Gain_b0 > 32767) {
1329 rtb_Gain_b0 = 32767;
1330 } else {
1331 if (rtb_Gain_b0 < -32768) {
1332 rtb_Gain_b0 = -32768;
1333 }
1334 }
1335
1336 /* SignalConversion generated from: '<S48>/Low_Pass_Filter' incorporates:
1337 * Sum: '<S57>/Sum1'
1338 */
1339 rtb_Multiply[0] = (int16_T)rtb_Gain_b0;
1340
1341 /* Sum: '<S57>/Sum6' incorporates:
1342 * Interpolation_n-D: '<S58>/r_cos_M1'
1343 * Interpolation_n-D: '<S58>/r_sin_M1'
1344 * Product: '<S57>/Divide1'
1345 * Product: '<S57>/Divide4'
1346 */
1347 rtb_Gain_b0 = (int16_T)((rtb_Sum6_p * rtConstP.pooled8[rtb_LogicalOperator3]) >>
1348 14) - ((rtb_Divide1_m * rtConstP.pooled7[rtb_LogicalOperator3]) >> 14);
1349 if (rtb_Gain_b0 > 32767) {
1350 rtb_Gain_b0 = 32767;
1351 } else {
1352 if (rtb_Gain_b0 < -32768) {
1353 rtb_Gain_b0 = -32768;
1354 }
1355 }
1356
1357 /* SignalConversion generated from: '<S48>/Low_Pass_Filter' incorporates:
1358 * Sum: '<S57>/Sum6'
1359 */
1360 rtb_Multiply[1] = (int16_T)rtb_Gain_b0;
1361
1362 /* Outputs for Atomic SubSystem: '<S48>/Low_Pass_Filter' */
1363 /* Constant: '<S48>/Constant' incorporates:
1364 * Outport: '<Root>/f_Idq'
1365 */
1366 Low_Pass_Filter(rtb_Multiply, rtP.f_lpf_idq, rtY->f_Idq,
1367 &rtDW->Low_Pass_Filter_d);
1368
1369 /* End of Outputs for SubSystem: '<S48>/Low_Pass_Filter' */
1370
1371 /* Switch: '<S24>/Switch' incorporates:
1372 * Constant: '<S24>/Constant3'
1373 * Inport: '<Root>/spd_Target'
1374 */
1375 if (rtU->spd_Target > 240) {
1376 /* Switch: '<S24>/Switch1' incorporates:
1377 * Constant: '<S24>/Constant1'
1378 * DataTypeConversion: '<S24>/Data Type Conversion'
1379 * Switch: '<S24>/Switch'
1380 */
1381 if (rtb_LogicalOperator12) {
1382 rtb_Switch = rtU->spd_Target;
1383 } else {
1384 rtb_Switch = 0;
1385 }
1386
1387 /* End of Switch: '<S24>/Switch1' */
1388 } else {
1389 rtb_Switch = 0;
1390 }
1391
1392 /* End of Switch: '<S24>/Switch' */
1393
1394 /* Switch: '<S24>/Switch3' incorporates:
1395 * Constant: '<S24>/Constant4'
1396 * DataTypeConversion: '<S24>/Data Type Conversion2'
1397 * Inport: '<Root>/vdq_Open'
1398 */
1399 if (rtb_LogicalOperator12) {
1400 rtb_Sum6_p = rtU->vdq_Open[1];
1401 } else {
1402 rtb_Sum6_p = 0;
1403 }
1404
1405 /* End of Switch: '<S24>/Switch3' */
1406
1407 /* Sum: '<S7>/Sum3' incorporates:
1408 * UnitDelay: '<S7>/UnitDelay1'
1409 */
1410 qY = rtDW->UnitDelay1_DSTATE + /*MW:OvSatOk*/ 1U;
1411 if (rtDW->UnitDelay1_DSTATE + 1U < 1U) {
1412 qY = MAX_uint32_T;
1413 }
1414
1415 /* RelationalOperator: '<S2>/Equal' incorporates:
1416 * Constant: '<S2>/Constant1'
1417 * Math: '<S2>/Rem'
1418 * Sum: '<S7>/Sum3'
1419 */
1420 rtb_Equal_k = (qY % 40U == 0U);
1421
1422 /* If: '<S26>/If' incorporates:
1423 * DataTypeConversion: '<S26>/Data Type Conversion1'
1424 * DataTypeConversion: '<S26>/Data Type Conversion2'
1425 * Inport: '<Root>/idq_Target'
1426 * Inport: '<S27>/vq_in'
1427 * Inport: '<S30>/r_currTgt'
1428 * Switch: '<S24>/Switch3'
1429 */
1430 if (rtb_BitwiseOperator2 == 1) {
1431 /* Switch: '<S24>/Switch2' incorporates:
1432 * Constant: '<S24>/Constant2'
1433 * DataTypeConversion: '<S24>/Data Type Conversion1'
1434 * Inport: '<Root>/vdq_Open'
1435 * Inport: '<S27>/vd_in'
1436 */
1437 if (rtb_LogicalOperator12) {
1438 /* Outputs for IfAction SubSystem: '<S26>/If Action Subsystem' incorporates:
1439 * ActionPort: '<S27>/Action Port'
1440 */
1441 rtDW->Merge[0] = rtU->vdq_Open[0];
1442
1443 /* End of Outputs for SubSystem: '<S26>/If Action Subsystem' */
1444 } else {
1445 /* Outputs for IfAction SubSystem: '<S26>/If Action Subsystem' incorporates:
1446 * ActionPort: '<S27>/Action Port'
1447 */
1448 rtDW->Merge[0] = 0;
1449
1450 /* End of Outputs for SubSystem: '<S26>/If Action Subsystem' */
1451 }
1452
1453 /* End of Switch: '<S24>/Switch2' */
1454
1455 /* Outputs for IfAction SubSystem: '<S26>/If Action Subsystem' incorporates:
1456 * ActionPort: '<S27>/Action Port'
1457 */
1458 rtDW->Merge[1] = rtb_Sum6_p;
1459
1460 /* End of Outputs for SubSystem: '<S26>/If Action Subsystem' */
1461 } else if ((rtb_z_ctrlMod == 0) && rtb_Equal_k) {
1462 /* Outputs for IfAction SubSystem: '<S26>/open_mode' incorporates:
1463 * ActionPort: '<S29>/Action Port'
1464 */
1465 /* RelationalOperator: '<S31>/Relational Operator' incorporates:
1466 * Switch: '<S24>/Switch3'
1467 * UnitDelay: '<S31>/UnitDelay'
1468 */
1469 rtb_LogicalOperator12 = (rtb_Sum6_p != rtDW->UnitDelay_DSTATE_e);
1470
1471 /* If: '<S32>/If' */
1472 if (rtb_LogicalOperator12) {
1473 /* Outputs for IfAction SubSystem: '<S32>/RateInit' incorporates:
1474 * ActionPort: '<S33>/Action Port'
1475 */
1476 /* Sum: '<S33>/Add' incorporates:
1477 * Switch: '<S24>/Switch3'
1478 * UnitDelay: '<S6>/UnitDelay1'
1479 */
1480 rtb_Divide1_m = (int16_T)((rtb_Sum6_p - rtDW->UnitDelay1_DSTATE_f[1]) >> 1);
1481
1482 /* Signum: '<S33>/Sign' incorporates:
1483 * Sum: '<S33>/Add'
1484 */
1485 if (rtb_Divide1_m < 0) {
1486 rtb_Divide1_m = -1;
1487 } else {
1488 rtb_Divide1_m = (int16_T)(rtb_Divide1_m > 0);
1489 }
1490
1491 /* End of Signum: '<S33>/Sign' */
1492
1493 /* Product: '<S33>/Divide' incorporates:
1494 * Constant: '<S29>/Constant5'
1495 */
1496 rtDW->Divide = (int16_T)(rtP.dz_OpenStepVol * rtb_Divide1_m);
1497
1498 /* MinMax: '<S33>/Max' incorporates:
1499 * Switch: '<S24>/Switch3'
1500 * UnitDelay: '<S6>/UnitDelay1'
1501 */
1502 if (rtb_Sum6_p > rtDW->UnitDelay1_DSTATE_f[1]) {
1503 /* MinMax: '<S33>/Max' */
1504 rtDW->Max_p = rtb_Sum6_p;
1505 } else {
1506 /* MinMax: '<S33>/Max' */
1507 rtDW->Max_p = rtDW->UnitDelay1_DSTATE_f[1];
1508 }
1509
1510 /* End of MinMax: '<S33>/Max' */
1511
1512 /* MinMax: '<S33>/Max1' incorporates:
1513 * Switch: '<S24>/Switch3'
1514 * UnitDelay: '<S6>/UnitDelay1'
1515 */
1516 if (rtDW->UnitDelay1_DSTATE_f[1] < rtb_Sum6_p) {
1517 /* MinMax: '<S33>/Max1' */
1518 rtDW->Max1_g = rtDW->UnitDelay1_DSTATE_f[1];
1519 } else {
1520 /* MinMax: '<S33>/Max1' */
1521 rtDW->Max1_g = rtb_Sum6_p;
1522 }
1523
1524 /* End of MinMax: '<S33>/Max1' */
1525 /* End of Outputs for SubSystem: '<S32>/RateInit' */
1526
1527 /* Switch: '<S36>/Switch1' incorporates:
1528 * UnitDelay: '<S6>/UnitDelay1'
1529 */
1530 rtb_r_cos_M1 = rtDW->UnitDelay1_DSTATE_f[1];
1531 } else {
1532 /* Switch: '<S36>/Switch1' incorporates:
1533 * UnitDelay: '<S36>/UnitDelay'
1534 */
1535 rtb_r_cos_M1 = rtDW->UnitDelay_DSTATE_fv;
1536 }
1537
1538 /* End of If: '<S32>/If' */
1539
1540 /* Switch: '<S32>/Switch' incorporates:
1541 * Constant: '<S32>/Constant'
1542 * Product: '<S33>/Divide'
1543 * RelationalOperator: '<S32>/Equal'
1544 * Switch: '<S24>/Switch3'
1545 * UnitDelay: '<S32>/Unit Delay'
1546 */
1547 if (rtb_Sum6_p != rtDW->UnitDelay_DSTATE_i) {
1548 rtb_Divide1_m = rtDW->Divide;
1549 } else {
1550 rtb_Divide1_m = 0;
1551 }
1552
1553 /* End of Switch: '<S32>/Switch' */
1554
1555 /* Sum: '<S35>/Add2' */
1556 rtb_Gain_b0 = ((rtb_r_cos_M1 << 2) + rtb_Divide1_m) >> 2;
1557 if (rtb_Gain_b0 > 32767) {
1558 rtb_Gain_b0 = 32767;
1559 } else {
1560 if (rtb_Gain_b0 < -32768) {
1561 rtb_Gain_b0 = -32768;
1562 }
1563 }
1564
1565 /* Switch: '<S34>/Switch2' incorporates:
1566 * MinMax: '<S33>/Max'
1567 * MinMax: '<S33>/Max1'
1568 * RelationalOperator: '<S34>/LowerRelop1'
1569 * RelationalOperator: '<S34>/UpperRelop'
1570 * Sum: '<S35>/Add2'
1571 * Switch: '<S34>/Switch'
1572 */
1573 if ((int16_T)rtb_Gain_b0 > rtDW->Max_p) {
1574 rtb_r_cos_M1 = rtDW->Max_p;
1575 } else if ((int16_T)rtb_Gain_b0 < rtDW->Max1_g) {
1576 /* Switch: '<S34>/Switch' incorporates:
1577 * MinMax: '<S33>/Max1'
1578 * Switch: '<S34>/Switch2'
1579 */
1580 rtb_r_cos_M1 = rtDW->Max1_g;
1581 } else {
1582 rtb_r_cos_M1 = (int16_T)rtb_Gain_b0;
1583 }
1584
1585 /* End of Switch: '<S34>/Switch2' */
1586
1587 /* Merge: '<S26>/Merge' incorporates:
1588 * Constant: '<S29>/Constant3'
1589 * SignalConversion generated from: '<S29>/open_voltage'
1590 */
1591 rtDW->Merge[0] = 0;
1592
1593 /* Switch: '<S29>/Switch' incorporates:
1594 * Switch: '<S24>/Switch'
1595 */
1596 if (rtb_Switch > 0) {
1597 /* Merge: '<S26>/Merge' incorporates:
1598 * SignalConversion generated from: '<S29>/open_voltage'
1599 * Switch: '<S34>/Switch2'
1600 */
1601 rtDW->Merge[1] = rtb_r_cos_M1;
1602 } else {
1603 /* Merge: '<S26>/Merge' incorporates:
1604 * Constant: '<S29>/Constant1'
1605 * SignalConversion generated from: '<S29>/open_voltage'
1606 */
1607 rtDW->Merge[1] = 0;
1608 }
1609
1610 /* End of Switch: '<S29>/Switch' */
1611
1612 /* Update for UnitDelay: '<S31>/UnitDelay' incorporates:
1613 * Switch: '<S24>/Switch3'
1614 */
1615 rtDW->UnitDelay_DSTATE_e = rtb_Sum6_p;
1616
1617 /* Switch: '<S36>/Switch2' */
1618 if (rtb_LogicalOperator12) {
1619 /* Update for UnitDelay: '<S36>/UnitDelay' incorporates:
1620 * UnitDelay: '<S6>/UnitDelay1'
1621 */
1622 rtDW->UnitDelay_DSTATE_fv = rtDW->UnitDelay1_DSTATE_f[1];
1623 } else {
1624 /* Update for UnitDelay: '<S36>/UnitDelay' incorporates:
1625 * Sum: '<S35>/Add2'
1626 */
1627 rtDW->UnitDelay_DSTATE_fv = (int16_T)rtb_Gain_b0;
1628 }
1629
1630 /* End of Switch: '<S36>/Switch2' */
1631
1632 /* Update for UnitDelay: '<S32>/Unit Delay' incorporates:
1633 * Switch: '<S34>/Switch2'
1634 */
1635 rtDW->UnitDelay_DSTATE_i = rtb_r_cos_M1;
1636
1637 /* End of Outputs for SubSystem: '<S26>/open_mode' */
1638 } else if (rtb_z_ctrlMod == 2) {
1639 /* Outputs for IfAction SubSystem: '<S26>/torque_mode' incorporates:
1640 * ActionPort: '<S30>/Action Port'
1641 */
1642 rtDW->r_currTgt = rtU->idq_Target;
1643
1644 /* Merge: '<S26>/Merge1' incorporates:
1645 * Inport: '<Root>/idq_Target'
1646 * Inport: '<S30>/r_currTgt'
1647 * Inport: '<S30>/r_spdTgt'
1648 * Switch: '<S24>/Switch'
1649 */
1650 rtDW->Merge1 = rtb_Switch;
1651
1652 /* End of Outputs for SubSystem: '<S26>/torque_mode' */
1653 } else {
1654 /* Outputs for IfAction SubSystem: '<S26>/If Action Subsystem1' incorporates:
1655 * ActionPort: '<S28>/Action Port'
1656 */
1657 /* Merge: '<S26>/Merge1' incorporates:
1658 * Inport: '<S28>/In1'
1659 * Switch: '<S24>/Switch'
1660 */
1661 rtDW->Merge1 = rtb_Switch;
1662
1663 /* End of Outputs for SubSystem: '<S26>/If Action Subsystem1' */
1664 }
1665
1666 /* End of If: '<S26>/If' */
1667
1668 /* Switch: '<S59>/Switch2' incorporates:
1669 * Inport: '<Root>/spd_Limit'
1670 * Merge: '<S26>/Merge1'
1671 * RelationalOperator: '<S59>/LowerRelop1'
1672 * RelationalOperator: '<S59>/UpperRelop'
1673 * Switch: '<S59>/Switch'
1674 */
1675 if (rtDW->Merge1 > rtU->spd_Limit) {
1676 rtb_Switch = rtU->spd_Limit;
1677 } else if (rtDW->Merge1 < 0) {
1678 /* Switch: '<S59>/Switch' incorporates:
1679 * Constant: '<S49>/Constant'
1680 * Switch: '<S59>/Switch2'
1681 */
1682 rtb_Switch = 0;
1683 } else {
1684 rtb_Switch = rtDW->Merge1;
1685 }
1686
1687 /* End of Switch: '<S59>/Switch2' */
1688
1689 /* If: '<S53>/If' incorporates:
1690 * Constant: '<S76>/Constant'
1691 * Logic: '<S71>/Logical Operator'
1692 * Switch: '<S71>/Switch2'
1693 */
1694 if ((rtb_z_ctrlMod != 0) && rtb_Equal_k) {
1695 /* Outputs for IfAction SubSystem: '<S53>/Do_Calc' incorporates:
1696 * ActionPort: '<S70>/Action Port'
1697 */
1698 /* Outputs for Atomic SubSystem: '<S76>/Low_Pass_Filter' */
1699 Low_Pass_Filter(rtb_UnitDelay1, rtP.f_lpf_vdq, rtb_Multiply,
1700 &rtDW->Low_Pass_Filter_h);
1701
1702 /* End of Outputs for SubSystem: '<S76>/Low_Pass_Filter' */
1703
1704 /* DataTypeConversion: '<S70>/Data Type Conversion' incorporates:
1705 * Constant: '<S76>/Constant'
1706 * RelationalOperator: '<S70>/Equal'
1707 * UnitDelay: '<S70>/Unit Delay'
1708 */
1709 rtb_DataTypeConversion_j = (uint8_T)(rtDW->UnitDelay_DSTATE_p2 !=
1710 rtb_z_ctrlMod);
1711
1712 /* If: '<S73>/If' incorporates:
1713 * Constant: '<S87>/Constant1'
1714 * Constant: '<S87>/Constant11'
1715 * Constant: '<S87>/Constant4'
1716 * Gain: '<S70>/Gain'
1717 * Sum: '<S87>/Sum1'
1718 * Switch: '<S14>/Switch2'
1719 * Switch: '<S59>/Switch2'
1720 * UnitDelay: '<S70>/Unit Delay1'
1721 */
1722 if (rtb_z_ctrlMod == 1) {
1723 rtb_Sum2 = 0;
1724
1725 /* Outputs for IfAction SubSystem: '<S73>/speed_mode' incorporates:
1726 * ActionPort: '<S87>/Action Port'
1727 */
1728 /* MinMax: '<S87>/Min' incorporates:
1729 * Constant: '<S87>/Constant6'
1730 * UnitDelay: '<S87>/Unit Delay'
1731 */
1732 if (4800 < rtDW->UnitDelay_DSTATE_l) {
1733 rtb_Sum6_p = 4800;
1734 } else {
1735 rtb_Sum6_p = rtDW->UnitDelay_DSTATE_l;
1736 }
1737
1738 /* End of MinMax: '<S87>/Min' */
1739
1740 /* MinMax: '<S87>/Min1' incorporates:
1741 * Constant: '<S87>/Constant2'
1742 * Gain: '<S87>/Gain'
1743 * UnitDelay: '<S87>/Unit Delay'
1744 */
1745 if ((int16_T)-rtDW->UnitDelay_DSTATE_l > -4800) {
1746 rtb_Divide1_m = (int16_T)-rtDW->UnitDelay_DSTATE_l;
1747 } else {
1748 rtb_Divide1_m = -4800;
1749 }
1750
1751 /* End of MinMax: '<S87>/Min1' */
1752
1753 /* Outputs for Atomic SubSystem: '<S87>/PI_Speed' */
1754 rtb_Sum1 = PI_backCalc_fixdt(rtb_Switch - rtb_Switch3, rtP.cf_nKp,
1755 rtP.cf_nKi, rtP.cf_nKb, rtb_Sum6_p, rtb_Divide1_m, (int16_T)
1756 ((rtP.cf_lastIqGain * rtDW->UnitDelay1_DSTATE_g) >> 15),
1757 rtb_DataTypeConversion_j, &rtDW->PI_Speed, &rtPrevZCX->PI_Speed);
1758
1759 /* End of Outputs for SubSystem: '<S87>/PI_Speed' */
1760
1761 /* Merge: '<S73>/Merge' incorporates:
1762 * Constant: '<S87>/Constant1'
1763 * Constant: '<S87>/Constant11'
1764 * Constant: '<S87>/Constant4'
1765 * DataTypeConversion: '<S87>/Data Type Conversion'
1766 * Gain: '<S70>/Gain'
1767 * Sum: '<S87>/Sum1'
1768 * Switch: '<S14>/Switch2'
1769 * Switch: '<S59>/Switch2'
1770 * Switch: '<S91>/Switch2'
1771 * UnitDelay: '<S70>/Unit Delay1'
1772 */
1773 rtDW->Merge_f = (int16_T)(rtb_Sum1 >> 9);
1774
1775 /* End of Outputs for SubSystem: '<S73>/speed_mode' */
1776 } else {
1777 rtb_Sum2 = 1;
1778
1779 /* Outputs for IfAction SubSystem: '<S73>/torque_mode' incorporates:
1780 * ActionPort: '<S88>/Action Port'
1781 */
1782 /* Sum: '<S88>/Sum1' incorporates:
1783 * Switch: '<S14>/Switch2'
1784 * Switch: '<S59>/Switch2'
1785 */
1786 rtb_Sum1 = rtb_Switch - rtb_Switch3;
1787
1788 /* Delay: '<S88>/Delay' incorporates:
1789 * Inport: '<S30>/r_currTgt'
1790 */
1791 if (rtDW->icLoad != 0) {
1792 rtDW->Delay_DSTATE = rtDW->r_currTgt;
1793 }
1794
1795 /* MinMax: '<S88>/Min' incorporates:
1796 * Delay: '<S88>/Delay'
1797 * Inport: '<S30>/r_currTgt'
1798 */
1799 if (rtDW->r_currTgt < rtDW->Delay_DSTATE) {
1800 rtb_Sum6_p = rtDW->r_currTgt;
1801 } else {
1802 rtb_Sum6_p = rtDW->Delay_DSTATE;
1803 }
1804
1805 /* End of MinMax: '<S88>/Min' */
1806
1807 /* Outputs for Atomic SubSystem: '<S88>/PI_TrqSpdLim' */
1808 /* Delay: '<S93>/Resettable Delay' incorporates:
1809 * DataTypeConversion: '<S93>/Data Type Conversion2'
1810 * Inport: '<S30>/r_currTgt'
1811 */
1812 if ((rtb_DataTypeConversion_j > 0) &&
1813 (rtPrevZCX->ResettableDelay_Reset_ZCE_a != 1)) {
1814 rtDW->icLoad_k = 1U;
1815 }
1816
1817 rtPrevZCX->ResettableDelay_Reset_ZCE_a = (ZCSigState)
1818 (rtb_DataTypeConversion_j > 0);
1819 if (rtDW->icLoad_k != 0) {
1820 rtDW->ResettableDelay_DSTATE = rtDW->r_currTgt << 7;
1821 }
1822
1823 /* Product: '<S92>/Divide1' incorporates:
1824 * Constant: '<S88>/Constant1'
1825 * Sum: '<S88>/Sum1'
1826 */
1827 tmp = (int64_T)rtb_Sum1 * rtP.cf_TrqLimKi;
1828 if (tmp > 2147483647LL) {
1829 tmp = 2147483647LL;
1830 } else {
1831 if (tmp < -2147483648LL) {
1832 tmp = -2147483648LL;
1833 }
1834 }
1835
1836 /* Sum: '<S92>/Sum2' incorporates:
1837 * Product: '<S92>/Divide1'
1838 * UnitDelay: '<S92>/Unit Delay'
1839 */
1840 if (((int32_T)tmp < 0) && (rtDW->UnitDelay_DSTATE < MIN_int32_T - (int32_T)
1841 tmp)) {
1842 rtb_Gain_b0 = MIN_int32_T;
1843 } else if (((int32_T)tmp > 0) && (rtDW->UnitDelay_DSTATE > MAX_int32_T
1844 - (int32_T)tmp)) {
1845 rtb_Gain_b0 = MAX_int32_T;
1846 } else {
1847 rtb_Gain_b0 = (int32_T)tmp + rtDW->UnitDelay_DSTATE;
1848 }
1849
1850 /* End of Sum: '<S92>/Sum2' */
1851
1852 /* Sum: '<S93>/Sum1' incorporates:
1853 * Delay: '<S93>/Resettable Delay'
1854 */
1855 tmp = (((int64_T)rtDW->ResettableDelay_DSTATE << 2) + rtb_Gain_b0) >> 2;
1856 if (tmp > 2147483647LL) {
1857 tmp = 2147483647LL;
1858 } else {
1859 if (tmp < -2147483648LL) {
1860 tmp = -2147483648LL;
1861 }
1862 }
1863
1864 rtb_Switch = (int32_T)tmp;
1865
1866 /* End of Sum: '<S93>/Sum1' */
1867
1868 /* Product: '<S92>/Divide4' incorporates:
1869 * Constant: '<S88>/Constant4'
1870 * Sum: '<S88>/Sum1'
1871 */
1872 tmp = (int64_T)rtb_Sum1 * rtP.cf_TrqLimKp;
1873 if (tmp > 2147483647LL) {
1874 tmp = 2147483647LL;
1875 } else {
1876 if (tmp < -2147483648LL) {
1877 tmp = -2147483648LL;
1878 }
1879 }
1880
1881 /* Sum: '<S92>/Sum6' incorporates:
1882 * DataTypeConversion: '<S93>/Data Type Conversion1'
1883 * Product: '<S92>/Divide4'
1884 * Sum: '<S93>/Sum1'
1885 */
1886 tmp = (int64_T)(rtb_Switch << 2) + (int32_T)tmp;
1887 if (tmp > 2147483647LL) {
1888 tmp = 2147483647LL;
1889 } else {
1890 if (tmp < -2147483648LL) {
1891 tmp = -2147483648LL;
1892 }
1893 }
1894
1895 rtb_Sum1 = (int32_T)tmp;
1896
1897 /* End of Sum: '<S92>/Sum6' */
1898
1899 /* RelationalOperator: '<S94>/LowerRelop1' incorporates:
1900 * MinMax: '<S88>/Min'
1901 * Switch: '<S94>/Switch2'
1902 */
1903 rtb_Gain_b0 = rtb_Sum6_p << 9;
1904
1905 /* Switch: '<S94>/Switch2' incorporates:
1906 * RelationalOperator: '<S94>/LowerRelop1'
1907 * Sum: '<S92>/Sum6'
1908 */
1909 if (rtb_Sum1 <= rtb_Gain_b0) {
1910 /* Gain: '<S92>/Gain' incorporates:
1911 * MinMax: '<S88>/Min'
1912 */
1913 rtb_Gain_b0 = -32768 * rtb_Sum6_p;
1914
1915 /* Switch: '<S94>/Switch' incorporates:
1916 * Gain: '<S92>/Gain'
1917 * RelationalOperator: '<S94>/UpperRelop'
1918 * Switch: '<S94>/Switch2'
1919 */
1920 if (((int64_T)rtb_Sum1 << 6) < rtb_Gain_b0) {
1921 rtb_Gain_b0 >>= 6;
1922 } else {
1923 rtb_Gain_b0 = rtb_Sum1;
1924 }
1925
1926 /* End of Switch: '<S94>/Switch' */
1927 }
1928
1929 /* Update for UnitDelay: '<S92>/Unit Delay' incorporates:
1930 * Constant: '<S88>/Constant2'
1931 * Product: '<S92>/Divide2'
1932 * Sum: '<S92>/Sum3'
1933 * Sum: '<S92>/Sum6'
1934 * Switch: '<S94>/Switch2'
1935 */
1936 rtDW->UnitDelay_DSTATE = (int32_T)(((int64_T)(rtb_Gain_b0 - rtb_Sum1) *
1937 rtP.cf_TrqLimKb) >> 10);
1938
1939 /* Update for Delay: '<S93>/Resettable Delay' incorporates:
1940 * Sum: '<S93>/Sum1'
1941 */
1942 rtDW->icLoad_k = 0U;
1943 rtDW->ResettableDelay_DSTATE = rtb_Switch;
1944
1945 /* End of Outputs for SubSystem: '<S88>/PI_TrqSpdLim' */
1946
1947 /* Merge: '<S73>/Merge' incorporates:
1948 * DataTypeConversion: '<S88>/Data Type Conversion'
1949 * ManualSwitch: '<S88>/Manual Switch'
1950 * Switch: '<S94>/Switch2'
1951 */
1952 rtDW->Merge_f = (int16_T)(rtb_Gain_b0 >> 9);
1953
1954 /* End of Outputs for SubSystem: '<S73>/torque_mode' */
1955 }
1956
1957 /* Outputs for IfAction SubSystem: '<S75>/MTPA_Calc' incorporates:
1958 * ActionPort: '<S80>/Action Port'
1959 */
1960 /* If: '<S75>/If' incorporates:
1961 * Constant: '<S80>/Constant3'
1962 * Merge: '<S75>/Merge'
1963 * Switch: '<S80>/Switch'
1964 */
1965 rtDW->Merge_c[0] = 0;
1966 rtDW->Merge_c[1] = rtDW->Merge_f;
1967
1968 /* End of Outputs for SubSystem: '<S75>/MTPA_Calc' */
1969
1970 /* Sum: '<S76>/Add' incorporates:
1971 * Inport: '<Root>/iDC_Limit'
1972 * Inport: '<Root>/vDC'
1973 * Math: '<S86>/Math Function3'
1974 * Merge: '<S75>/Merge'
1975 * Product: '<S49>/Divide'
1976 * Product: '<S76>/Divide'
1977 * Switch: '<S74>/Switch'
1978 */
1979 rtb_Switch = rtU->iDC_Limit * rtU->vDC - rtDW->Merge_c[0] * rtb_Multiply[0];
1980
1981 /* Product: '<S76>/Divide3' incorporates:
1982 * Constant: '<S76>/Constant5'
1983 * Math: '<S86>/Math Function3'
1984 */
1985 rtb_Gain_b0 = rtb_Switch / 9600;
1986 if (rtb_Gain_b0 > 32767) {
1987 rtb_Gain_b0 = 32767;
1988 } else {
1989 if (rtb_Gain_b0 < -32768) {
1990 rtb_Gain_b0 = -32768;
1991 }
1992 }
1993
1994 /* Product: '<S76>/Divide1' incorporates:
1995 * Math: '<S86>/Math Function3'
1996 */
1997 tmp_2 = rtb_Switch;
1998
1999 /* MinMax: '<S76>/Min2' incorporates:
2000 * Product: '<S76>/Divide3'
2001 */
2002 if (rtb_Multiply[1] > (int16_T)rtb_Gain_b0) {
2003 rtb_Divide1_m = rtb_Multiply[1];
2004 } else {
2005 rtb_Divide1_m = (int16_T)rtb_Gain_b0;
2006 }
2007
2008 /* End of MinMax: '<S76>/Min2' */
2009
2010 /* Product: '<S76>/Divide1' */
2011 rtb_Gain_b0 = tmp_2 / rtb_Divide1_m;
2012 if (rtb_Gain_b0 > 32767) {
2013 rtb_Gain_b0 = 32767;
2014 } else {
2015 if (rtb_Gain_b0 < -32768) {
2016 rtb_Gain_b0 = -32768;
2017 }
2018 }
2019
2020 /* Signum: '<S76>/Sign' incorporates:
2021 * Merge: '<S75>/Merge'
2022 * Switch: '<S74>/Switch'
2023 */
2024 if (rtDW->Merge_c[1] < 0) {
2025 rtb_Divide1_m = -1;
2026 } else {
2027 rtb_Divide1_m = (int16_T)(rtDW->Merge_c[1] > 0);
2028 }
2029
2030 /* End of Signum: '<S76>/Sign' */
2031
2032 /* Product: '<S76>/Divide2' incorporates:
2033 * Product: '<S76>/Divide1'
2034 */
2035 rtb_Sum6_p = (int16_T)((int16_T)rtb_Gain_b0 * rtb_Divide1_m);
2036
2037 /* Switch: '<S85>/Switch2' incorporates:
2038 * Constant: '<S76>/Constant3'
2039 * Product: '<S76>/Divide2'
2040 * RelationalOperator: '<S85>/LowerRelop1'
2041 * RelationalOperator: '<S85>/UpperRelop'
2042 * Switch: '<S85>/Switch'
2043 */
2044 if (rtb_Sum6_p > 4800) {
2045 rtb_Sum6_p = 4800;
2046 } else {
2047 if (rtb_Sum6_p < -4800) {
2048 /* Switch: '<S85>/Switch' incorporates:
2049 * Gain: '<S76>/Gain1'
2050 * Switch: '<S85>/Switch2'
2051 */
2052 rtb_Sum6_p = -4800;
2053 }
2054 }
2055
2056 /* End of Switch: '<S85>/Switch2' */
2057
2058 /* Switch: '<S76>/Switch' incorporates:
2059 * Merge: '<S75>/Merge'
2060 * MinMax: '<S76>/Min1'
2061 * Switch: '<S74>/Switch'
2062 * Switch: '<S85>/Switch2'
2063 */
2064 if (rtb_Divide1_m > 0) {
2065 /* MinMax: '<S76>/Min' incorporates:
2066 * Merge: '<S75>/Merge'
2067 * Switch: '<S74>/Switch'
2068 * Switch: '<S85>/Switch2'
2069 */
2070 if (rtb_Sum6_p < rtDW->Merge_c[1]) {
2071 /* Switch: '<S76>/Switch' */
2072 rtDW->Switch = rtb_Sum6_p;
2073 } else {
2074 /* Switch: '<S76>/Switch' */
2075 rtDW->Switch = rtDW->Merge_c[1];
2076 }
2077
2078 /* End of MinMax: '<S76>/Min' */
2079 } else if (rtb_Sum6_p > rtDW->Merge_c[1]) {
2080 /* MinMax: '<S76>/Min1' incorporates:
2081 * Switch: '<S76>/Switch'
2082 * Switch: '<S85>/Switch2'
2083 */
2084 rtDW->Switch = rtb_Sum6_p;
2085 } else {
2086 /* Switch: '<S76>/Switch' incorporates:
2087 * Merge: '<S75>/Merge'
2088 * Switch: '<S74>/Switch'
2089 */
2090 rtDW->Switch = rtDW->Merge_c[1];
2091 }
2092
2093 /* End of Switch: '<S76>/Switch' */
2094
2095 /* Switch: '<S84>/Switch2' incorporates:
2096 * Merge: '<S75>/Merge'
2097 * RelationalOperator: '<S84>/LowerRelop1'
2098 * RelationalOperator: '<S84>/UpperRelop'
2099 * Switch: '<S74>/Switch'
2100 * Switch: '<S84>/Switch'
2101 */
2102 if (rtDW->Merge_c[0] > 4800) {
2103 /* Switch: '<S84>/Switch2' incorporates:
2104 * Constant: '<S76>/Constant1'
2105 */
2106 rtDW->Switch2 = 4800;
2107 } else if (rtDW->Merge_c[0] < -4800) {
2108 /* Switch: '<S84>/Switch' incorporates:
2109 * Gain: '<S76>/Gain1'
2110 * Switch: '<S84>/Switch2'
2111 */
2112 rtDW->Switch2 = -4800;
2113 } else {
2114 /* Switch: '<S84>/Switch2' */
2115 rtDW->Switch2 = rtDW->Merge_c[0];
2116 }
2117
2118 /* End of Switch: '<S84>/Switch2' */
2119
2120 /* Update for UnitDelay: '<S70>/Unit Delay' */
2121 rtDW->UnitDelay_DSTATE_p2 = rtb_z_ctrlMod;
2122
2123 /* Update for UnitDelay: '<S70>/Unit Delay1' incorporates:
2124 * Merge: '<S73>/Merge'
2125 */
2126 rtDW->UnitDelay1_DSTATE_g = rtDW->Merge_f;
2127
2128 /* If: '<S73>/If' */
2129 switch (rtb_Sum2) {
2130 case 0:
2131 /* Update for IfAction SubSystem: '<S73>/speed_mode' incorporates:
2132 * ActionPort: '<S87>/Action Port'
2133 */
2134 /* Update for UnitDelay: '<S87>/Unit Delay' incorporates:
2135 * Math: '<S86>/Math Function2'
2136 * Math: '<S86>/Math Function3'
2137 * Merge: '<S75>/Merge'
2138 * Product: '<S76>/Divide1'
2139 * Sqrt: '<S86>/Sqrt1'
2140 * Sum: '<S86>/Add'
2141 * Switch: '<S74>/Switch'
2142 */
2143 rtDW->UnitDelay_DSTATE_l = rt_sqrt_Us32En10_Ys16E_7VJYwqF9(rtDW->Merge_c[0]
2144 * rtDW->Merge_c[0] + (int16_T)rtb_Gain_b0 * (int16_T)rtb_Gain_b0);
2145
2146 /* End of Update for SubSystem: '<S73>/speed_mode' */
2147 break;
2148
2149 case 1:
2150 /* Update for IfAction SubSystem: '<S73>/torque_mode' incorporates:
2151 * ActionPort: '<S88>/Action Port'
2152 */
2153 /* Update for Delay: '<S88>/Delay' incorporates:
2154 * Math: '<S86>/Math Function2'
2155 * Math: '<S86>/Math Function3'
2156 * Merge: '<S75>/Merge'
2157 * Product: '<S76>/Divide1'
2158 * Sqrt: '<S86>/Sqrt1'
2159 * Sum: '<S86>/Add'
2160 * Switch: '<S74>/Switch'
2161 */
2162 rtDW->icLoad = 0U;
2163 rtDW->Delay_DSTATE = rt_sqrt_Us32En10_Ys16E_7VJYwqF9(rtDW->Merge_c[0] *
2164 rtDW->Merge_c[0] + (int16_T)rtb_Gain_b0 * (int16_T)rtb_Gain_b0);
2165
2166 /* End of Update for SubSystem: '<S73>/torque_mode' */
2167 break;
2168 }
2169
2170 /* End of Outputs for SubSystem: '<S53>/Do_Calc' */
2171 }
2172
2173 /* End of If: '<S53>/If' */
2174
2175 /* RelationalOperator: '<S106>/Relational Operator' incorporates:
2176 * Switch: '<S84>/Switch2'
2177 * UnitDelay: '<S106>/UnitDelay'
2178 */
2179 rtb_Equal_k = (rtDW->Switch2 != rtDW->UnitDelay_DSTATE_h);
2180
2181 /* Sum: '<S97>/Add' incorporates:
2182 * Product: '<S60>/Divide1'
2183 * Switch: '<S84>/Switch2'
2184 * UnitDelay: '<S97>/Unit Delay1'
2185 */
2186 rtb_r_cos_M1 = (int16_T)(rtDW->Switch2 - rtDW->UnitDelay1_DSTATE_i);
2187
2188 /* Abs: '<S97>/Abs' incorporates:
2189 * Product: '<S60>/Divide1'
2190 */
2191 if (rtb_r_cos_M1 < 0) {
2192 rtb_r_cos_M1 = (int16_T)-rtb_r_cos_M1;
2193 }
2194
2195 /* End of Abs: '<S97>/Abs' */
2196
2197 /* Outputs for Enabled SubSystem: '<S97>/Enabled Subsystem' incorporates:
2198 * EnablePort: '<S107>/Enable'
2199 */
2200 /* If: '<S108>/If' incorporates:
2201 * Gain: '<S97>/Gain'
2202 * Product: '<S60>/Divide1'
2203 * UnitDelay: '<S97>/Unit Delay1'
2204 */
2205 if (rtb_Equal_k) {
2206 /* Outputs for IfAction SubSystem: '<S108>/RateInit' incorporates:
2207 * ActionPort: '<S109>/Action Port'
2208 */
2209 RateInit(rtDW->UnitDelay1_DSTATE_i, rtDW->Switch2, (int16_T)((13107 *
2210 rtb_r_cos_M1) >> 13), &rtDW->Divide_n, &rtDW->Max_g,
2211 &rtDW->Max1_j);
2212
2213 /* End of Outputs for SubSystem: '<S108>/RateInit' */
2214
2215 /* Switch: '<S112>/Switch1' incorporates:
2216 * Gain: '<S97>/Gain'
2217 * Product: '<S60>/Divide1'
2218 * UnitDelay: '<S97>/Unit Delay1'
2219 */
2220 rtb_Divide1_m = rtDW->UnitDelay1_DSTATE_i;
2221 } else {
2222 /* Switch: '<S112>/Switch1' incorporates:
2223 * UnitDelay: '<S112>/UnitDelay'
2224 */
2225 rtb_Divide1_m = rtDW->UnitDelay_DSTATE_b;
2226 }
2227
2228 /* End of If: '<S108>/If' */
2229 /* End of Outputs for SubSystem: '<S97>/Enabled Subsystem' */
2230
2231 /* Switch: '<S108>/Switch' incorporates:
2232 * Constant: '<S108>/Constant'
2233 * Product: '<S109>/Divide'
2234 * RelationalOperator: '<S108>/Equal'
2235 * Switch: '<S84>/Switch2'
2236 * UnitDelay: '<S108>/Unit Delay'
2237 */
2238 if (rtDW->Switch2 != rtDW->UnitDelay_DSTATE_g) {
2239 rtb_Sum6_p = rtDW->Divide_n;
2240 } else {
2241 rtb_Sum6_p = 0;
2242 }
2243
2244 /* End of Switch: '<S108>/Switch' */
2245
2246 /* Sum: '<S111>/Add2' */
2247 rtb_Gain_b0 = ((rtb_Divide1_m << 5) + rtb_Sum6_p) >> 5;
2248 if (rtb_Gain_b0 > 32767) {
2249 rtb_Gain_b0 = 32767;
2250 } else {
2251 if (rtb_Gain_b0 < -32768) {
2252 rtb_Gain_b0 = -32768;
2253 }
2254 }
2255
2256 /* Switch: '<S110>/Switch2' incorporates:
2257 * MinMax: '<S109>/Max'
2258 * MinMax: '<S109>/Max1'
2259 * RelationalOperator: '<S110>/LowerRelop1'
2260 * RelationalOperator: '<S110>/UpperRelop'
2261 * Sum: '<S111>/Add2'
2262 * Switch: '<S110>/Switch'
2263 */
2264 if ((int16_T)rtb_Gain_b0 > rtDW->Max_g) {
2265 rtb_Divide1_m = rtDW->Max_g;
2266 } else if ((int16_T)rtb_Gain_b0 < rtDW->Max1_j) {
2267 /* Switch: '<S110>/Switch' incorporates:
2268 * MinMax: '<S109>/Max1'
2269 * Switch: '<S110>/Switch2'
2270 */
2271 rtb_Divide1_m = rtDW->Max1_j;
2272 } else {
2273 rtb_Divide1_m = (int16_T)rtb_Gain_b0;
2274 }
2275
2276 /* End of Switch: '<S110>/Switch2' */
2277
2278 /* RelationalOperator: '<S113>/Relational Operator' incorporates:
2279 * Switch: '<S76>/Switch'
2280 * UnitDelay: '<S113>/UnitDelay'
2281 */
2282 rtb_LogicalOperator12 = (rtDW->Switch != rtDW->UnitDelay_DSTATE_o);
2283
2284 /* Sum: '<S98>/Add' incorporates:
2285 * Product: '<S60>/Divide1'
2286 * Switch: '<S76>/Switch'
2287 * UnitDelay: '<S98>/Unit Delay1'
2288 */
2289 rtb_r_cos_M1 = (int16_T)(rtDW->Switch - rtDW->UnitDelay1_DSTATE_b);
2290
2291 /* Abs: '<S98>/Abs' incorporates:
2292 * Product: '<S60>/Divide1'
2293 */
2294 if (rtb_r_cos_M1 < 0) {
2295 rtb_r_cos_M1 = (int16_T)-rtb_r_cos_M1;
2296 }
2297
2298 /* End of Abs: '<S98>/Abs' */
2299
2300 /* Outputs for Enabled SubSystem: '<S98>/Enabled Subsystem' incorporates:
2301 * EnablePort: '<S114>/Enable'
2302 */
2303 /* If: '<S115>/If' incorporates:
2304 * Gain: '<S98>/Gain'
2305 * Product: '<S60>/Divide1'
2306 * UnitDelay: '<S98>/Unit Delay1'
2307 */
2308 if (rtb_LogicalOperator12) {
2309 /* Outputs for IfAction SubSystem: '<S115>/RateInit' incorporates:
2310 * ActionPort: '<S116>/Action Port'
2311 */
2312 RateInit(rtDW->UnitDelay1_DSTATE_b, rtDW->Switch, (int16_T)((13107 *
2313 rtb_r_cos_M1) >> 13), &rtDW->Divide_l, &rtDW->Max, &rtDW->Max1);
2314
2315 /* End of Outputs for SubSystem: '<S115>/RateInit' */
2316
2317 /* Switch: '<S119>/Switch1' incorporates:
2318 * Gain: '<S98>/Gain'
2319 * Product: '<S60>/Divide1'
2320 * UnitDelay: '<S98>/Unit Delay1'
2321 */
2322 rtb_r_cos_M1 = rtDW->UnitDelay1_DSTATE_b;
2323 } else {
2324 /* Switch: '<S119>/Switch1' incorporates:
2325 * UnitDelay: '<S119>/UnitDelay'
2326 */
2327 rtb_r_cos_M1 = rtDW->UnitDelay_DSTATE_d;
2328 }
2329
2330 /* End of If: '<S115>/If' */
2331 /* End of Outputs for SubSystem: '<S98>/Enabled Subsystem' */
2332
2333 /* Switch: '<S115>/Switch' incorporates:
2334 * Constant: '<S115>/Constant'
2335 * Product: '<S116>/Divide'
2336 * RelationalOperator: '<S115>/Equal'
2337 * Switch: '<S76>/Switch'
2338 * UnitDelay: '<S115>/Unit Delay'
2339 */
2340 if (rtDW->Switch != rtDW->UnitDelay_DSTATE_a) {
2341 rtb_Sum6_p = rtDW->Divide_l;
2342 } else {
2343 rtb_Sum6_p = 0;
2344 }
2345
2346 /* End of Switch: '<S115>/Switch' */
2347
2348 /* Sum: '<S118>/Add2' */
2349 tmp_2 = ((rtb_r_cos_M1 << 5) + rtb_Sum6_p) >> 5;
2350 if (tmp_2 > 32767) {
2351 tmp_2 = 32767;
2352 } else {
2353 if (tmp_2 < -32768) {
2354 tmp_2 = -32768;
2355 }
2356 }
2357
2358 /* Switch: '<S117>/Switch2' incorporates:
2359 * MinMax: '<S116>/Max'
2360 * MinMax: '<S116>/Max1'
2361 * RelationalOperator: '<S117>/LowerRelop1'
2362 * RelationalOperator: '<S117>/UpperRelop'
2363 * Sum: '<S118>/Add2'
2364 * Switch: '<S117>/Switch'
2365 */
2366 if ((int16_T)tmp_2 > rtDW->Max) {
2367 rtb_Sum6_p = rtDW->Max;
2368 } else if ((int16_T)tmp_2 < rtDW->Max1) {
2369 /* Switch: '<S117>/Switch' incorporates:
2370 * MinMax: '<S116>/Max1'
2371 * Switch: '<S117>/Switch2'
2372 */
2373 rtb_Sum6_p = rtDW->Max1;
2374 } else {
2375 rtb_Sum6_p = (int16_T)tmp_2;
2376 }
2377
2378 /* End of Switch: '<S117>/Switch2' */
2379
2380 /* DataTypeConversion: '<S54>/Data Type Conversion' incorporates:
2381 * Logic: '<S54>/Logical Operator'
2382 * RelationalOperator: '<S54>/Equal'
2383 * UnitDelay: '<S54>/Unit Delay'
2384 */
2385 rtb_DataTypeConversion_j = (uint8_T)((rtb_z_ctrlMod != 0) &&
2386 (rtDW->UnitDelay_DSTATE_bm != rtb_z_ctrlMod));
2387
2388 /* If: '<S54>/If1' incorporates:
2389 * Constant: '<S95>/Constant1'
2390 * Constant: '<S95>/Constant3'
2391 * Constant: '<S95>/Constant4'
2392 * Constant: '<S95>/Constant6'
2393 * Constant: '<S95>/Constant7'
2394 * Constant: '<S95>/Constant8'
2395 * Gain: '<S95>/Gain1'
2396 * Gain: '<S95>/Gain2'
2397 * Inport: '<S96>/In1'
2398 * Merge: '<S26>/Merge'
2399 * Merge: '<S54>/Merge'
2400 * Outport: '<Root>/f_Idq'
2401 * Product: '<S95>/Divide'
2402 * Sum: '<S95>/Sum'
2403 * Sum: '<S95>/Sum1'
2404 * Switch: '<S110>/Switch2'
2405 * Switch: '<S117>/Switch2'
2406 * UnitDelay: '<S6>/UnitDelay1'
2407 */
2408 if (rtb_z_ctrlMod != 0) {
2409 /* Outputs for IfAction SubSystem: '<S54>/CurrentLoop' incorporates:
2410 * ActionPort: '<S95>/Action Port'
2411 */
2412 /* Product: '<S95>/Divide' incorporates:
2413 * Inport: '<Root>/vDC'
2414 */
2415 rtb_r_cos_M1 = (int16_T)((rtU->vDC * 15) >> 4);
2416
2417 /* Outputs for Atomic SubSystem: '<S95>/PI_backCalc_fixdt' */
2418 rtb_Switch = PI_backCalc_fixdt_o((int16_T)(rtb_Divide1_m - rtY->f_Idq[0]),
2419 rtP.cf_idKp, rtP.cf_idKi, rtP.cf_idKb, rtb_r_cos_M1, (int16_T)
2420 -rtb_r_cos_M1, rtDW->UnitDelay1_DSTATE_f[0], rtb_DataTypeConversion_j,
2421 &rtDW->PI_backCalc_fixdt_o3, &rtPrevZCX->PI_backCalc_fixdt_o3);
2422
2423 /* End of Outputs for SubSystem: '<S95>/PI_backCalc_fixdt' */
2424
2425 /* Outputs for Atomic SubSystem: '<S95>/PI_backCalc_fixdt1' */
2426 rtb_Sum1 = PI_backCalc_fixdt_o((int16_T)(rtb_Sum6_p - rtY->f_Idq[1]),
2427 rtP.cf_iqKp, rtP.cf_iqKi, rtP.cf_iqKb, rtb_r_cos_M1, (int16_T)
2428 -rtb_r_cos_M1, rtDW->UnitDelay1_DSTATE_f[1], rtb_DataTypeConversion_j,
2429 &rtDW->PI_backCalc_fixdt1, &rtPrevZCX->PI_backCalc_fixdt1);
2430
2431 /* End of Outputs for SubSystem: '<S95>/PI_backCalc_fixdt1' */
2432
2433 /* Sum: '<S95>/Sum2' incorporates:
2434 * Constant: '<S95>/Constant1'
2435 * Constant: '<S95>/Constant3'
2436 * Constant: '<S95>/Constant4'
2437 * Constant: '<S95>/Constant6'
2438 * Constant: '<S95>/Constant7'
2439 * Constant: '<S95>/Constant8'
2440 * DataTypeConversion: '<S95>/Data Type Conversion'
2441 * DataTypeConversion: '<S95>/Data Type Conversion1'
2442 * Gain: '<S95>/Gain1'
2443 * Gain: '<S95>/Gain2'
2444 * Merge: '<S54>/Merge'
2445 * Outport: '<Root>/f_Idq'
2446 * Product: '<S95>/Divide'
2447 * Sum: '<S95>/Sum'
2448 * Sum: '<S95>/Sum1'
2449 * Switch: '<S103>/Switch2'
2450 * Switch: '<S105>/Switch2'
2451 * Switch: '<S110>/Switch2'
2452 * Switch: '<S117>/Switch2'
2453 * UnitDelay: '<S6>/UnitDelay1'
2454 */
2455 rtb_Multiply[0] = (int16_T)(rtb_Switch >> 9);
2456 rtb_Multiply[1] = (int16_T)(rtb_Sum1 >> 9);
2457
2458 /* End of Outputs for SubSystem: '<S54>/CurrentLoop' */
2459 } else {
2460 /* Outputs for IfAction SubSystem: '<S54>/OpenLoop' incorporates:
2461 * ActionPort: '<S96>/Action Port'
2462 */
2463 rtb_Multiply[0] = rtDW->Merge[0];
2464 rtb_Multiply[1] = rtDW->Merge[1];
2465
2466 /* End of Outputs for SubSystem: '<S54>/OpenLoop' */
2467 }
2468
2469 /* End of If: '<S54>/If1' */
2470
2471 /* Gain: '<S51>/Gain' incorporates:
2472 * Inport: '<Root>/vDC'
2473 * Product: '<S60>/Divide1'
2474 */
2475 rtb_r_cos_M1 = (int16_T)((15565 * rtU->vDC) >> 13);
2476
2477 /* Math: '<S51>/Math Function1' incorporates:
2478 * Product: '<S60>/Divide1'
2479 */
2480 rtb_Switch = (rtb_r_cos_M1 * rtb_r_cos_M1) >> 6;
2481
2482 /* Sum: '<S51>/Sum of Elements' incorporates:
2483 * Math: '<S51>/Math Function'
2484 * Merge: '<S54>/Merge'
2485 */
2486 tmp = (int64_T)((rtb_Multiply[0] * rtb_Multiply[0]) >> 4) + ((rtb_Multiply[1] *
2487 rtb_Multiply[1]) >> 4);
2488 if (tmp > 2147483647LL) {
2489 tmp = 2147483647LL;
2490 } else {
2491 if (tmp < -2147483648LL) {
2492 tmp = -2147483648LL;
2493 }
2494 }
2495
2496 /* Product: '<S51>/Divide' incorporates:
2497 * Math: '<S51>/Math Function1'
2498 * Sum: '<S51>/Sum of Elements'
2499 */
2500 tmp = ((int64_T)(int32_T)tmp << 14) / rtb_Switch;
2501 if (tmp < 0LL) {
2502 tmp = 0LL;
2503 } else {
2504 if (tmp > 65535LL) {
2505 tmp = 65535LL;
2506 }
2507 }
2508
2509 /* Sqrt: '<S51>/Sqrt' incorporates:
2510 * Product: '<S51>/Divide'
2511 */
2512 rtb_BitwiseOperator2 = rt_sqrt_Uu16En14_Yu16E_WMwW1mku((uint16_T)tmp);
2513
2514 /* Switch: '<S51>/Switch' incorporates:
2515 * Merge: '<S54>/Merge'
2516 * Sqrt: '<S51>/Sqrt'
2517 */
2518 if (rtb_BitwiseOperator2 > 16384) {
2519 /* Switch: '<S51>/Switch' incorporates:
2520 * Merge: '<S54>/Merge'
2521 * MultiPortSwitch: '<S51>/Multiport Switch'
2522 * Product: '<S51>/Divide1'
2523 */
2524 rtb_Switch_f_idx_0 = (int16_T)((rtb_Multiply[0] << 14) /
2525 rtb_BitwiseOperator2);
2526 rtb_Switch_f_idx_1 = (int16_T)((rtb_Multiply[1] << 14) /
2527 rtb_BitwiseOperator2);
2528 } else {
2529 rtb_Switch_f_idx_0 = rtb_Multiply[0];
2530 rtb_Switch_f_idx_1 = rtb_Multiply[1];
2531 }
2532
2533 /* End of Switch: '<S51>/Switch' */
2534
2535 /* Sum: '<S60>/Sum1' incorporates:
2536 * Interpolation_n-D: '<S58>/r_cos_M1'
2537 * Interpolation_n-D: '<S58>/r_sin_M1'
2538 * Product: '<S60>/Divide2'
2539 * Product: '<S60>/Divide3'
2540 */
2541 tmp_0 = (int16_T)((rtb_Switch_f_idx_0 * rtConstP.pooled7[rtb_LogicalOperator3])
2542 >> 14) + (int16_T)((rtb_Switch_f_idx_1 *
2543 rtConstP.pooled8[rtb_LogicalOperator3]) >> 14);
2544 if (tmp_0 > 32767) {
2545 tmp_0 = 32767;
2546 } else {
2547 if (tmp_0 < -32768) {
2548 tmp_0 = -32768;
2549 }
2550 }
2551
2552 /* Sum: '<S60>/Sum6' incorporates:
2553 * Interpolation_n-D: '<S58>/r_cos_M1'
2554 * Interpolation_n-D: '<S58>/r_sin_M1'
2555 * Product: '<S60>/Divide1'
2556 * Product: '<S60>/Divide4'
2557 */
2558 tmp_1 = (int16_T)((rtb_Switch_f_idx_0 * rtConstP.pooled8[rtb_LogicalOperator3])
2559 >> 14) - (int16_T)((rtb_Switch_f_idx_1 *
2560 rtConstP.pooled7[rtb_LogicalOperator3]) >> 14);
2561 if (tmp_1 > 32767) {
2562 tmp_1 = 32767;
2563 } else {
2564 if (tmp_1 < -32768) {
2565 tmp_1 = -32768;
2566 }
2567 }
2568
2569 /* Product: '<S61>/Divide7' incorporates:
2570 * Constant: '<S61>/Constant3'
2571 * Sum: '<S60>/Sum1'
2572 */
2573 rtb_r_cos_M1 = (int16_T)((2365 * (int16_T)tmp_0) >> 11);
2574
2575 /* MATLAB Function: '<S61>/sector_select' incorporates:
2576 * Product: '<S61>/Divide7'
2577 * Sum: '<S60>/Sum1'
2578 * Sum: '<S60>/Sum6'
2579 */
2580 if ((int16_T)tmp_0 >= 0) {
2581 if ((int16_T)tmp_1 >= 0) {
2582 if (rtb_r_cos_M1 > ((int16_T)tmp_1 << 1)) {
2583 /* DataTypeConversion: '<S61>/Data Type Conversion' */
2584 rtb_DataTypeConversion_j = 2U;
2585 } else {
2586 /* DataTypeConversion: '<S61>/Data Type Conversion' */
2587 rtb_DataTypeConversion_j = 1U;
2588 }
2589 } else {
2590 rtb_Gain_p2 = -rtb_r_cos_M1;
2591 if (-rtb_r_cos_M1 > 32767) {
2592 rtb_Gain_p2 = 32767;
2593 }
2594
2595 if (rtb_Gain_p2 > ((int16_T)tmp_1 << 1)) {
2596 /* DataTypeConversion: '<S61>/Data Type Conversion' */
2597 rtb_DataTypeConversion_j = 3U;
2598 } else {
2599 /* DataTypeConversion: '<S61>/Data Type Conversion' */
2600 rtb_DataTypeConversion_j = 2U;
2601 }
2602 }
2603 } else if ((int16_T)tmp_1 >= 0) {
2604 rtb_Gain_p2 = -rtb_r_cos_M1;
2605 if (-rtb_r_cos_M1 > 32767) {
2606 rtb_Gain_p2 = 32767;
2607 }
2608
2609 if (rtb_Gain_p2 > ((int16_T)tmp_1 << 1)) {
2610 /* DataTypeConversion: '<S61>/Data Type Conversion' */
2611 rtb_DataTypeConversion_j = 5U;
2612 } else {
2613 /* DataTypeConversion: '<S61>/Data Type Conversion' */
2614 rtb_DataTypeConversion_j = 6U;
2615 }
2616 } else if (rtb_r_cos_M1 > ((int16_T)tmp_1 << 1)) {
2617 /* DataTypeConversion: '<S61>/Data Type Conversion' */
2618 rtb_DataTypeConversion_j = 4U;
2619 } else {
2620 /* DataTypeConversion: '<S61>/Data Type Conversion' */
2621 rtb_DataTypeConversion_j = 5U;
2622 }
2623
2624 /* End of MATLAB Function: '<S61>/sector_select' */
2625
2626 /* Gain: '<S61>/Gain' incorporates:
2627 * Inport: '<Root>/vDC'
2628 */
2629 rtb_Gain_p2 = 18919 * rtU->vDC;
2630
2631 /* Product: '<S61>/Divide' incorporates:
2632 * Gain: '<S61>/Gain'
2633 * Sum: '<S60>/Sum6'
2634 */
2635 rtb_Sum6_k = (int16_T)(((int64_T)(int16_T)tmp_1 << 26) / rtb_Gain_p2);
2636
2637 /* Product: '<S61>/Divide1' incorporates:
2638 * Gain: '<S61>/Gain'
2639 * Sum: '<S60>/Sum1'
2640 */
2641 rtb_Sum1_a = (int16_T)(((int64_T)(int16_T)tmp_0 << 26) / rtb_Gain_p2);
2642
2643 /* MultiPortSwitch: '<S62>/Multiport Switch' incorporates:
2644 * DataTypeConversion: '<S61>/Data Type Conversion1'
2645 */
2646 switch (rtb_DataTypeConversion_j) {
2647 case 1:
2648 /* Product: '<S64>/Divide3' incorporates:
2649 * Constant: '<S61>/Constant1'
2650 * DataTypeConversion: '<S61>/Data Type Conversion2'
2651 * Product: '<S61>/Divide1'
2652 * Product: '<S64>/Divide2'
2653 */
2654 rtb_Divide3_k = (int16_T)(((int16_T)((rtb_Sum1_a * 9459) >> 13) * (int16_T)
2655 rtP.i_pwm_count) >> 12);
2656
2657 /* Product: '<S64>/Divide1' incorporates:
2658 * Constant: '<S61>/Constant1'
2659 * Constant: '<S64>/Constant'
2660 * DataTypeConversion: '<S61>/Data Type Conversion2'
2661 * Product: '<S61>/Divide'
2662 * Product: '<S61>/Divide1'
2663 * Product: '<S64>/Divide'
2664 * Sum: '<S64>/Add'
2665 */
2666 rtb_Sum1_a = (int16_T)(((int16_T)(rtb_Sum6_k - ((rtb_Sum1_a * 9459) >> 14)) *
2667 (int16_T)rtP.i_pwm_count) >> 12);
2668
2669 /* Product: '<S64>/Divide4' incorporates:
2670 * Constant: '<S61>/Constant1'
2671 * DataTypeConversion: '<S61>/Data Type Conversion2'
2672 * Sum: '<S64>/Add1'
2673 * Sum: '<S64>/Add2'
2674 */
2675 rtb_r_cos_M1 = (int16_T)((int16_T)((int16_T)((int16_T)rtP.i_pwm_count -
2676 rtb_Sum1_a) - rtb_Divide3_k) >> 1);
2677
2678 /* Sum: '<S64>/Add3' */
2679 rtb_Sum6_k = (int16_T)(rtb_r_cos_M1 + rtb_Divide3_k);
2680
2681 /* Outport: '<Root>/pwm_Duty' incorporates:
2682 * Sum: '<S64>/Add4'
2683 */
2684 rtY->pwm_Duty[0] = (int16_T)(rtb_Sum6_k + rtb_Sum1_a);
2685 rtY->pwm_Duty[1] = rtb_Sum6_k;
2686 rtY->pwm_Duty[2] = rtb_r_cos_M1;
2687 break;
2688
2689 case 2:
2690 /* Product: '<S65>/Divide1' incorporates:
2691 * Constant: '<S61>/Constant1'
2692 * Constant: '<S65>/Constant'
2693 * DataTypeConversion: '<S61>/Data Type Conversion2'
2694 * Product: '<S61>/Divide'
2695 * Product: '<S61>/Divide1'
2696 * Product: '<S65>/Divide'
2697 * Sum: '<S65>/Add'
2698 */
2699 rtb_Divide3_k = (int16_T)(((int16_T)(((rtb_Sum1_a * 9459) >> 14) +
2700 rtb_Sum6_k) * (int16_T)rtP.i_pwm_count) >> 12);
2701
2702 /* Product: '<S65>/Divide3' incorporates:
2703 * Constant: '<S61>/Constant1'
2704 * Constant: '<S65>/Constant'
2705 * DataTypeConversion: '<S61>/Data Type Conversion2'
2706 * Product: '<S61>/Divide'
2707 * Product: '<S61>/Divide1'
2708 * Product: '<S65>/Divide2'
2709 * Sum: '<S65>/Add5'
2710 */
2711 rtb_Sum1_a = (int16_T)(((int16_T)(((rtb_Sum1_a * 9459) >> 14) - rtb_Sum6_k) *
2712 (int16_T)rtP.i_pwm_count) >> 12);
2713
2714 /* Product: '<S65>/Divide4' incorporates:
2715 * Constant: '<S61>/Constant1'
2716 * DataTypeConversion: '<S61>/Data Type Conversion2'
2717 * Sum: '<S65>/Add1'
2718 * Sum: '<S65>/Add2'
2719 */
2720 rtb_r_cos_M1 = (int16_T)((int16_T)((int16_T)((int16_T)rtP.i_pwm_count -
2721 rtb_Sum1_a) - rtb_Divide3_k) >> 1);
2722
2723 /* Sum: '<S65>/Add3' */
2724 rtb_Sum6_k = (int16_T)(rtb_r_cos_M1 + rtb_Divide3_k);
2725
2726 /* Outport: '<Root>/pwm_Duty' incorporates:
2727 * Sum: '<S65>/Add4'
2728 */
2729 rtY->pwm_Duty[0] = rtb_Sum6_k;
2730 rtY->pwm_Duty[1] = (int16_T)(rtb_Sum6_k + rtb_Sum1_a);
2731 rtY->pwm_Duty[2] = rtb_r_cos_M1;
2732 break;
2733
2734 case 3:
2735 /* Product: '<S66>/Divide1' incorporates:
2736 * Constant: '<S61>/Constant1'
2737 * Constant: '<S66>/Constant'
2738 * DataTypeConversion: '<S61>/Data Type Conversion2'
2739 * Product: '<S61>/Divide'
2740 * Product: '<S61>/Divide1'
2741 * Product: '<S66>/Divide'
2742 * Sum: '<S66>/Add'
2743 */
2744 rtb_Sum6_k = (int16_T)(((int16_T)(-rtb_Sum6_k - ((rtb_Sum1_a * 9459) >> 14))
2745 * (int16_T)rtP.i_pwm_count) >> 12);
2746
2747 /* Product: '<S66>/Divide3' incorporates:
2748 * Constant: '<S61>/Constant1'
2749 * DataTypeConversion: '<S61>/Data Type Conversion2'
2750 * Product: '<S61>/Divide1'
2751 * Product: '<S66>/Divide2'
2752 */
2753 rtb_Sum1_a = (int16_T)(((int16_T)((rtb_Sum1_a * 9459) >> 13) * (int16_T)
2754 rtP.i_pwm_count) >> 12);
2755
2756 /* Product: '<S66>/Divide4' incorporates:
2757 * Constant: '<S61>/Constant1'
2758 * DataTypeConversion: '<S61>/Data Type Conversion2'
2759 * Sum: '<S66>/Add1'
2760 * Sum: '<S66>/Add2'
2761 */
2762 rtb_r_cos_M1 = (int16_T)((int16_T)((int16_T)((int16_T)rtP.i_pwm_count -
2763 rtb_Sum1_a) - rtb_Sum6_k) >> 1);
2764
2765 /* Sum: '<S66>/Add3' */
2766 rtb_Sum6_k += rtb_r_cos_M1;
2767
2768 /* Outport: '<Root>/pwm_Duty' incorporates:
2769 * Sum: '<S66>/Add4'
2770 */
2771 rtY->pwm_Duty[0] = rtb_r_cos_M1;
2772 rtY->pwm_Duty[1] = (int16_T)(rtb_Sum6_k + rtb_Sum1_a);
2773 rtY->pwm_Duty[2] = rtb_Sum6_k;
2774 break;
2775
2776 case 4:
2777 /* Product: '<S67>/Divide1' incorporates:
2778 * Constant: '<S61>/Constant1'
2779 * Constant: '<S67>/Constant'
2780 * DataTypeConversion: '<S61>/Data Type Conversion2'
2781 * Product: '<S61>/Divide'
2782 * Product: '<S61>/Divide1'
2783 * Product: '<S67>/Divide'
2784 * Sum: '<S67>/Add'
2785 */
2786 rtb_Sum6_k = (int16_T)(((int16_T)(((rtb_Sum1_a * 9459) >> 14) - rtb_Sum6_k) *
2787 (int16_T)rtP.i_pwm_count) >> 12);
2788
2789 /* Product: '<S67>/Divide3' incorporates:
2790 * Constant: '<S61>/Constant1'
2791 * DataTypeConversion: '<S61>/Data Type Conversion2'
2792 * Product: '<S61>/Divide1'
2793 * Product: '<S67>/Divide2'
2794 * Sum: '<S67>/Add5'
2795 */
2796 rtb_Sum1_a = (int16_T)(((int16_T)(-((int16_T)((rtb_Sum1_a * 9459) >> 13) <<
2797 2) >> 2) * (int16_T)rtP.i_pwm_count) >> 12);
2798
2799 /* Product: '<S67>/Divide4' incorporates:
2800 * Constant: '<S61>/Constant1'
2801 * DataTypeConversion: '<S61>/Data Type Conversion2'
2802 * Sum: '<S67>/Add1'
2803 * Sum: '<S67>/Add2'
2804 */
2805 rtb_r_cos_M1 = (int16_T)((int16_T)((int16_T)((int16_T)rtP.i_pwm_count -
2806 rtb_Sum1_a) - rtb_Sum6_k) >> 1);
2807
2808 /* Sum: '<S67>/Add3' */
2809 rtb_Sum6_k += rtb_r_cos_M1;
2810
2811 /* Outport: '<Root>/pwm_Duty' incorporates:
2812 * Sum: '<S67>/Add4'
2813 */
2814 rtY->pwm_Duty[0] = rtb_r_cos_M1;
2815 rtY->pwm_Duty[1] = rtb_Sum6_k;
2816 rtY->pwm_Duty[2] = (int16_T)(rtb_Sum6_k + rtb_Sum1_a);
2817 break;
2818
2819 case 5:
2820 /* Product: '<S68>/Divide3' incorporates:
2821 * Constant: '<S61>/Constant1'
2822 * Constant: '<S68>/Constant'
2823 * DataTypeConversion: '<S61>/Data Type Conversion2'
2824 * Product: '<S61>/Divide'
2825 * Product: '<S61>/Divide1'
2826 * Product: '<S68>/Divide2'
2827 * Sum: '<S68>/Add5'
2828 */
2829 rtb_Divide3_k = (int16_T)(((int16_T)(rtb_Sum6_k - ((rtb_Sum1_a * 9459) >> 14))
2830 * (int16_T)rtP.i_pwm_count) >> 12);
2831
2832 /* Product: '<S68>/Divide1' incorporates:
2833 * Constant: '<S61>/Constant1'
2834 * Constant: '<S68>/Constant'
2835 * DataTypeConversion: '<S61>/Data Type Conversion2'
2836 * Product: '<S61>/Divide'
2837 * Product: '<S61>/Divide1'
2838 * Product: '<S68>/Divide'
2839 * Sum: '<S68>/Add'
2840 */
2841 rtb_Sum1_a = (int16_T)(((int16_T)(-rtb_Sum6_k - ((rtb_Sum1_a * 9459) >> 14))
2842 * (int16_T)rtP.i_pwm_count) >> 12);
2843
2844 /* Product: '<S68>/Divide4' incorporates:
2845 * Constant: '<S61>/Constant1'
2846 * DataTypeConversion: '<S61>/Data Type Conversion2'
2847 * Sum: '<S68>/Add1'
2848 * Sum: '<S68>/Add2'
2849 */
2850 rtb_r_cos_M1 = (int16_T)((int16_T)((int16_T)((int16_T)rtP.i_pwm_count -
2851 rtb_Sum1_a) - rtb_Divide3_k) >> 1);
2852
2853 /* Sum: '<S68>/Add3' */
2854 rtb_Sum6_k = (int16_T)(rtb_r_cos_M1 + rtb_Divide3_k);
2855
2856 /* Outport: '<Root>/pwm_Duty' incorporates:
2857 * Sum: '<S68>/Add4'
2858 */
2859 rtY->pwm_Duty[0] = rtb_Sum6_k;
2860 rtY->pwm_Duty[1] = rtb_r_cos_M1;
2861 rtY->pwm_Duty[2] = (int16_T)(rtb_Sum6_k + rtb_Sum1_a);
2862 break;
2863
2864 default:
2865 /* Product: '<S69>/Divide3' incorporates:
2866 * Constant: '<S61>/Constant1'
2867 * DataTypeConversion: '<S61>/Data Type Conversion2'
2868 * Product: '<S61>/Divide1'
2869 * Product: '<S69>/Divide2'
2870 * Sum: '<S69>/Add5'
2871 */
2872 rtb_Divide3_k = (int16_T)(((int16_T)(-((int16_T)((rtb_Sum1_a * 9459) >> 13) <<
2873 2) >> 2) * (int16_T)rtP.i_pwm_count) >> 12);
2874
2875 /* Product: '<S69>/Divide1' incorporates:
2876 * Constant: '<S61>/Constant1'
2877 * Constant: '<S69>/Constant'
2878 * DataTypeConversion: '<S61>/Data Type Conversion2'
2879 * Product: '<S61>/Divide'
2880 * Product: '<S61>/Divide1'
2881 * Product: '<S69>/Divide'
2882 * Sum: '<S69>/Add'
2883 */
2884 rtb_Sum1_a = (int16_T)(((int16_T)(((rtb_Sum1_a * 9459) >> 14) + rtb_Sum6_k) *
2885 (int16_T)rtP.i_pwm_count) >> 12);
2886
2887 /* Product: '<S69>/Divide4' incorporates:
2888 * Constant: '<S61>/Constant1'
2889 * DataTypeConversion: '<S61>/Data Type Conversion2'
2890 * Sum: '<S69>/Add1'
2891 * Sum: '<S69>/Add2'
2892 */
2893 rtb_r_cos_M1 = (int16_T)((int16_T)((int16_T)((int16_T)rtP.i_pwm_count -
2894 rtb_Sum1_a) - rtb_Divide3_k) >> 1);
2895
2896 /* Sum: '<S69>/Add3' */
2897 rtb_Sum6_k = (int16_T)(rtb_r_cos_M1 + rtb_Divide3_k);
2898
2899 /* Outport: '<Root>/pwm_Duty' incorporates:
2900 * Sum: '<S69>/Add4'
2901 */
2902 rtY->pwm_Duty[0] = (int16_T)(rtb_Sum6_k + rtb_Sum1_a);
2903 rtY->pwm_Duty[1] = rtb_r_cos_M1;
2904 rtY->pwm_Duty[2] = rtb_Sum6_k;
2905 break;
2906 }
2907
2908 /* End of MultiPortSwitch: '<S62>/Multiport Switch' */
2909
2910 /* Switch: '<S119>/Switch2' */
2911 if (rtb_LogicalOperator12) {
2912 /* Update for UnitDelay: '<S119>/UnitDelay' incorporates:
2913 * UnitDelay: '<S98>/Unit Delay1'
2914 */
2915 rtDW->UnitDelay_DSTATE_d = rtDW->UnitDelay1_DSTATE_b;
2916 } else {
2917 /* Update for UnitDelay: '<S119>/UnitDelay' incorporates:
2918 * Sum: '<S118>/Add2'
2919 */
2920 rtDW->UnitDelay_DSTATE_d = (int16_T)tmp_2;
2921 }
2922
2923 /* End of Switch: '<S119>/Switch2' */
2924
2925 /* Switch: '<S112>/Switch2' */
2926 if (rtb_Equal_k) {
2927 /* Update for UnitDelay: '<S112>/UnitDelay' incorporates:
2928 * UnitDelay: '<S97>/Unit Delay1'
2929 */
2930 rtDW->UnitDelay_DSTATE_b = rtDW->UnitDelay1_DSTATE_i;
2931 } else {
2932 /* Update for UnitDelay: '<S112>/UnitDelay' incorporates:
2933 * Sum: '<S111>/Add2'
2934 */
2935 rtDW->UnitDelay_DSTATE_b = (int16_T)rtb_Gain_b0;
2936 }
2937
2938 /* End of Switch: '<S112>/Switch2' */
2939
2940 /* Switch: '<S37>/Switch1' incorporates:
2941 * RelationalOperator: '<S39>/Relational Operator'
2942 * UnitDelay: '<S39>/UnitDelay'
2943 */
2944 if (rtb_n_commDeacv != rtDW->UnitDelay_DSTATE_bv) {
2945 rtb_UnitDelay_bc = rtb_Sum_i;
2946 }
2947
2948 /* End of Switch: '<S37>/Switch1' */
2949
2950 /* Update for UnitDelay: '<S37>/UnitDelay' */
2951 rtDW->UnitDelay_DSTATE_j = rtb_UnitDelay_bc;
2952
2953 /* Update for Delay: '<S9>/Delay' incorporates:
2954 * Inport: '<Root>/hall_A'
2955 */
2956 rtDW->Delay_DSTATE_d = rtU->hall_A;
2957
2958 /* Update for Delay: '<S9>/Delay1' incorporates:
2959 * Inport: '<Root>/hall_B'
2960 */
2961 rtDW->Delay1_DSTATE = rtU->hall_B;
2962
2963 /* Update for Delay: '<S9>/Delay2' incorporates:
2964 * Inport: '<Root>/hall_C'
2965 */
2966 rtDW->Delay2_DSTATE = rtU->hall_C;
2967
2968 /* Update for UnitDelay: '<S14>/UnitDelay3' incorporates:
2969 * Inport: '<Root>/us_Count'
2970 */
2971 rtDW->UnitDelay3_DSTATE = rtU->us_Count;
2972
2973 /* Update for UnitDelay: '<S14>/UnitDelay4' incorporates:
2974 * Abs: '<S14>/Abs5'
2975 */
2976 rtDW->UnitDelay4_DSTATE = rtb_Switch2;
2977
2978 /* Update for UnitDelay: '<S38>/UnitDelay' */
2979 rtDW->UnitDelay_DSTATE_k = rtb_n_commDeacv;
2980
2981 /* Update for UnitDelay: '<S42>/UnitDelay' */
2982 rtDW->UnitDelay_DSTATE_n = rtb_RelationalOperator4_f;
2983
2984 /* Update for UnitDelay: '<S7>/UnitDelay1' incorporates:
2985 * Sum: '<S7>/Sum3'
2986 */
2987 rtDW->UnitDelay1_DSTATE = qY;
2988
2989 /* Update for UnitDelay: '<S106>/UnitDelay' incorporates:
2990 * Switch: '<S84>/Switch2'
2991 */
2992 rtDW->UnitDelay_DSTATE_h = rtDW->Switch2;
2993
2994 /* Update for UnitDelay: '<S97>/Unit Delay1' incorporates:
2995 * Switch: '<S110>/Switch2'
2996 */
2997 rtDW->UnitDelay1_DSTATE_i = rtb_Divide1_m;
2998
2999 /* Update for UnitDelay: '<S108>/Unit Delay' incorporates:
3000 * Switch: '<S110>/Switch2'
3001 */
3002 rtDW->UnitDelay_DSTATE_g = rtb_Divide1_m;
3003
3004 /* Update for UnitDelay: '<S113>/UnitDelay' incorporates:
3005 * Switch: '<S76>/Switch'
3006 */
3007 rtDW->UnitDelay_DSTATE_o = rtDW->Switch;
3008
3009 /* Update for UnitDelay: '<S98>/Unit Delay1' incorporates:
3010 * Switch: '<S117>/Switch2'
3011 */
3012 rtDW->UnitDelay1_DSTATE_b = rtb_Sum6_p;
3013
3014 /* Update for UnitDelay: '<S115>/Unit Delay' incorporates:
3015 * Switch: '<S117>/Switch2'
3016 */
3017 rtDW->UnitDelay_DSTATE_a = rtb_Sum6_p;
3018
3019 /* Update for UnitDelay: '<S54>/Unit Delay' */
3020 rtDW->UnitDelay_DSTATE_bm = rtb_z_ctrlMod;
3021
3022 /* Update for UnitDelay: '<S39>/UnitDelay' */
3023 rtDW->UnitDelay_DSTATE_bv = rtb_n_commDeacv;
3024
3025 /* Update for UnitDelay: '<S6>/UnitDelay1' incorporates:
3026 * Switch: '<S51>/Switch'
3027 */
3028 rtDW->UnitDelay1_DSTATE_f[0] = rtb_Switch_f_idx_0;
3029
3030 /* End of Outputs for SubSystem: '<Root>/PMSM_Controller' */
3031
3032 /* Outport: '<Root>/f_Vdq' incorporates:
3033 * UnitDelay: '<S6>/UnitDelay1'
3034 */
3035 rtY->f_Vdq[0] = rtb_UnitDelay1[0];
3036
3037 /* Outputs for Atomic SubSystem: '<Root>/PMSM_Controller' */
3038 /* Update for UnitDelay: '<S6>/UnitDelay1' incorporates:
3039 * Switch: '<S51>/Switch'
3040 */
3041 rtDW->UnitDelay1_DSTATE_f[1] = rtb_Switch_f_idx_1;
3042
3043 /* End of Outputs for SubSystem: '<Root>/PMSM_Controller' */
3044
3045 /* Outport: '<Root>/f_Vdq' incorporates:
3046 * UnitDelay: '<S6>/UnitDelay1'
3047 */
3048 rtY->f_Vdq[1] = rtb_UnitDelay1[1];
3049
3050 /* Outport: '<Root>/n_Sector' */
3051 rtY->n_Sector = rtb_DataTypeConversion_j;
3052
3053 /* Outport: '<Root>/n_MotError' */
3054 rtY->n_MotError = rtb_UnitDelay_bc;
3055
3056 /* Outport: '<Root>/f_MotAngle' incorporates:
3057 * Merge: '<S3>/Merge'
3058 */
3059 rtY->f_MotAngle = rtDW->Merge_i;
3060
3061 /* Outport: '<Root>/f_MotRPM' incorporates:
3062 * Switch: '<S14>/Switch2'
3063 */
3064 rtY->f_MotRPM = rtb_Switch3;
3065
3066 /* Outport: '<Root>/f_hallAngle' incorporates:
3067 * Merge: '<S15>/Merge'
3068 */
3069 rtY->f_hallAngle = rtb_Sum3_jm;
3070
3071 /* Outport: '<Root>/n_hallStat' */
3072 rtY->n_hallStat = rtb_Add_gf;
3073
3074 /* Outport: '<Root>/n_runingMode' */
3075 rtY->n_runingMode = rtb_z_ctrlMod;
3076}
3077
3078/* Model initialize function */
3079void PMSM_Controller_initialize(RT_MODEL *const rtM)
3080{
3081 DW *rtDW = rtM->dwork;
3082 PrevZCX *rtPrevZCX = rtM->prevZCSigState;
3083 ExtY *rtY = (ExtY *) rtM->outputs;
3084 rtPrevZCX->ResettableDelay_Reset_ZCE_a = POS_ZCSIG;
3085 rtPrevZCX->PI_backCalc_fixdt1.ResettableDelay_Reset_ZCE = POS_ZCSIG;
3086 rtPrevZCX->PI_backCalc_fixdt_o3.ResettableDelay_Reset_ZCE = POS_ZCSIG;
3087 rtPrevZCX->PI_Speed.ResettableDelay_Reset_ZCE_f = POS_ZCSIG;
3088
3089 /* SystemInitialize for Atomic SubSystem: '<Root>/PMSM_Controller' */
3090 /* SystemInitialize for IfAction SubSystem: '<S14>/Raw_Motor_Speed_Estimation' */
3091 /* InitializeConditions for UnitDelay: '<S20>/UnitDelay2' */
3092 rtDW->UnitDelay2_DSTATE = rtP.n_hall_count_ps;
3093
3094 /* SystemInitialize for Outport: '<S20>/z_counter' incorporates:
3095 * Inport: '<S20>/z_counterRawPrev'
3096 */
3097 rtDW->z_counterRawPrev = rtP.n_hall_count_ps;
3098
3099 /* End of SystemInitialize for SubSystem: '<S14>/Raw_Motor_Speed_Estimation' */
3100
3101 /* SystemInitialize for IfAction SubSystem: '<S53>/Do_Calc' */
3102 /* SystemInitialize for IfAction SubSystem: '<S73>/speed_mode' */
3103 /* SystemInitialize for Atomic SubSystem: '<S87>/PI_Speed' */
3104 PI_backCalc_fixdt_Init(&rtDW->PI_Speed);
3105
3106 /* End of SystemInitialize for SubSystem: '<S87>/PI_Speed' */
3107 /* End of SystemInitialize for SubSystem: '<S73>/speed_mode' */
3108
3109 /* SystemInitialize for IfAction SubSystem: '<S73>/torque_mode' */
3110 /* InitializeConditions for Delay: '<S88>/Delay' */
3111 rtDW->icLoad = 1U;
3112
3113 /* SystemInitialize for Atomic SubSystem: '<S88>/PI_TrqSpdLim' */
3114 /* InitializeConditions for Delay: '<S93>/Resettable Delay' */
3115 rtDW->icLoad_k = 1U;
3116
3117 /* End of SystemInitialize for SubSystem: '<S88>/PI_TrqSpdLim' */
3118 /* End of SystemInitialize for SubSystem: '<S73>/torque_mode' */
3119 /* End of SystemInitialize for SubSystem: '<S53>/Do_Calc' */
3120
3121 /* SystemInitialize for IfAction SubSystem: '<S54>/CurrentLoop' */
3122 /* SystemInitialize for Atomic SubSystem: '<S95>/PI_backCalc_fixdt' */
3123 PI_backCalc_fixdt_p_Init(&rtDW->PI_backCalc_fixdt_o3);
3124
3125 /* End of SystemInitialize for SubSystem: '<S95>/PI_backCalc_fixdt' */
3126
3127 /* SystemInitialize for Atomic SubSystem: '<S95>/PI_backCalc_fixdt1' */
3128 PI_backCalc_fixdt_p_Init(&rtDW->PI_backCalc_fixdt1);
3129
3130 /* End of SystemInitialize for SubSystem: '<S95>/PI_backCalc_fixdt1' */
3131 /* End of SystemInitialize for SubSystem: '<S54>/CurrentLoop' */
3132 /* End of SystemInitialize for SubSystem: '<Root>/PMSM_Controller' */
3133
3134 /* SystemInitialize for Outport: '<Root>/f_MotAngle' incorporates:
3135 * Merge: '<S3>/Merge'
3136 */
3137 rtY->f_MotAngle = rtDW->Merge_i;
3138}
3139
3140/*
3141 * File trailer for generated code.
3142 *
3143 * [EOF]
3144 */
3145