/* * File: PMSM_Controller.c * * Code generated for Simulink model 'PMSM_Controller'. * * Model version : 1.1455 * Simulink Coder version : 9.4 (R2020b) 29-Jul-2020 * C/C++ source code generated on : Fri May 27 11:51:11 2022 * * Target selection: ert.tlc * Embedded hardware selection: ARM Compatible->ARM Cortex-M * Code generation objectives: * 1. Execution efficiency * 2. RAM efficiency * Validation result: Not run */ #include "PMSM_Controller.h" /* Named constants for Chart: '/Control_Mode_Manager' */ #define IN_ACTIVE ((uint8_T)1U) #define IN_NO_ACTIVE_CHILD ((uint8_T)0U) #define IN_OPEN ((uint8_T)2U) #define IN_SPEED_MODE ((uint8_T)1U) #define IN_TORQUE_MODE ((uint8_T)2U) #define OPEN_MODE ((uint8_T)0U) #define SPD_MODE ((uint8_T)1U) #define TRQ_MODE ((uint8_T)2U) #ifndef UCHAR_MAX #include #endif #if ( UCHAR_MAX != (0xFFU) ) || ( SCHAR_MAX != (0x7F) ) #error Code was generated for compiler with different sized uchar/char. \ Consider adjusting Test hardware word size settings on the \ Hardware Implementation pane to match your compiler word sizes as \ defined in limits.h of the compiler. Alternatively, you can \ select the Test hardware is the same as production hardware option and \ select the Enable portable word sizes option on the Code Generation > \ Verification pane for ERT based targets, which will disable the \ preprocessor word size checks. #endif #if ( USHRT_MAX != (0xFFFFU) ) || ( SHRT_MAX != (0x7FFF) ) #error Code was generated for compiler with different sized ushort/short. \ Consider adjusting Test hardware word size settings on the \ Hardware Implementation pane to match your compiler word sizes as \ defined in limits.h of the compiler. Alternatively, you can \ select the Test hardware is the same as production hardware option and \ select the Enable portable word sizes option on the Code Generation > \ Verification pane for ERT based targets, which will disable the \ preprocessor word size checks. #endif #if ( UINT_MAX != (0xFFFFFFFFU) ) || ( INT_MAX != (0x7FFFFFFF) ) #error Code was generated for compiler with different sized uint/int. \ Consider adjusting Test hardware word size settings on the \ Hardware Implementation pane to match your compiler word sizes as \ defined in limits.h of the compiler. Alternatively, you can \ select the Test hardware is the same as production hardware option and \ select the Enable portable word sizes option on the Code Generation > \ Verification pane for ERT based targets, which will disable the \ preprocessor word size checks. #endif #if ( ULONG_MAX != (0xFFFFFFFFU) ) || ( LONG_MAX != (0x7FFFFFFF) ) #error Code was generated for compiler with different sized ulong/long. \ Consider adjusting Test hardware word size settings on the \ Hardware Implementation pane to match your compiler word sizes as \ defined in limits.h of the compiler. Alternatively, you can \ select the Test hardware is the same as production hardware option and \ select the Enable portable word sizes option on the Code Generation > \ Verification pane for ERT based targets, which will disable the \ preprocessor word size checks. #endif /* Skipping ulong_long/long_long check: insufficient preprocessor integer range. */ extern int16_T rt_sqrt_Us32En10_Ys16E_7VJYwqF9(int32_T u); extern uint16_T rt_sqrt_Uu16En14_Yu16E_WMwW1mku(uint16_T u); uint16_T plook_u16s16_evencka(int16_T u, int16_T bp0, uint16_T bpSpace, uint32_T maxIndex); extern void Low_Pass_Filter(const int16_T rtu_u[2], uint16_T rtu_coef, int16_T rty_y[2], DW_Low_Pass_Filter *localDW); extern void PI_backCalc_fixdt_Init(DW_PI_backCalc_fixdt *localDW); extern int32_T PI_backCalc_fixdt(int32_T rtu_err, int16_T rtu_P, int16_T rtu_I, int16_T rtu_Kb, int16_T rtu_satMax, int16_T rtu_satMin, int16_T rtu_init, uint8_T rtu_reset, DW_PI_backCalc_fixdt *localDW, ZCE_PI_backCalc_fixdt *localZCE); extern void PI_backCalc_fixdt_p_Init(DW_PI_backCalc_fixdt_i *localDW); extern int32_T PI_backCalc_fixdt_o(int16_T rtu_err, int16_T rtu_P, int16_T rtu_I, int16_T rtu_Kb, int16_T rtu_satMax, int16_T rtu_satMin, int16_T rtu_init, uint8_T rtu_reset, DW_PI_backCalc_fixdt_i *localDW, ZCE_PI_backCalc_fixdt_e *localZCE); extern void RateInit(int16_T rtu_initVal, int16_T rtu_target, int16_T rtu_step, int16_T *rty_s_step, int16_T *rty_High, int16_T *rty_Low); uint16_T plook_u16s16_evencka(int16_T u, int16_T bp0, uint16_T bpSpace, uint32_T maxIndex) { uint16_T bpIndex; /* Prelookup - Index only Index Search method: 'even' Extrapolation method: 'Clip' Use previous index: 'off' Use last breakpoint for index at or above upper limit: 'on' Remove protection against out-of-range input in generated code: 'off' */ if (u <= bp0) { bpIndex = 0U; } else { bpIndex = (uint16_T)((uint32_T)(uint16_T)(u - bp0) / bpSpace); if (bpIndex < maxIndex) { } else { bpIndex = (uint16_T)maxIndex; } } return bpIndex; } /* * Output and update for atomic system: * '/Low_Pass_Filter' * '/Low_Pass_Filter' */ void Low_Pass_Filter(const int16_T rtu_u[2], uint16_T rtu_coef, int16_T rty_y[2], DW_Low_Pass_Filter *localDW) { int32_T rtb_Sum3_m; /* Sum: '/Sum2' incorporates: * UnitDelay: '/UnitDelay1' */ rtb_Sum3_m = rtu_u[0] - (localDW->UnitDelay1_DSTATE[0] >> 16); if (rtb_Sum3_m > 32767) { rtb_Sum3_m = 32767; } else { if (rtb_Sum3_m < -32768) { rtb_Sum3_m = -32768; } } /* Sum: '/Sum3' incorporates: * Product: '/Divide3' * Sum: '/Sum2' * UnitDelay: '/UnitDelay1' */ rtb_Sum3_m = rtu_coef * rtb_Sum3_m + localDW->UnitDelay1_DSTATE[0]; /* DataTypeConversion: '/Data Type Conversion' */ rty_y[0] = (int16_T)(rtb_Sum3_m >> 16); /* Update for UnitDelay: '/UnitDelay1' */ localDW->UnitDelay1_DSTATE[0] = rtb_Sum3_m; /* Sum: '/Sum2' incorporates: * UnitDelay: '/UnitDelay1' */ rtb_Sum3_m = rtu_u[1] - (localDW->UnitDelay1_DSTATE[1] >> 16); if (rtb_Sum3_m > 32767) { rtb_Sum3_m = 32767; } else { if (rtb_Sum3_m < -32768) { rtb_Sum3_m = -32768; } } /* Sum: '/Sum3' incorporates: * Product: '/Divide3' * Sum: '/Sum2' * UnitDelay: '/UnitDelay1' */ rtb_Sum3_m = rtu_coef * rtb_Sum3_m + localDW->UnitDelay1_DSTATE[1]; /* DataTypeConversion: '/Data Type Conversion' */ rty_y[1] = (int16_T)(rtb_Sum3_m >> 16); /* Update for UnitDelay: '/UnitDelay1' */ localDW->UnitDelay1_DSTATE[1] = rtb_Sum3_m; } /* System initialize for atomic system: '/PI_Speed' */ void PI_backCalc_fixdt_Init(DW_PI_backCalc_fixdt *localDW) { /* InitializeConditions for Delay: '/Resettable Delay' */ localDW->icLoad = 1U; } /* Output and update for atomic system: '/PI_Speed' */ int32_T PI_backCalc_fixdt(int32_T rtu_err, int16_T rtu_P, int16_T rtu_I, int16_T rtu_Kb, int16_T rtu_satMax, int16_T rtu_satMin, int16_T rtu_init, uint8_T rtu_reset, DW_PI_backCalc_fixdt *localDW, ZCE_PI_backCalc_fixdt *localZCE) { int32_T rty_pi_out_0; int64_T tmp; int64_T tmp_0; /* Product: '/Divide4' */ tmp_0 = (int64_T)rtu_err * rtu_P; if (tmp_0 > 2147483647LL) { tmp_0 = 2147483647LL; } else { if (tmp_0 < -2147483648LL) { tmp_0 = -2147483648LL; } } /* Delay: '/Resettable Delay' incorporates: * DataTypeConversion: '/Data Type Conversion2' */ if ((rtu_reset > 0) && (localZCE->ResettableDelay_Reset_ZCE_f != POS_ZCSIG)) { localDW->icLoad = 1U; } localZCE->ResettableDelay_Reset_ZCE_f = (ZCSigState)(rtu_reset > 0); if (localDW->icLoad != 0) { localDW->ResettableDelay_DSTATE = rtu_init << 7; } /* Product: '/Divide1' incorporates: * Product: '/Divide4' */ tmp = ((int64_T)(int32_T)tmp_0 * rtu_I) >> 14; if (tmp > 2147483647LL) { tmp = 2147483647LL; } else { if (tmp < -2147483648LL) { tmp = -2147483648LL; } } /* Sum: '/Sum2' incorporates: * Product: '/Divide1' * UnitDelay: '/UnitDelay' */ tmp = (int64_T)(int32_T)tmp + localDW->UnitDelay_DSTATE; if (tmp > 2147483647LL) { tmp = 2147483647LL; } else { if (tmp < -2147483648LL) { tmp = -2147483648LL; } } /* Sum: '/Sum1' incorporates: * Delay: '/Resettable Delay' * Sum: '/Sum2' */ tmp = (((int64_T)localDW->ResettableDelay_DSTATE << 2) + (int32_T)tmp) >> 2; if (tmp > 2147483647LL) { tmp = 2147483647LL; } else { if (tmp < -2147483648LL) { tmp = -2147483648LL; } } /* Sum: '/Sum6' incorporates: * DataTypeConversion: '/Data Type Conversion1' * Product: '/Divide4' * Sum: '/Sum1' */ tmp_0 = (int64_T)((int32_T)tmp << 2) + (int32_T)tmp_0; if (tmp_0 > 2147483647LL) { tmp_0 = 2147483647LL; } else { if (tmp_0 < -2147483648LL) { tmp_0 = -2147483648LL; } } /* RelationalOperator: '/LowerRelop1' incorporates: * Switch: '/Switch2' */ rty_pi_out_0 = rtu_satMax << 9; /* Switch: '/Switch2' incorporates: * RelationalOperator: '/LowerRelop1' * Sum: '/Sum6' */ if ((int32_T)tmp_0 <= rty_pi_out_0) { /* RelationalOperator: '/UpperRelop' incorporates: * Switch: '/Switch' */ rty_pi_out_0 = rtu_satMin << 9; /* Switch: '/Switch' incorporates: * RelationalOperator: '/UpperRelop' */ if ((int32_T)tmp_0 >= rty_pi_out_0) { rty_pi_out_0 = (int32_T)tmp_0; } } /* Update for UnitDelay: '/UnitDelay' incorporates: * Product: '/Divide2' * Sum: '/Sum3' * Sum: '/Sum6' */ localDW->UnitDelay_DSTATE = (int32_T)(((int64_T)(rty_pi_out_0 - (int32_T)tmp_0) * rtu_Kb) >> 14); /* Update for Delay: '/Resettable Delay' incorporates: * Sum: '/Sum1' */ localDW->icLoad = 0U; localDW->ResettableDelay_DSTATE = (int32_T)tmp; return rty_pi_out_0; } /* * System initialize for atomic system: * '/PI_backCalc_fixdt' * '/PI_backCalc_fixdt1' */ void PI_backCalc_fixdt_p_Init(DW_PI_backCalc_fixdt_i *localDW) { /* InitializeConditions for Delay: '/Resettable Delay' */ localDW->icLoad = 1U; } /* * Output and update for atomic system: * '/PI_backCalc_fixdt' * '/PI_backCalc_fixdt1' */ int32_T PI_backCalc_fixdt_o(int16_T rtu_err, int16_T rtu_P, int16_T rtu_I, int16_T rtu_Kb, int16_T rtu_satMax, int16_T rtu_satMin, int16_T rtu_init, uint8_T rtu_reset, DW_PI_backCalc_fixdt_i *localDW, ZCE_PI_backCalc_fixdt_e *localZCE) { int32_T rty_pi_out_0; int64_T tmp; int64_T tmp_0; int32_T rtb_Divide4_n; /* Product: '/Divide4' */ rtb_Divide4_n = (rtu_err * rtu_P) >> 1; /* Delay: '/Resettable Delay' incorporates: * DataTypeConversion: '/Data Type Conversion2' */ if ((rtu_reset > 0) && (localZCE->ResettableDelay_Reset_ZCE != POS_ZCSIG)) { localDW->icLoad = 1U; } localZCE->ResettableDelay_Reset_ZCE = (ZCSigState)(rtu_reset > 0); if (localDW->icLoad != 0) { localDW->ResettableDelay_DSTATE = rtu_init << 7; } /* Product: '/Divide1' incorporates: * Product: '/Divide4' */ tmp_0 = ((int64_T)rtb_Divide4_n * rtu_I) >> 14; if (tmp_0 > 2147483647LL) { tmp_0 = 2147483647LL; } else { if (tmp_0 < -2147483648LL) { tmp_0 = -2147483648LL; } } /* Sum: '/Sum2' incorporates: * Product: '/Divide1' * UnitDelay: '/UnitDelay' */ tmp_0 = (int64_T)(int32_T)tmp_0 + localDW->UnitDelay_DSTATE; if (tmp_0 > 2147483647LL) { tmp_0 = 2147483647LL; } else { if (tmp_0 < -2147483648LL) { tmp_0 = -2147483648LL; } } /* Sum: '/Sum1' incorporates: * Delay: '/Resettable Delay' * Sum: '/Sum2' */ tmp_0 = (((int64_T)localDW->ResettableDelay_DSTATE << 2) + (int32_T)tmp_0) >> 2; if (tmp_0 > 2147483647LL) { tmp_0 = 2147483647LL; } else { if (tmp_0 < -2147483648LL) { tmp_0 = -2147483648LL; } } /* Sum: '/Sum6' incorporates: * DataTypeConversion: '/Data Type Conversion1' * Product: '/Divide4' * Sum: '/Sum1' */ tmp = (int64_T)((int32_T)tmp_0 << 2) + rtb_Divide4_n; if (tmp > 2147483647LL) { tmp = 2147483647LL; } else { if (tmp < -2147483648LL) { tmp = -2147483648LL; } } /* RelationalOperator: '/LowerRelop1' incorporates: * Switch: '/Switch2' */ rty_pi_out_0 = rtu_satMax << 9; /* Switch: '/Switch2' incorporates: * RelationalOperator: '/LowerRelop1' * Sum: '/Sum6' */ if ((int32_T)tmp <= rty_pi_out_0) { /* RelationalOperator: '/UpperRelop' incorporates: * Switch: '/Switch' */ rty_pi_out_0 = rtu_satMin << 9; /* Switch: '/Switch' incorporates: * RelationalOperator: '/UpperRelop' */ if ((int32_T)tmp >= rty_pi_out_0) { rty_pi_out_0 = (int32_T)tmp; } } /* Update for UnitDelay: '/UnitDelay' incorporates: * Product: '/Divide2' * Sum: '/Sum3' * Sum: '/Sum6' */ localDW->UnitDelay_DSTATE = (int32_T)(((int64_T)(rty_pi_out_0 - (int32_T)tmp) * rtu_Kb) >> 14); /* Update for Delay: '/Resettable Delay' incorporates: * Sum: '/Sum1' */ localDW->icLoad = 0U; localDW->ResettableDelay_DSTATE = (int32_T)tmp_0; return rty_pi_out_0; } /* * Output and update for action system: * '/RateInit' * '/RateInit' */ void RateInit(int16_T rtu_initVal, int16_T rtu_target, int16_T rtu_step, int16_T *rty_s_step, int16_T *rty_High, int16_T *rty_Low) { int16_T rtb_Add_b; /* Sum: '/Add' */ rtb_Add_b = (int16_T)((rtu_target - rtu_initVal) >> 1); /* Signum: '/Sign' incorporates: * Sum: '/Add' */ if (rtb_Add_b < 0) { rtb_Add_b = -1; } else { rtb_Add_b = (int16_T)(rtb_Add_b > 0); } /* End of Signum: '/Sign' */ /* Product: '/Divide' */ *rty_s_step = (int16_T)(rtu_step * rtb_Add_b); /* MinMax: '/Max' */ if (rtu_target > rtu_initVal) { *rty_High = rtu_target; } else { *rty_High = rtu_initVal; } /* End of MinMax: '/Max' */ /* MinMax: '/Max1' */ if (rtu_initVal < rtu_target) { *rty_Low = rtu_initVal; } else { *rty_Low = rtu_target; } /* End of MinMax: '/Max1' */ } int16_T rt_sqrt_Us32En10_Ys16E_7VJYwqF9(int32_T u) { int32_T iBit; int16_T shiftMask; int16_T tmp01_y; int16_T y; /* Fixed-Point Sqrt Computation by the bisection method. */ if (u > 0) { y = 0; shiftMask = 16384; for (iBit = 0; iBit < 15; iBit++) { tmp01_y = (int16_T)(y | shiftMask); if (tmp01_y * tmp01_y <= u) { y = tmp01_y; } shiftMask = (int16_T)((uint32_T)shiftMask >> 1U); } } else { y = 0; } return y; } uint16_T rt_sqrt_Uu16En14_Yu16E_WMwW1mku(uint16_T u) { int32_T iBit; uint32_T tmp03_u; uint16_T shiftMask; uint16_T tmp01_y; uint16_T y; /* Fixed-Point Sqrt Computation by the bisection method. */ if (u > 0) { y = 0U; shiftMask = 32768U; tmp03_u = (uint32_T)u << 14; for (iBit = 0; iBit < 16; iBit++) { tmp01_y = (uint16_T)(y | shiftMask); if ((uint32_T)tmp01_y * tmp01_y <= tmp03_u) { y = tmp01_y; } shiftMask = (uint16_T)((uint32_T)shiftMask >> 1U); } } else { y = 0U; } return y; } /* Model step function */ void PMSM_Controller_step(RT_MODEL *const rtM) { DW *rtDW = rtM->dwork; PrevZCX *rtPrevZCX = rtM->prevZCSigState; ExtU *rtU = (ExtU *) rtM->inputs; ExtY *rtY = (ExtY *) rtM->outputs; int64_T tmp; uint64_T tmp_3; int32_T rtb_Gain_b0; int32_T rtb_Gain_p2; int32_T rtb_Sum1; int32_T rtb_Switch; int32_T rtb_Switch3; int32_T tmp_0; int32_T tmp_1; int32_T tmp_2; uint32_T qY; uint32_T rtb_Switch2; int16_T rtb_Multiply[2]; int16_T rtb_UnitDelay1[2]; int16_T rtb_Divide1_m; int16_T rtb_Divide3_k; int16_T rtb_Sum1_a; int16_T rtb_Sum3_jm; int16_T rtb_Sum6_k; int16_T rtb_Sum6_p; int16_T rtb_Switch_f_idx_0; int16_T rtb_Switch_f_idx_1; int16_T rtb_r_cos_M1; uint16_T rtb_BitwiseOperator2; uint16_T rtb_LogicalOperator3; int8_T UnitDelay3; int8_T rtb_Sum2; int8_T rtb_Sum2_tmp; uint8_T rtb_Add_gf; uint8_T rtb_DataTypeConversion_j; uint8_T rtb_Sum_i; uint8_T rtb_UnitDelay_bc; uint8_T rtb_z_ctrlMod; boolean_T rtb_Equal_k; boolean_T rtb_LogicalOperator12; boolean_T rtb_LogicalOperator2_h; boolean_T rtb_LogicalOperator4_e; boolean_T rtb_RelationalOperator4_f; boolean_T rtb_n_commDeacv; /* Outputs for Atomic SubSystem: '/PMSM_Controller' */ /* UnitDelay: '/UnitDelay1' */ rtb_UnitDelay1[0] = rtDW->UnitDelay1_DSTATE_f[0]; rtb_UnitDelay1[1] = rtDW->UnitDelay1_DSTATE_f[1]; /* S-Function (sfix_bitop): '/Bitwise Operator2' incorporates: * Inport: '/FOC_Flags' */ rtb_BitwiseOperator2 = (uint16_T)(rtU->FOC_Flags & 1); /* UnitDelay: '/UnitDelay' */ rtb_UnitDelay_bc = rtDW->UnitDelay_DSTATE_j; /* Logic: '/Edge_Detect' incorporates: * Delay: '/Delay' * Delay: '/Delay1' * Delay: '/Delay2' * Inport: '/hall_A' * Inport: '/hall_B' * Inport: '/hall_C' */ rtb_Equal_k = (boolean_T)((rtU->hall_A != 0) ^ (rtDW->Delay_DSTATE_d != 0) ^ (rtU->hall_B != 0) ^ (rtDW->Delay1_DSTATE != 0) ^ (rtU->hall_C != 0)) ^ (rtDW->Delay2_DSTATE != 0); /* Sum: '/Add' incorporates: * Gain: '/Gain' * Gain: '/Gain1' * Inport: '/hall_A' * Inport: '/hall_B' * Inport: '/hall_C' */ rtb_Add_gf = (uint8_T)((uint32_T)(uint8_T)((uint32_T)(uint8_T)(rtU->hall_C << 2) + (uint8_T)(rtU->hall_B << 1)) + rtU->hall_A); /* If: '/If2' incorporates: * If: '/If2' * Inport: '/z_counterRawPrev' * UnitDelay: '/UnitDelay3' */ if (rtb_Equal_k) { /* Outputs for IfAction SubSystem: '/Direction_Detection' incorporates: * ActionPort: '/Action Port' */ /* UnitDelay: '/UnitDelay3' */ UnitDelay3 = rtDW->Switch2_i; /* End of Outputs for SubSystem: '/Direction_Detection' */ /* Selector: '/Selector' incorporates: * Constant: '/vec_hallToPos' */ rtb_Sum2_tmp = rtConstP.vec_hallToPos_Value[rtb_Add_gf]; /* Outputs for IfAction SubSystem: '/Direction_Detection' incorporates: * ActionPort: '/Action Port' */ /* Sum: '/Sum2' incorporates: * Constant: '/vec_hallToPos' * Selector: '/Selector' * UnitDelay: '/UnitDelay2' */ rtb_Sum2 = (int8_T)(rtb_Sum2_tmp - rtDW->UnitDelay2_DSTATE_j); /* Switch: '/Switch2' incorporates: * Constant: '/Constant20' * Constant: '/Constant8' * Logic: '/Logical Operator3' * RelationalOperator: '/Relational Operator1' * RelationalOperator: '/Relational Operator6' */ if ((rtb_Sum2 == 1) || (rtb_Sum2 == -5)) { /* Switch: '/Switch2' incorporates: * Constant: '/Constant24' */ rtDW->Switch2_i = 1; } else { /* Switch: '/Switch2' incorporates: * Constant: '/Constant23' */ rtDW->Switch2_i = -1; } /* End of Switch: '/Switch2' */ /* Update for UnitDelay: '/UnitDelay2' */ rtDW->UnitDelay2_DSTATE_j = rtb_Sum2_tmp; /* End of Outputs for SubSystem: '/Direction_Detection' */ /* Outputs for IfAction SubSystem: '/Raw_Motor_Speed_Estimation' incorporates: * ActionPort: '/Action Port' */ /* RelationalOperator: '/Relational Operator4' */ rtb_RelationalOperator4_f = (rtDW->Switch2_i != UnitDelay3); rtDW->z_counterRawPrev = rtDW->UnitDelay3_DSTATE; /* Switch: '/Switch3' incorporates: * Constant: '/Constant4' * Inport: '/z_counterRawPrev' * Logic: '/Logical Operator1' * Switch: '/Switch2' * UnitDelay: '/UnitDelay3' * UnitDelay: '/UnitDelay1' */ if (rtb_RelationalOperator4_f && rtDW->UnitDelay1_DSTATE_iv) { rtb_Switch3 = 0; } else { if (rtb_RelationalOperator4_f) { /* Switch: '/Switch2' incorporates: * UnitDelay: '/UnitDelay4' */ rtb_Switch2 = rtDW->UnitDelay4_DSTATE; } else { /* Sum: '/Sum13' incorporates: * Switch: '/Switch2' * UnitDelay: '/UnitDelay2' * UnitDelay: '/UnitDelay3' * UnitDelay: '/UnitDelay5' */ tmp_3 = (((uint64_T)rtDW->UnitDelay2_DSTATE + rtDW->UnitDelay3_DSTATE_l) + rtDW->UnitDelay5_DSTATE) + rtDW->z_counterRawPrev; if (tmp_3 > 4294967295ULL) { tmp_3 = 4294967295ULL; } /* Product: '/Divide13' incorporates: * Constant: '/cf_speedCoef' * Constant: '/cf_speedCoef1' * Gain: '/g_Ha' * Product: '/Divide' * Sum: '/Sum13' * Switch: '/Switch2' */ tmp_3 = ((uint64_T)((10000000U / rtP.n_polePairs) << 2) << 4) / (uint32_T)tmp_3; if (tmp_3 > 4294967295ULL) { tmp_3 = 4294967295ULL; } /* Switch: '/Switch2' incorporates: * Product: '/Divide13' */ rtb_Switch2 = (uint32_T)tmp_3; } rtb_Switch3 = (int32_T)rtb_Switch2; } /* End of Switch: '/Switch3' */ /* Product: '/Divide11' incorporates: * Switch: '/Switch3' */ rtDW->Divide11 = rtb_Switch3 * rtDW->Switch2_i; /* Update for UnitDelay: '/UnitDelay1' */ rtDW->UnitDelay1_DSTATE_iv = rtb_RelationalOperator4_f; /* Update for UnitDelay: '/UnitDelay2' incorporates: * UnitDelay: '/UnitDelay3' */ rtDW->UnitDelay2_DSTATE = rtDW->UnitDelay3_DSTATE_l; /* Update for UnitDelay: '/UnitDelay3' incorporates: * UnitDelay: '/UnitDelay5' */ rtDW->UnitDelay3_DSTATE_l = rtDW->UnitDelay5_DSTATE; /* Update for UnitDelay: '/UnitDelay5' */ rtDW->UnitDelay5_DSTATE = rtDW->z_counterRawPrev; /* End of Outputs for SubSystem: '/Raw_Motor_Speed_Estimation' */ } /* End of If: '/If2' */ /* Switch: '/Switch2' incorporates: * Constant: '/Constant4' * Constant: '/z_maxCntRst' * Gain: '/Gain' * Inport: '/us_Count' * Product: '/Divide11' * RelationalOperator: '/Relational Operator2' */ if (rtU->us_Count >= (rtP.n_hall_count_ps << 1)) { rtb_Switch3 = 0; } else { rtb_Switch3 = rtDW->Divide11; } /* End of Switch: '/Switch2' */ /* Abs: '/Abs5' incorporates: * Switch: '/Switch2' */ if (rtb_Switch3 < 0) { rtb_Switch2 = (uint32_T)-rtb_Switch3; } else { rtb_Switch2 = (uint32_T)rtb_Switch3; } /* End of Abs: '/Abs5' */ /* If: '/If1' */ if (rtb_Equal_k) { /* Outputs for IfAction SubSystem: '/AdvCtrlDetect' incorporates: * ActionPort: '/Action Port' */ /* Relay: '/n_commDeacv' incorporates: * Abs: '/Abs5' */ rtDW->n_commDeacv_Mode = ((rtb_Switch2 >= 480U) || ((rtb_Switch2 > 240U) && rtDW->n_commDeacv_Mode)); /* RelationalOperator: '/Compare' incorporates: * Constant: '/Constant' * Relay: '/n_commDeacv' * Sum: '/Sum13' * UnitDelay: '/UnitDelay2' * UnitDelay: '/UnitDelay3' * UnitDelay: '/UnitDelay5' */ rtDW->Compare = ((uint16_T)((uint32_T)(uint16_T)((uint32_T)(uint16_T) ((uint32_T)rtDW->UnitDelay2_DSTATE_f + rtDW->UnitDelay3_DSTATE_lh) + rtDW->UnitDelay5_DSTATE_f) + rtDW->n_commDeacv_Mode) >= 4); /* Update for UnitDelay: '/UnitDelay2' incorporates: * UnitDelay: '/UnitDelay3' */ rtDW->UnitDelay2_DSTATE_f = rtDW->UnitDelay3_DSTATE_lh; /* Update for UnitDelay: '/UnitDelay3' incorporates: * UnitDelay: '/UnitDelay5' */ rtDW->UnitDelay3_DSTATE_lh = rtDW->UnitDelay5_DSTATE_f; /* Update for UnitDelay: '/UnitDelay5' incorporates: * Logic: '/Logical Operator3' * Relay: '/n_commDeacv' */ rtDW->UnitDelay5_DSTATE_f = rtDW->n_commDeacv_Mode; /* End of Outputs for SubSystem: '/AdvCtrlDetect' */ } /* End of If: '/If1' */ /* Switch: '/Switch3' incorporates: * Abs: '/Abs5' * Abs: '/Abs4' * Constant: '/CTRL_COMM4' * Inport: '/b_motEna' * Logic: '/Logical Operator1' * RelationalOperator: '/Relational Operator9' * RelationalOperator: '/Relational Operator7' * S-Function (sfix_bitop): '/Bitwise Operator1' * UnitDelay: '/UnitDelay1' */ if ((rtb_UnitDelay_bc & 4U) != 0U) { rtb_Equal_k = true; } else { if (rtDW->UnitDelay1_DSTATE_f[1] < 0) { /* Abs: '/Abs4' incorporates: * UnitDelay: '/UnitDelay1' */ rtb_Sum6_p = (int16_T)-rtDW->UnitDelay1_DSTATE_f[1]; } else { /* Abs: '/Abs4' incorporates: * UnitDelay: '/UnitDelay1' */ rtb_Sum6_p = rtDW->UnitDelay1_DSTATE_f[1]; } rtb_Equal_k = (rtU->b_motEna && (rtb_Switch2 < 48U) && (rtb_Sum6_p > 9920)); } /* End of Switch: '/Switch3' */ /* Sum: '/Sum' incorporates: * Constant: '/CTRL_COMM' * Constant: '/CTRL_COMM1' * DataTypeConversion: '/Data Type Conversion3' * Gain: '/g_Hb' * Gain: '/g_Hb1' * RelationalOperator: '/Relational Operator1' * RelationalOperator: '/Relational Operator3' */ rtb_Sum_i = (uint8_T)(((uint32_T)((rtb_Add_gf == 7) << 1) + (rtb_Add_gf == 0)) + (rtb_Equal_k << 2)); /* RelationalOperator: '/Relational Operator2' incorporates: * Constant: '/CTRL_COMM2' */ rtb_RelationalOperator4_f = (rtb_Sum_i != 0); /* RelationalOperator: '/Relational Operator' incorporates: * UnitDelay: '/UnitDelay' */ rtb_n_commDeacv = (rtb_RelationalOperator4_f != rtDW->UnitDelay_DSTATE_n); /* If: '/If2' incorporates: * Inport: '/yPrev' * Logic: '/Logical Operator1' * Logic: '/Logical Operator2' * Logic: '/Logical Operator3' * Logic: '/Logical Operator4' * UnitDelay: '/UnitDelay' */ if (rtb_RelationalOperator4_f && (!rtDW->UnitDelay_DSTATE_k)) { /* Outputs for IfAction SubSystem: '/Qualification' incorporates: * ActionPort: '/Action Port' */ /* Switch: '/Switch1' incorporates: * Constant: '/Constant23' * UnitDelay: '/UnitDelay' */ if (rtb_n_commDeacv) { rtb_LogicalOperator3 = 0U; } else { rtb_LogicalOperator3 = rtDW->UnitDelay_DSTATE_p; } /* End of Switch: '/Switch1' */ /* Switch: '/Switch2' incorporates: * Constant: '/t_errQual' * Constant: '/Constant6' * RelationalOperator: '/Relational Operator2' * Sum: '/Sum1' */ rtb_n_commDeacv = (((uint16_T)(rtb_LogicalOperator3 + 1U) > 1600) || rtDW->UnitDelay_DSTATE_k); /* MinMax: '/MinMax' incorporates: * Constant: '/Constant6' * Sum: '/Sum1' */ if ((uint16_T)(rtb_LogicalOperator3 + 1U) < 1600) { /* Update for UnitDelay: '/UnitDelay' */ rtDW->UnitDelay_DSTATE_p = (uint16_T)(rtb_LogicalOperator3 + 1U); } else { /* Update for UnitDelay: '/UnitDelay' */ rtDW->UnitDelay_DSTATE_p = 1600U; } /* End of MinMax: '/MinMax' */ /* End of Outputs for SubSystem: '/Qualification' */ } else if ((!rtb_RelationalOperator4_f) && rtDW->UnitDelay_DSTATE_k) { /* Outputs for IfAction SubSystem: '/Dequalification' incorporates: * ActionPort: '/Action Port' */ /* Switch: '/Switch1' incorporates: * Constant: '/Constant23' * UnitDelay: '/UnitDelay' */ if (rtb_n_commDeacv) { rtb_LogicalOperator3 = 0U; } else { rtb_LogicalOperator3 = rtDW->UnitDelay_DSTATE_f; } /* End of Switch: '/Switch1' */ /* Switch: '/Switch2' incorporates: * Constant: '/t_errDequal' * Constant: '/Constant6' * RelationalOperator: '/Relational Operator2' * Sum: '/Sum1' */ rtb_n_commDeacv = (((uint16_T)(rtb_LogicalOperator3 + 1U) <= 12000) && rtDW->UnitDelay_DSTATE_k); /* MinMax: '/MinMax' incorporates: * Constant: '/Constant6' * Sum: '/Sum1' */ if ((uint16_T)(rtb_LogicalOperator3 + 1U) < 12000) { /* Update for UnitDelay: '/UnitDelay' */ rtDW->UnitDelay_DSTATE_f = (uint16_T)(rtb_LogicalOperator3 + 1U); } else { /* Update for UnitDelay: '/UnitDelay' */ rtDW->UnitDelay_DSTATE_f = 12000U; } /* End of MinMax: '/MinMax' */ /* End of Outputs for SubSystem: '/Dequalification' */ } else { /* Outputs for IfAction SubSystem: '/Default' incorporates: * ActionPort: '/Action Port' */ rtb_n_commDeacv = rtDW->UnitDelay_DSTATE_k; /* End of Outputs for SubSystem: '/Default' */ } /* End of If: '/If2' */ /* Logic: '/Logical Operator12' incorporates: * Inport: '/b_motEna' * Logic: '/Logical Operator7' */ rtb_LogicalOperator12 = ((!rtb_n_commDeacv) && rtU->b_motEna); /* Logic: '/Logical Operator4' incorporates: * Constant: '/constant8' * Inport: '/n_ctrlModReq' * Logic: '/Logical Operator11' * Logic: '/Logical Operator8' * RelationalOperator: '/Relational Operator10' */ rtb_LogicalOperator4_e = ((rtb_BitwiseOperator2 != 0) || (!rtDW->Compare) || ( !rtb_LogicalOperator12) || (rtU->n_ctrlModReq == 0)); /* Abs: '/Abs2' incorporates: * Switch: '/Switch2' */ if (rtb_Switch3 < 0) { rtb_LogicalOperator3 = (uint16_T)((uint32_T)-rtb_Switch3 >> 4); } else { rtb_LogicalOperator3 = (uint16_T)((uint32_T)rtb_Switch3 >> 4); } /* End of Abs: '/Abs2' */ /* Relay: '/n_SpeedCtrl' */ rtDW->n_SpeedCtrl_Mode = ((rtb_LogicalOperator3 >= 300) || ((rtb_LogicalOperator3 > 200) && rtDW->n_SpeedCtrl_Mode)); /* Logic: '/Logical Operator10' incorporates: * Inport: '/b_cruiseEna' * Relay: '/n_SpeedCtrl' */ rtb_Equal_k = (rtDW->n_SpeedCtrl_Mode && rtU->b_cruiseEna); /* Logic: '/Logical Operator2' incorporates: * Constant: '/constant' * Inport: '/n_ctrlModReq' * Logic: '/Logical Operator5' * RelationalOperator: '/Relational Operator4' */ rtb_LogicalOperator2_h = ((rtU->n_ctrlModReq == 2) && (!rtb_Equal_k)); /* Logic: '/Logical Operator1' incorporates: * Constant: '/constant1' * Inport: '/n_ctrlModReq' * RelationalOperator: '/Relational Operator1' */ rtb_Equal_k = ((rtU->n_ctrlModReq == 1) || rtb_Equal_k); /* Chart: '/Control_Mode_Manager' incorporates: * Logic: '/Logical Operator3' * Logic: '/Logical Operator6' * Logic: '/Logical Operator9' */ if (rtDW->is_active_c5_PMSM_Controller == 0U) { rtDW->is_active_c5_PMSM_Controller = 1U; rtDW->is_c5_PMSM_Controller = IN_OPEN; rtb_z_ctrlMod = OPEN_MODE; } else if (rtDW->is_c5_PMSM_Controller == 1) { if (rtb_LogicalOperator4_e) { rtDW->is_ACTIVE = IN_NO_ACTIVE_CHILD; rtDW->is_c5_PMSM_Controller = IN_OPEN; rtb_z_ctrlMod = OPEN_MODE; } else if (rtDW->is_ACTIVE == 1) { rtb_z_ctrlMod = SPD_MODE; if (!rtb_Equal_k) { if (rtb_LogicalOperator2_h) { rtDW->is_ACTIVE = IN_TORQUE_MODE; rtb_z_ctrlMod = TRQ_MODE; } else { rtDW->is_ACTIVE = IN_SPEED_MODE; } } } else { /* case IN_TORQUE_MODE: */ rtb_z_ctrlMod = TRQ_MODE; if (!rtb_LogicalOperator2_h) { rtDW->is_ACTIVE = IN_SPEED_MODE; rtb_z_ctrlMod = SPD_MODE; } } } else { /* case IN_OPEN: */ rtb_z_ctrlMod = OPEN_MODE; if ((!rtb_LogicalOperator4_e) && (rtb_LogicalOperator2_h || rtb_Equal_k)) { rtDW->is_c5_PMSM_Controller = IN_ACTIVE; if (rtb_LogicalOperator2_h) { rtDW->is_ACTIVE = IN_TORQUE_MODE; rtb_z_ctrlMod = TRQ_MODE; } else { rtDW->is_ACTIVE = IN_SPEED_MODE; rtb_z_ctrlMod = SPD_MODE; } } } /* End of Chart: '/Control_Mode_Manager' */ /* Gain: '/Multiply' incorporates: * Inport: '/adc_Pha' * Inport: '/adc_Phb' */ rtb_Gain_b0 = (12351 * rtU->adc_Pha) >> 12; if (rtb_Gain_b0 > 32767) { rtb_Gain_b0 = 32767; } else { if (rtb_Gain_b0 < -32768) { rtb_Gain_b0 = -32768; } } tmp_2 = (12351 * rtU->adc_Phb) >> 12; if (tmp_2 > 32767) { tmp_2 = 32767; } else { if (tmp_2 < -32768) { tmp_2 = -32768; } } /* Sum: '/Add' incorporates: * Gain: '/Multiply' */ tmp_0 = (int16_T)rtb_Gain_b0 + (int16_T)tmp_2; if (tmp_0 > 32767) { tmp_0 = 32767; } else { if (tmp_0 < -32768) { tmp_0 = -32768; } } /* Sum: '/Add1' incorporates: * Sum: '/Add' */ tmp_1 = -tmp_0; if (-tmp_0 > 32767) { tmp_1 = 32767; } /* Sum: '/Add3' incorporates: * Gain: '/Multiply' * Sum: '/Add1' */ tmp_0 = (int16_T)tmp_2 + (int16_T)tmp_1; /* Gain: '/Gain' incorporates: * Gain: '/Multiply' */ if ((int16_T)rtb_Gain_b0 > 16383) { rtb_Sum6_p = MAX_int16_T; } else if ((int16_T)rtb_Gain_b0 <= -16384) { rtb_Sum6_p = MIN_int16_T; } else { rtb_Sum6_p = (int16_T)((int16_T)rtb_Gain_b0 << 1); } /* End of Gain: '/Gain' */ /* Sum: '/Add3' */ if (tmp_0 > 16383) { rtb_Divide1_m = MAX_int16_T; } else if (tmp_0 <= -16384) { rtb_Divide1_m = MIN_int16_T; } else { rtb_Divide1_m = (int16_T)(tmp_0 << 1); } /* Sum: '/Add' */ rtb_Gain_b0 = ((rtb_Sum6_p << 1) - rtb_Divide1_m) >> 1; if (rtb_Gain_b0 > 32767) { rtb_Gain_b0 = 32767; } else { if (rtb_Gain_b0 < -32768) { rtb_Gain_b0 = -32768; } } /* Gain: '/Gain1' incorporates: * Product: '/Divide1' * Sum: '/Add' */ rtb_Divide1_m = (int16_T)((21845 * rtb_Gain_b0) >> 16); /* Switch: '/Switch3' incorporates: * Constant: '/Constant16' * Constant: '/Constant2' * Constant: '/vec_hallToPos' * RelationalOperator: '/Relational Operator7' * Selector: '/Selector' * Sum: '/Sum1' */ if (rtDW->Switch2_i == 1) { rtb_Sum2 = rtConstP.vec_hallToPos_Value[rtb_Add_gf]; } else { rtb_Sum2 = (int8_T)(rtConstP.vec_hallToPos_Value[rtb_Add_gf] + 1); } /* End of Switch: '/Switch3' */ /* MinMax: '/MinMax' incorporates: * Inport: '/us_Count' */ if (rtU->us_Count < rtDW->z_counterRawPrev) { qY = rtU->us_Count; } else { qY = rtDW->z_counterRawPrev; } /* End of MinMax: '/MinMax' */ /* Sum: '/Sum3' incorporates: * Product: '/Divide1' * Product: '/Divide3' */ rtb_Sum3_jm = (int16_T)(((int16_T)((int16_T)(((uint64_T)qY << 14) / rtDW->z_counterRawPrev) * rtDW->Switch2_i) + (rtb_Sum2 << 14)) >> 2); /* MinMax: '/MinMax1' incorporates: * Constant: '/Constant1' * Sum: '/Sum3' * Switch: '/Switch2' */ if (rtb_Sum3_jm <= 0) { rtb_Sum3_jm = 0; } /* End of MinMax: '/MinMax1' */ /* Sum: '/Add2' incorporates: * Constant: '/Constant2' * Product: '/Divide2' */ rtb_Sum3_jm = (int16_T)((((15 * rtb_Sum3_jm) >> 4) + (rtP.i_hall_offset << 2)) >> 2); /* DataTypeConversion: '/Data Type Conversion' incorporates: * Sum: '/Add2' */ rtb_r_cos_M1 = (int16_T)(rtb_Sum3_jm >> 4); /* If: '/If' incorporates: * Constant: '/Constant1' * Constant: '/Constant3' * Inport: '/In1' * Inport: '/In1' * Merge: '/Merge' * Sum: '/Add' * Sum: '/Add1' * Sum: '/Add2' */ if (rtb_r_cos_M1 >= 360) { /* Outputs for IfAction SubSystem: '/If Action Subsystem' incorporates: * ActionPort: '/Action Port' */ rtb_Sum3_jm = (int16_T)(rtb_Sum3_jm - 5760); /* End of Outputs for SubSystem: '/If Action Subsystem' */ } else { if (rtb_r_cos_M1 < 0) { /* Outputs for IfAction SubSystem: '/If Action Subsystem2' incorporates: * ActionPort: '/Action Port' */ rtb_Sum3_jm = (int16_T)(rtb_Sum3_jm + 5760); /* End of Outputs for SubSystem: '/If Action Subsystem2' */ } } /* End of If: '/If' */ /* If: '/If' incorporates: * Inport: '/FOC_Flags' */ if ((rtU->FOC_Flags == 0) || (rtU->FOC_Flags == 2)) { /* Outputs for IfAction SubSystem: '/If Action Subsystem' incorporates: * ActionPort: '/Action Port' */ /* Merge: '/Merge' incorporates: * Inport: '/In1' * Merge: '/Merge' */ rtDW->Merge_i = rtb_Sum3_jm; /* End of Outputs for SubSystem: '/If Action Subsystem' */ } else { if (rtU->FOC_Flags == 1) { /* Outputs for IfAction SubSystem: '/If Action Subsystem1' incorporates: * ActionPort: '/Action Port' */ /* Merge: '/Merge' incorporates: * Inport: '/theta_Open' * Inport: '/In1' */ rtDW->Merge_i = rtU->theta_Open; /* End of Outputs for SubSystem: '/If Action Subsystem1' */ } } /* End of If: '/If' */ /* PreLookup: '/a_elecAngle_XA' incorporates: * Merge: '/Merge' */ rtb_LogicalOperator3 = plook_u16s16_evencka(rtDW->Merge_i, 0, 16U, 360U); /* Sum: '/Add2' incorporates: * Gain: '/Multiply' * Sum: '/Add1' */ rtb_Gain_b0 = (int16_T)tmp_2 - (int16_T)tmp_1; if (rtb_Gain_b0 > 32767) { rtb_Gain_b0 = 32767; } else { if (rtb_Gain_b0 < -32768) { rtb_Gain_b0 = -32768; } } /* Gain: '/Gain2' incorporates: * Sum: '/Add2' * Sum: '/Sum6' */ rtb_Sum6_p = (int16_T)((18919 * rtb_Gain_b0) >> 15); /* Sum: '/Sum1' incorporates: * Interpolation_n-D: '/r_cos_M1' * Interpolation_n-D: '/r_sin_M1' * Product: '/Divide1' * Product: '/Divide2' * Product: '/Divide3' * Sum: '/Sum6' */ rtb_Gain_b0 = ((rtb_Divide1_m * rtConstP.pooled8[rtb_LogicalOperator3]) >> 14) + (int16_T)((rtb_Sum6_p * rtConstP.pooled7[rtb_LogicalOperator3]) >> 14); if (rtb_Gain_b0 > 32767) { rtb_Gain_b0 = 32767; } else { if (rtb_Gain_b0 < -32768) { rtb_Gain_b0 = -32768; } } /* SignalConversion generated from: '/Low_Pass_Filter' incorporates: * Sum: '/Sum1' */ rtb_Multiply[0] = (int16_T)rtb_Gain_b0; /* Sum: '/Sum6' incorporates: * Interpolation_n-D: '/r_cos_M1' * Interpolation_n-D: '/r_sin_M1' * Product: '/Divide1' * Product: '/Divide4' */ rtb_Gain_b0 = (int16_T)((rtb_Sum6_p * rtConstP.pooled8[rtb_LogicalOperator3]) >> 14) - ((rtb_Divide1_m * rtConstP.pooled7[rtb_LogicalOperator3]) >> 14); if (rtb_Gain_b0 > 32767) { rtb_Gain_b0 = 32767; } else { if (rtb_Gain_b0 < -32768) { rtb_Gain_b0 = -32768; } } /* SignalConversion generated from: '/Low_Pass_Filter' incorporates: * Sum: '/Sum6' */ rtb_Multiply[1] = (int16_T)rtb_Gain_b0; /* Outputs for Atomic SubSystem: '/Low_Pass_Filter' */ /* Constant: '/Constant' incorporates: * Outport: '/f_Idq' */ Low_Pass_Filter(rtb_Multiply, rtP.f_lpf_idq, rtY->f_Idq, &rtDW->Low_Pass_Filter_d); /* End of Outputs for SubSystem: '/Low_Pass_Filter' */ /* Switch: '/Switch' incorporates: * Constant: '/Constant3' * Inport: '/spd_Target' */ if (rtU->spd_Target > 240) { /* Switch: '/Switch1' incorporates: * Constant: '/Constant1' * DataTypeConversion: '/Data Type Conversion' * Switch: '/Switch' */ if (rtb_LogicalOperator12) { rtb_Switch = rtU->spd_Target; } else { rtb_Switch = 0; } /* End of Switch: '/Switch1' */ } else { rtb_Switch = 0; } /* End of Switch: '/Switch' */ /* Switch: '/Switch3' incorporates: * Constant: '/Constant4' * DataTypeConversion: '/Data Type Conversion2' * Inport: '/vdq_Open' */ if (rtb_LogicalOperator12) { rtb_Sum6_p = rtU->vdq_Open[1]; } else { rtb_Sum6_p = 0; } /* End of Switch: '/Switch3' */ /* Sum: '/Sum3' incorporates: * UnitDelay: '/UnitDelay1' */ qY = rtDW->UnitDelay1_DSTATE + /*MW:OvSatOk*/ 1U; if (rtDW->UnitDelay1_DSTATE + 1U < 1U) { qY = MAX_uint32_T; } /* RelationalOperator: '/Equal' incorporates: * Constant: '/Constant1' * Math: '/Rem' * Sum: '/Sum3' */ rtb_Equal_k = (qY % 40U == 0U); /* If: '/If' incorporates: * DataTypeConversion: '/Data Type Conversion1' * DataTypeConversion: '/Data Type Conversion2' * Inport: '/idq_Target' * Inport: '/vq_in' * Inport: '/r_currTgt' * Switch: '/Switch3' */ if (rtb_BitwiseOperator2 == 1) { /* Switch: '/Switch2' incorporates: * Constant: '/Constant2' * DataTypeConversion: '/Data Type Conversion1' * Inport: '/vdq_Open' * Inport: '/vd_in' */ if (rtb_LogicalOperator12) { /* Outputs for IfAction SubSystem: '/If Action Subsystem' incorporates: * ActionPort: '/Action Port' */ rtDW->Merge[0] = rtU->vdq_Open[0]; /* End of Outputs for SubSystem: '/If Action Subsystem' */ } else { /* Outputs for IfAction SubSystem: '/If Action Subsystem' incorporates: * ActionPort: '/Action Port' */ rtDW->Merge[0] = 0; /* End of Outputs for SubSystem: '/If Action Subsystem' */ } /* End of Switch: '/Switch2' */ /* Outputs for IfAction SubSystem: '/If Action Subsystem' incorporates: * ActionPort: '/Action Port' */ rtDW->Merge[1] = rtb_Sum6_p; /* End of Outputs for SubSystem: '/If Action Subsystem' */ } else if ((rtb_z_ctrlMod == 0) && rtb_Equal_k) { /* Outputs for IfAction SubSystem: '/open_mode' incorporates: * ActionPort: '/Action Port' */ /* RelationalOperator: '/Relational Operator' incorporates: * Switch: '/Switch3' * UnitDelay: '/UnitDelay' */ rtb_LogicalOperator12 = (rtb_Sum6_p != rtDW->UnitDelay_DSTATE_e); /* If: '/If' */ if (rtb_LogicalOperator12) { /* Outputs for IfAction SubSystem: '/RateInit' incorporates: * ActionPort: '/Action Port' */ /* Sum: '/Add' incorporates: * Switch: '/Switch3' * UnitDelay: '/UnitDelay1' */ rtb_Divide1_m = (int16_T)((rtb_Sum6_p - rtDW->UnitDelay1_DSTATE_f[1]) >> 1); /* Signum: '/Sign' incorporates: * Sum: '/Add' */ if (rtb_Divide1_m < 0) { rtb_Divide1_m = -1; } else { rtb_Divide1_m = (int16_T)(rtb_Divide1_m > 0); } /* End of Signum: '/Sign' */ /* Product: '/Divide' incorporates: * Constant: '/Constant5' */ rtDW->Divide = (int16_T)(rtP.dz_OpenStepVol * rtb_Divide1_m); /* MinMax: '/Max' incorporates: * Switch: '/Switch3' * UnitDelay: '/UnitDelay1' */ if (rtb_Sum6_p > rtDW->UnitDelay1_DSTATE_f[1]) { /* MinMax: '/Max' */ rtDW->Max_p = rtb_Sum6_p; } else { /* MinMax: '/Max' */ rtDW->Max_p = rtDW->UnitDelay1_DSTATE_f[1]; } /* End of MinMax: '/Max' */ /* MinMax: '/Max1' incorporates: * Switch: '/Switch3' * UnitDelay: '/UnitDelay1' */ if (rtDW->UnitDelay1_DSTATE_f[1] < rtb_Sum6_p) { /* MinMax: '/Max1' */ rtDW->Max1_g = rtDW->UnitDelay1_DSTATE_f[1]; } else { /* MinMax: '/Max1' */ rtDW->Max1_g = rtb_Sum6_p; } /* End of MinMax: '/Max1' */ /* End of Outputs for SubSystem: '/RateInit' */ /* Switch: '/Switch1' incorporates: * UnitDelay: '/UnitDelay1' */ rtb_r_cos_M1 = rtDW->UnitDelay1_DSTATE_f[1]; } else { /* Switch: '/Switch1' incorporates: * UnitDelay: '/UnitDelay' */ rtb_r_cos_M1 = rtDW->UnitDelay_DSTATE_fv; } /* End of If: '/If' */ /* Switch: '/Switch' incorporates: * Constant: '/Constant' * Product: '/Divide' * RelationalOperator: '/Equal' * Switch: '/Switch3' * UnitDelay: '/Unit Delay' */ if (rtb_Sum6_p != rtDW->UnitDelay_DSTATE_i) { rtb_Divide1_m = rtDW->Divide; } else { rtb_Divide1_m = 0; } /* End of Switch: '/Switch' */ /* Sum: '/Add2' */ rtb_Gain_b0 = ((rtb_r_cos_M1 << 2) + rtb_Divide1_m) >> 2; if (rtb_Gain_b0 > 32767) { rtb_Gain_b0 = 32767; } else { if (rtb_Gain_b0 < -32768) { rtb_Gain_b0 = -32768; } } /* Switch: '/Switch2' incorporates: * MinMax: '/Max' * MinMax: '/Max1' * RelationalOperator: '/LowerRelop1' * RelationalOperator: '/UpperRelop' * Sum: '/Add2' * Switch: '/Switch' */ if ((int16_T)rtb_Gain_b0 > rtDW->Max_p) { rtb_r_cos_M1 = rtDW->Max_p; } else if ((int16_T)rtb_Gain_b0 < rtDW->Max1_g) { /* Switch: '/Switch' incorporates: * MinMax: '/Max1' * Switch: '/Switch2' */ rtb_r_cos_M1 = rtDW->Max1_g; } else { rtb_r_cos_M1 = (int16_T)rtb_Gain_b0; } /* End of Switch: '/Switch2' */ /* Merge: '/Merge' incorporates: * Constant: '/Constant3' * SignalConversion generated from: '/open_voltage' */ rtDW->Merge[0] = 0; /* Switch: '/Switch' incorporates: * Switch: '/Switch' */ if (rtb_Switch > 0) { /* Merge: '/Merge' incorporates: * SignalConversion generated from: '/open_voltage' * Switch: '/Switch2' */ rtDW->Merge[1] = rtb_r_cos_M1; } else { /* Merge: '/Merge' incorporates: * Constant: '/Constant1' * SignalConversion generated from: '/open_voltage' */ rtDW->Merge[1] = 0; } /* End of Switch: '/Switch' */ /* Update for UnitDelay: '/UnitDelay' incorporates: * Switch: '/Switch3' */ rtDW->UnitDelay_DSTATE_e = rtb_Sum6_p; /* Switch: '/Switch2' */ if (rtb_LogicalOperator12) { /* Update for UnitDelay: '/UnitDelay' incorporates: * UnitDelay: '/UnitDelay1' */ rtDW->UnitDelay_DSTATE_fv = rtDW->UnitDelay1_DSTATE_f[1]; } else { /* Update for UnitDelay: '/UnitDelay' incorporates: * Sum: '/Add2' */ rtDW->UnitDelay_DSTATE_fv = (int16_T)rtb_Gain_b0; } /* End of Switch: '/Switch2' */ /* Update for UnitDelay: '/Unit Delay' incorporates: * Switch: '/Switch2' */ rtDW->UnitDelay_DSTATE_i = rtb_r_cos_M1; /* End of Outputs for SubSystem: '/open_mode' */ } else if (rtb_z_ctrlMod == 2) { /* Outputs for IfAction SubSystem: '/torque_mode' incorporates: * ActionPort: '/Action Port' */ rtDW->r_currTgt = rtU->idq_Target; /* Merge: '/Merge1' incorporates: * Inport: '/idq_Target' * Inport: '/r_currTgt' * Inport: '/r_spdTgt' * Switch: '/Switch' */ rtDW->Merge1 = rtb_Switch; /* End of Outputs for SubSystem: '/torque_mode' */ } else { /* Outputs for IfAction SubSystem: '/If Action Subsystem1' incorporates: * ActionPort: '/Action Port' */ /* Merge: '/Merge1' incorporates: * Inport: '/In1' * Switch: '/Switch' */ rtDW->Merge1 = rtb_Switch; /* End of Outputs for SubSystem: '/If Action Subsystem1' */ } /* End of If: '/If' */ /* Switch: '/Switch2' incorporates: * Inport: '/spd_Limit' * Merge: '/Merge1' * RelationalOperator: '/LowerRelop1' * RelationalOperator: '/UpperRelop' * Switch: '/Switch' */ if (rtDW->Merge1 > rtU->spd_Limit) { rtb_Switch = rtU->spd_Limit; } else if (rtDW->Merge1 < 0) { /* Switch: '/Switch' incorporates: * Constant: '/Constant' * Switch: '/Switch2' */ rtb_Switch = 0; } else { rtb_Switch = rtDW->Merge1; } /* End of Switch: '/Switch2' */ /* If: '/If' incorporates: * Constant: '/Constant' * Logic: '/Logical Operator' * Switch: '/Switch2' */ if ((rtb_z_ctrlMod != 0) && rtb_Equal_k) { /* Outputs for IfAction SubSystem: '/Do_Calc' incorporates: * ActionPort: '/Action Port' */ /* Outputs for Atomic SubSystem: '/Low_Pass_Filter' */ Low_Pass_Filter(rtb_UnitDelay1, rtP.f_lpf_vdq, rtb_Multiply, &rtDW->Low_Pass_Filter_h); /* End of Outputs for SubSystem: '/Low_Pass_Filter' */ /* DataTypeConversion: '/Data Type Conversion' incorporates: * Constant: '/Constant' * RelationalOperator: '/Equal' * UnitDelay: '/Unit Delay' */ rtb_DataTypeConversion_j = (uint8_T)(rtDW->UnitDelay_DSTATE_p2 != rtb_z_ctrlMod); /* If: '/If' incorporates: * Constant: '/Constant1' * Constant: '/Constant11' * Constant: '/Constant4' * Gain: '/Gain' * Sum: '/Sum1' * Switch: '/Switch2' * Switch: '/Switch2' * UnitDelay: '/Unit Delay1' */ if (rtb_z_ctrlMod == 1) { rtb_Sum2 = 0; /* Outputs for IfAction SubSystem: '/speed_mode' incorporates: * ActionPort: '/Action Port' */ /* MinMax: '/Min' incorporates: * Constant: '/Constant6' * UnitDelay: '/Unit Delay' */ if (4800 < rtDW->UnitDelay_DSTATE_l) { rtb_Sum6_p = 4800; } else { rtb_Sum6_p = rtDW->UnitDelay_DSTATE_l; } /* End of MinMax: '/Min' */ /* MinMax: '/Min1' incorporates: * Constant: '/Constant2' * Gain: '/Gain' * UnitDelay: '/Unit Delay' */ if ((int16_T)-rtDW->UnitDelay_DSTATE_l > -4800) { rtb_Divide1_m = (int16_T)-rtDW->UnitDelay_DSTATE_l; } else { rtb_Divide1_m = -4800; } /* End of MinMax: '/Min1' */ /* Outputs for Atomic SubSystem: '/PI_Speed' */ rtb_Sum1 = PI_backCalc_fixdt(rtb_Switch - rtb_Switch3, rtP.cf_nKp, rtP.cf_nKi, rtP.cf_nKb, rtb_Sum6_p, rtb_Divide1_m, (int16_T) ((rtP.cf_lastIqGain * rtDW->UnitDelay1_DSTATE_g) >> 15), rtb_DataTypeConversion_j, &rtDW->PI_Speed, &rtPrevZCX->PI_Speed); /* End of Outputs for SubSystem: '/PI_Speed' */ /* Merge: '/Merge' incorporates: * Constant: '/Constant1' * Constant: '/Constant11' * Constant: '/Constant4' * DataTypeConversion: '/Data Type Conversion' * Gain: '/Gain' * Sum: '/Sum1' * Switch: '/Switch2' * Switch: '/Switch2' * Switch: '/Switch2' * UnitDelay: '/Unit Delay1' */ rtDW->Merge_f = (int16_T)(rtb_Sum1 >> 9); /* End of Outputs for SubSystem: '/speed_mode' */ } else { rtb_Sum2 = 1; /* Outputs for IfAction SubSystem: '/torque_mode' incorporates: * ActionPort: '/Action Port' */ /* Sum: '/Sum1' incorporates: * Switch: '/Switch2' * Switch: '/Switch2' */ rtb_Sum1 = rtb_Switch - rtb_Switch3; /* Delay: '/Delay' incorporates: * Inport: '/r_currTgt' */ if (rtDW->icLoad != 0) { rtDW->Delay_DSTATE = rtDW->r_currTgt; } /* MinMax: '/Min' incorporates: * Delay: '/Delay' * Inport: '/r_currTgt' */ if (rtDW->r_currTgt < rtDW->Delay_DSTATE) { rtb_Sum6_p = rtDW->r_currTgt; } else { rtb_Sum6_p = rtDW->Delay_DSTATE; } /* End of MinMax: '/Min' */ /* Outputs for Atomic SubSystem: '/PI_TrqSpdLim' */ /* Delay: '/Resettable Delay' incorporates: * DataTypeConversion: '/Data Type Conversion2' * Inport: '/r_currTgt' */ if ((rtb_DataTypeConversion_j > 0) && (rtPrevZCX->ResettableDelay_Reset_ZCE_a != 1)) { rtDW->icLoad_k = 1U; } rtPrevZCX->ResettableDelay_Reset_ZCE_a = (ZCSigState) (rtb_DataTypeConversion_j > 0); if (rtDW->icLoad_k != 0) { rtDW->ResettableDelay_DSTATE = rtDW->r_currTgt << 7; } /* Product: '/Divide1' incorporates: * Constant: '/Constant1' * Sum: '/Sum1' */ tmp = (int64_T)rtb_Sum1 * rtP.cf_TrqLimKi; if (tmp > 2147483647LL) { tmp = 2147483647LL; } else { if (tmp < -2147483648LL) { tmp = -2147483648LL; } } /* Sum: '/Sum2' incorporates: * Product: '/Divide1' * UnitDelay: '/Unit Delay' */ if (((int32_T)tmp < 0) && (rtDW->UnitDelay_DSTATE < MIN_int32_T - (int32_T) tmp)) { rtb_Gain_b0 = MIN_int32_T; } else if (((int32_T)tmp > 0) && (rtDW->UnitDelay_DSTATE > MAX_int32_T - (int32_T)tmp)) { rtb_Gain_b0 = MAX_int32_T; } else { rtb_Gain_b0 = (int32_T)tmp + rtDW->UnitDelay_DSTATE; } /* End of Sum: '/Sum2' */ /* Sum: '/Sum1' incorporates: * Delay: '/Resettable Delay' */ tmp = (((int64_T)rtDW->ResettableDelay_DSTATE << 2) + rtb_Gain_b0) >> 2; if (tmp > 2147483647LL) { tmp = 2147483647LL; } else { if (tmp < -2147483648LL) { tmp = -2147483648LL; } } rtb_Switch = (int32_T)tmp; /* End of Sum: '/Sum1' */ /* Product: '/Divide4' incorporates: * Constant: '/Constant4' * Sum: '/Sum1' */ tmp = (int64_T)rtb_Sum1 * rtP.cf_TrqLimKp; if (tmp > 2147483647LL) { tmp = 2147483647LL; } else { if (tmp < -2147483648LL) { tmp = -2147483648LL; } } /* Sum: '/Sum6' incorporates: * DataTypeConversion: '/Data Type Conversion1' * Product: '/Divide4' * Sum: '/Sum1' */ tmp = (int64_T)(rtb_Switch << 2) + (int32_T)tmp; if (tmp > 2147483647LL) { tmp = 2147483647LL; } else { if (tmp < -2147483648LL) { tmp = -2147483648LL; } } rtb_Sum1 = (int32_T)tmp; /* End of Sum: '/Sum6' */ /* RelationalOperator: '/LowerRelop1' incorporates: * MinMax: '/Min' * Switch: '/Switch2' */ rtb_Gain_b0 = rtb_Sum6_p << 9; /* Switch: '/Switch2' incorporates: * RelationalOperator: '/LowerRelop1' * Sum: '/Sum6' */ if (rtb_Sum1 <= rtb_Gain_b0) { /* Gain: '/Gain' incorporates: * MinMax: '/Min' */ rtb_Gain_b0 = -32768 * rtb_Sum6_p; /* Switch: '/Switch' incorporates: * Gain: '/Gain' * RelationalOperator: '/UpperRelop' * Switch: '/Switch2' */ if (((int64_T)rtb_Sum1 << 6) < rtb_Gain_b0) { rtb_Gain_b0 >>= 6; } else { rtb_Gain_b0 = rtb_Sum1; } /* End of Switch: '/Switch' */ } /* Update for UnitDelay: '/Unit Delay' incorporates: * Constant: '/Constant2' * Product: '/Divide2' * Sum: '/Sum3' * Sum: '/Sum6' * Switch: '/Switch2' */ rtDW->UnitDelay_DSTATE = (int32_T)(((int64_T)(rtb_Gain_b0 - rtb_Sum1) * rtP.cf_TrqLimKb) >> 10); /* Update for Delay: '/Resettable Delay' incorporates: * Sum: '/Sum1' */ rtDW->icLoad_k = 0U; rtDW->ResettableDelay_DSTATE = rtb_Switch; /* End of Outputs for SubSystem: '/PI_TrqSpdLim' */ /* Merge: '/Merge' incorporates: * DataTypeConversion: '/Data Type Conversion' * ManualSwitch: '/Manual Switch' * Switch: '/Switch2' */ rtDW->Merge_f = (int16_T)(rtb_Gain_b0 >> 9); /* End of Outputs for SubSystem: '/torque_mode' */ } /* Outputs for IfAction SubSystem: '/MTPA_Calc' incorporates: * ActionPort: '/Action Port' */ /* If: '/If' incorporates: * Constant: '/Constant3' * Merge: '/Merge' * Switch: '/Switch' */ rtDW->Merge_c[0] = 0; rtDW->Merge_c[1] = rtDW->Merge_f; /* End of Outputs for SubSystem: '/MTPA_Calc' */ /* Sum: '/Add' incorporates: * Inport: '/iDC_Limit' * Inport: '/vDC' * Math: '/Math Function3' * Merge: '/Merge' * Product: '/Divide' * Product: '/Divide' * Switch: '/Switch' */ rtb_Switch = rtU->iDC_Limit * rtU->vDC - rtDW->Merge_c[0] * rtb_Multiply[0]; /* Product: '/Divide3' incorporates: * Constant: '/Constant5' * Math: '/Math Function3' */ rtb_Gain_b0 = rtb_Switch / 9600; if (rtb_Gain_b0 > 32767) { rtb_Gain_b0 = 32767; } else { if (rtb_Gain_b0 < -32768) { rtb_Gain_b0 = -32768; } } /* Product: '/Divide1' incorporates: * Math: '/Math Function3' */ tmp_2 = rtb_Switch; /* MinMax: '/Min2' incorporates: * Product: '/Divide3' */ if (rtb_Multiply[1] > (int16_T)rtb_Gain_b0) { rtb_Divide1_m = rtb_Multiply[1]; } else { rtb_Divide1_m = (int16_T)rtb_Gain_b0; } /* End of MinMax: '/Min2' */ /* Product: '/Divide1' */ rtb_Gain_b0 = tmp_2 / rtb_Divide1_m; if (rtb_Gain_b0 > 32767) { rtb_Gain_b0 = 32767; } else { if (rtb_Gain_b0 < -32768) { rtb_Gain_b0 = -32768; } } /* Signum: '/Sign' incorporates: * Merge: '/Merge' * Switch: '/Switch' */ if (rtDW->Merge_c[1] < 0) { rtb_Divide1_m = -1; } else { rtb_Divide1_m = (int16_T)(rtDW->Merge_c[1] > 0); } /* End of Signum: '/Sign' */ /* Product: '/Divide2' incorporates: * Product: '/Divide1' */ rtb_Sum6_p = (int16_T)((int16_T)rtb_Gain_b0 * rtb_Divide1_m); /* Switch: '/Switch2' incorporates: * Constant: '/Constant3' * Product: '/Divide2' * RelationalOperator: '/LowerRelop1' * RelationalOperator: '/UpperRelop' * Switch: '/Switch' */ if (rtb_Sum6_p > 4800) { rtb_Sum6_p = 4800; } else { if (rtb_Sum6_p < -4800) { /* Switch: '/Switch' incorporates: * Gain: '/Gain1' * Switch: '/Switch2' */ rtb_Sum6_p = -4800; } } /* End of Switch: '/Switch2' */ /* Switch: '/Switch' incorporates: * Merge: '/Merge' * MinMax: '/Min1' * Switch: '/Switch' * Switch: '/Switch2' */ if (rtb_Divide1_m > 0) { /* MinMax: '/Min' incorporates: * Merge: '/Merge' * Switch: '/Switch' * Switch: '/Switch2' */ if (rtb_Sum6_p < rtDW->Merge_c[1]) { /* Switch: '/Switch' */ rtDW->Switch = rtb_Sum6_p; } else { /* Switch: '/Switch' */ rtDW->Switch = rtDW->Merge_c[1]; } /* End of MinMax: '/Min' */ } else if (rtb_Sum6_p > rtDW->Merge_c[1]) { /* MinMax: '/Min1' incorporates: * Switch: '/Switch' * Switch: '/Switch2' */ rtDW->Switch = rtb_Sum6_p; } else { /* Switch: '/Switch' incorporates: * Merge: '/Merge' * Switch: '/Switch' */ rtDW->Switch = rtDW->Merge_c[1]; } /* End of Switch: '/Switch' */ /* Switch: '/Switch2' incorporates: * Merge: '/Merge' * RelationalOperator: '/LowerRelop1' * RelationalOperator: '/UpperRelop' * Switch: '/Switch' * Switch: '/Switch' */ if (rtDW->Merge_c[0] > 4800) { /* Switch: '/Switch2' incorporates: * Constant: '/Constant1' */ rtDW->Switch2 = 4800; } else if (rtDW->Merge_c[0] < -4800) { /* Switch: '/Switch' incorporates: * Gain: '/Gain1' * Switch: '/Switch2' */ rtDW->Switch2 = -4800; } else { /* Switch: '/Switch2' */ rtDW->Switch2 = rtDW->Merge_c[0]; } /* End of Switch: '/Switch2' */ /* Update for UnitDelay: '/Unit Delay' */ rtDW->UnitDelay_DSTATE_p2 = rtb_z_ctrlMod; /* Update for UnitDelay: '/Unit Delay1' incorporates: * Merge: '/Merge' */ rtDW->UnitDelay1_DSTATE_g = rtDW->Merge_f; /* If: '/If' */ switch (rtb_Sum2) { case 0: /* Update for IfAction SubSystem: '/speed_mode' incorporates: * ActionPort: '/Action Port' */ /* Update for UnitDelay: '/Unit Delay' incorporates: * Math: '/Math Function2' * Math: '/Math Function3' * Merge: '/Merge' * Product: '/Divide1' * Sqrt: '/Sqrt1' * Sum: '/Add' * Switch: '/Switch' */ rtDW->UnitDelay_DSTATE_l = rt_sqrt_Us32En10_Ys16E_7VJYwqF9(rtDW->Merge_c[0] * rtDW->Merge_c[0] + (int16_T)rtb_Gain_b0 * (int16_T)rtb_Gain_b0); /* End of Update for SubSystem: '/speed_mode' */ break; case 1: /* Update for IfAction SubSystem: '/torque_mode' incorporates: * ActionPort: '/Action Port' */ /* Update for Delay: '/Delay' incorporates: * Math: '/Math Function2' * Math: '/Math Function3' * Merge: '/Merge' * Product: '/Divide1' * Sqrt: '/Sqrt1' * Sum: '/Add' * Switch: '/Switch' */ rtDW->icLoad = 0U; rtDW->Delay_DSTATE = rt_sqrt_Us32En10_Ys16E_7VJYwqF9(rtDW->Merge_c[0] * rtDW->Merge_c[0] + (int16_T)rtb_Gain_b0 * (int16_T)rtb_Gain_b0); /* End of Update for SubSystem: '/torque_mode' */ break; } /* End of Outputs for SubSystem: '/Do_Calc' */ } /* End of If: '/If' */ /* RelationalOperator: '/Relational Operator' incorporates: * Switch: '/Switch2' * UnitDelay: '/UnitDelay' */ rtb_Equal_k = (rtDW->Switch2 != rtDW->UnitDelay_DSTATE_h); /* Sum: '/Add' incorporates: * Product: '/Divide1' * Switch: '/Switch2' * UnitDelay: '/Unit Delay1' */ rtb_r_cos_M1 = (int16_T)(rtDW->Switch2 - rtDW->UnitDelay1_DSTATE_i); /* Abs: '/Abs' incorporates: * Product: '/Divide1' */ if (rtb_r_cos_M1 < 0) { rtb_r_cos_M1 = (int16_T)-rtb_r_cos_M1; } /* End of Abs: '/Abs' */ /* Outputs for Enabled SubSystem: '/Enabled Subsystem' incorporates: * EnablePort: '/Enable' */ /* If: '/If' incorporates: * Gain: '/Gain' * Product: '/Divide1' * UnitDelay: '/Unit Delay1' */ if (rtb_Equal_k) { /* Outputs for IfAction SubSystem: '/RateInit' incorporates: * ActionPort: '/Action Port' */ RateInit(rtDW->UnitDelay1_DSTATE_i, rtDW->Switch2, (int16_T)((13107 * rtb_r_cos_M1) >> 13), &rtDW->Divide_n, &rtDW->Max_g, &rtDW->Max1_j); /* End of Outputs for SubSystem: '/RateInit' */ /* Switch: '/Switch1' incorporates: * Gain: '/Gain' * Product: '/Divide1' * UnitDelay: '/Unit Delay1' */ rtb_Divide1_m = rtDW->UnitDelay1_DSTATE_i; } else { /* Switch: '/Switch1' incorporates: * UnitDelay: '/UnitDelay' */ rtb_Divide1_m = rtDW->UnitDelay_DSTATE_b; } /* End of If: '/If' */ /* End of Outputs for SubSystem: '/Enabled Subsystem' */ /* Switch: '/Switch' incorporates: * Constant: '/Constant' * Product: '/Divide' * RelationalOperator: '/Equal' * Switch: '/Switch2' * UnitDelay: '/Unit Delay' */ if (rtDW->Switch2 != rtDW->UnitDelay_DSTATE_g) { rtb_Sum6_p = rtDW->Divide_n; } else { rtb_Sum6_p = 0; } /* End of Switch: '/Switch' */ /* Sum: '/Add2' */ rtb_Gain_b0 = ((rtb_Divide1_m << 5) + rtb_Sum6_p) >> 5; if (rtb_Gain_b0 > 32767) { rtb_Gain_b0 = 32767; } else { if (rtb_Gain_b0 < -32768) { rtb_Gain_b0 = -32768; } } /* Switch: '/Switch2' incorporates: * MinMax: '/Max' * MinMax: '/Max1' * RelationalOperator: '/LowerRelop1' * RelationalOperator: '/UpperRelop' * Sum: '/Add2' * Switch: '/Switch' */ if ((int16_T)rtb_Gain_b0 > rtDW->Max_g) { rtb_Divide1_m = rtDW->Max_g; } else if ((int16_T)rtb_Gain_b0 < rtDW->Max1_j) { /* Switch: '/Switch' incorporates: * MinMax: '/Max1' * Switch: '/Switch2' */ rtb_Divide1_m = rtDW->Max1_j; } else { rtb_Divide1_m = (int16_T)rtb_Gain_b0; } /* End of Switch: '/Switch2' */ /* RelationalOperator: '/Relational Operator' incorporates: * Switch: '/Switch' * UnitDelay: '/UnitDelay' */ rtb_LogicalOperator12 = (rtDW->Switch != rtDW->UnitDelay_DSTATE_o); /* Sum: '/Add' incorporates: * Product: '/Divide1' * Switch: '/Switch' * UnitDelay: '/Unit Delay1' */ rtb_r_cos_M1 = (int16_T)(rtDW->Switch - rtDW->UnitDelay1_DSTATE_b); /* Abs: '/Abs' incorporates: * Product: '/Divide1' */ if (rtb_r_cos_M1 < 0) { rtb_r_cos_M1 = (int16_T)-rtb_r_cos_M1; } /* End of Abs: '/Abs' */ /* Outputs for Enabled SubSystem: '/Enabled Subsystem' incorporates: * EnablePort: '/Enable' */ /* If: '/If' incorporates: * Gain: '/Gain' * Product: '/Divide1' * UnitDelay: '/Unit Delay1' */ if (rtb_LogicalOperator12) { /* Outputs for IfAction SubSystem: '/RateInit' incorporates: * ActionPort: '/Action Port' */ RateInit(rtDW->UnitDelay1_DSTATE_b, rtDW->Switch, (int16_T)((13107 * rtb_r_cos_M1) >> 13), &rtDW->Divide_l, &rtDW->Max, &rtDW->Max1); /* End of Outputs for SubSystem: '/RateInit' */ /* Switch: '/Switch1' incorporates: * Gain: '/Gain' * Product: '/Divide1' * UnitDelay: '/Unit Delay1' */ rtb_r_cos_M1 = rtDW->UnitDelay1_DSTATE_b; } else { /* Switch: '/Switch1' incorporates: * UnitDelay: '/UnitDelay' */ rtb_r_cos_M1 = rtDW->UnitDelay_DSTATE_d; } /* End of If: '/If' */ /* End of Outputs for SubSystem: '/Enabled Subsystem' */ /* Switch: '/Switch' incorporates: * Constant: '/Constant' * Product: '/Divide' * RelationalOperator: '/Equal' * Switch: '/Switch' * UnitDelay: '/Unit Delay' */ if (rtDW->Switch != rtDW->UnitDelay_DSTATE_a) { rtb_Sum6_p = rtDW->Divide_l; } else { rtb_Sum6_p = 0; } /* End of Switch: '/Switch' */ /* Sum: '/Add2' */ tmp_2 = ((rtb_r_cos_M1 << 5) + rtb_Sum6_p) >> 5; if (tmp_2 > 32767) { tmp_2 = 32767; } else { if (tmp_2 < -32768) { tmp_2 = -32768; } } /* Switch: '/Switch2' incorporates: * MinMax: '/Max' * MinMax: '/Max1' * RelationalOperator: '/LowerRelop1' * RelationalOperator: '/UpperRelop' * Sum: '/Add2' * Switch: '/Switch' */ if ((int16_T)tmp_2 > rtDW->Max) { rtb_Sum6_p = rtDW->Max; } else if ((int16_T)tmp_2 < rtDW->Max1) { /* Switch: '/Switch' incorporates: * MinMax: '/Max1' * Switch: '/Switch2' */ rtb_Sum6_p = rtDW->Max1; } else { rtb_Sum6_p = (int16_T)tmp_2; } /* End of Switch: '/Switch2' */ /* DataTypeConversion: '/Data Type Conversion' incorporates: * Logic: '/Logical Operator' * RelationalOperator: '/Equal' * UnitDelay: '/Unit Delay' */ rtb_DataTypeConversion_j = (uint8_T)((rtb_z_ctrlMod != 0) && (rtDW->UnitDelay_DSTATE_bm != rtb_z_ctrlMod)); /* If: '/If1' incorporates: * Constant: '/Constant1' * Constant: '/Constant3' * Constant: '/Constant4' * Constant: '/Constant6' * Constant: '/Constant7' * Constant: '/Constant8' * Gain: '/Gain1' * Gain: '/Gain2' * Inport: '/In1' * Merge: '/Merge' * Merge: '/Merge' * Outport: '/f_Idq' * Product: '/Divide' * Sum: '/Sum' * Sum: '/Sum1' * Switch: '/Switch2' * Switch: '/Switch2' * UnitDelay: '/UnitDelay1' */ if (rtb_z_ctrlMod != 0) { /* Outputs for IfAction SubSystem: '/CurrentLoop' incorporates: * ActionPort: '/Action Port' */ /* Product: '/Divide' incorporates: * Inport: '/vDC' */ rtb_r_cos_M1 = (int16_T)((rtU->vDC * 15) >> 4); /* Outputs for Atomic SubSystem: '/PI_backCalc_fixdt' */ rtb_Switch = PI_backCalc_fixdt_o((int16_T)(rtb_Divide1_m - rtY->f_Idq[0]), rtP.cf_idKp, rtP.cf_idKi, rtP.cf_idKb, rtb_r_cos_M1, (int16_T) -rtb_r_cos_M1, rtDW->UnitDelay1_DSTATE_f[0], rtb_DataTypeConversion_j, &rtDW->PI_backCalc_fixdt_o3, &rtPrevZCX->PI_backCalc_fixdt_o3); /* End of Outputs for SubSystem: '/PI_backCalc_fixdt' */ /* Outputs for Atomic SubSystem: '/PI_backCalc_fixdt1' */ rtb_Sum1 = PI_backCalc_fixdt_o((int16_T)(rtb_Sum6_p - rtY->f_Idq[1]), rtP.cf_iqKp, rtP.cf_iqKi, rtP.cf_iqKb, rtb_r_cos_M1, (int16_T) -rtb_r_cos_M1, rtDW->UnitDelay1_DSTATE_f[1], rtb_DataTypeConversion_j, &rtDW->PI_backCalc_fixdt1, &rtPrevZCX->PI_backCalc_fixdt1); /* End of Outputs for SubSystem: '/PI_backCalc_fixdt1' */ /* Sum: '/Sum2' incorporates: * Constant: '/Constant1' * Constant: '/Constant3' * Constant: '/Constant4' * Constant: '/Constant6' * Constant: '/Constant7' * Constant: '/Constant8' * DataTypeConversion: '/Data Type Conversion' * DataTypeConversion: '/Data Type Conversion1' * Gain: '/Gain1' * Gain: '/Gain2' * Merge: '/Merge' * Outport: '/f_Idq' * Product: '/Divide' * Sum: '/Sum' * Sum: '/Sum1' * Switch: '/Switch2' * Switch: '/Switch2' * Switch: '/Switch2' * Switch: '/Switch2' * UnitDelay: '/UnitDelay1' */ rtb_Multiply[0] = (int16_T)(rtb_Switch >> 9); rtb_Multiply[1] = (int16_T)(rtb_Sum1 >> 9); /* End of Outputs for SubSystem: '/CurrentLoop' */ } else { /* Outputs for IfAction SubSystem: '/OpenLoop' incorporates: * ActionPort: '/Action Port' */ rtb_Multiply[0] = rtDW->Merge[0]; rtb_Multiply[1] = rtDW->Merge[1]; /* End of Outputs for SubSystem: '/OpenLoop' */ } /* End of If: '/If1' */ /* Gain: '/Gain' incorporates: * Inport: '/vDC' * Product: '/Divide1' */ rtb_r_cos_M1 = (int16_T)((15565 * rtU->vDC) >> 13); /* Math: '/Math Function1' incorporates: * Product: '/Divide1' */ rtb_Switch = (rtb_r_cos_M1 * rtb_r_cos_M1) >> 6; /* Sum: '/Sum of Elements' incorporates: * Math: '/Math Function' * Merge: '/Merge' */ tmp = (int64_T)((rtb_Multiply[0] * rtb_Multiply[0]) >> 4) + ((rtb_Multiply[1] * rtb_Multiply[1]) >> 4); if (tmp > 2147483647LL) { tmp = 2147483647LL; } else { if (tmp < -2147483648LL) { tmp = -2147483648LL; } } /* Product: '/Divide' incorporates: * Math: '/Math Function1' * Sum: '/Sum of Elements' */ tmp = ((int64_T)(int32_T)tmp << 14) / rtb_Switch; if (tmp < 0LL) { tmp = 0LL; } else { if (tmp > 65535LL) { tmp = 65535LL; } } /* Sqrt: '/Sqrt' incorporates: * Product: '/Divide' */ rtb_BitwiseOperator2 = rt_sqrt_Uu16En14_Yu16E_WMwW1mku((uint16_T)tmp); /* Switch: '/Switch' incorporates: * Merge: '/Merge' * Sqrt: '/Sqrt' */ if (rtb_BitwiseOperator2 > 16384) { /* Switch: '/Switch' incorporates: * Merge: '/Merge' * MultiPortSwitch: '/Multiport Switch' * Product: '/Divide1' */ rtb_Switch_f_idx_0 = (int16_T)((rtb_Multiply[0] << 14) / rtb_BitwiseOperator2); rtb_Switch_f_idx_1 = (int16_T)((rtb_Multiply[1] << 14) / rtb_BitwiseOperator2); } else { rtb_Switch_f_idx_0 = rtb_Multiply[0]; rtb_Switch_f_idx_1 = rtb_Multiply[1]; } /* End of Switch: '/Switch' */ /* Sum: '/Sum1' incorporates: * Interpolation_n-D: '/r_cos_M1' * Interpolation_n-D: '/r_sin_M1' * Product: '/Divide2' * Product: '/Divide3' */ tmp_0 = (int16_T)((rtb_Switch_f_idx_0 * rtConstP.pooled7[rtb_LogicalOperator3]) >> 14) + (int16_T)((rtb_Switch_f_idx_1 * rtConstP.pooled8[rtb_LogicalOperator3]) >> 14); if (tmp_0 > 32767) { tmp_0 = 32767; } else { if (tmp_0 < -32768) { tmp_0 = -32768; } } /* Sum: '/Sum6' incorporates: * Interpolation_n-D: '/r_cos_M1' * Interpolation_n-D: '/r_sin_M1' * Product: '/Divide1' * Product: '/Divide4' */ tmp_1 = (int16_T)((rtb_Switch_f_idx_0 * rtConstP.pooled8[rtb_LogicalOperator3]) >> 14) - (int16_T)((rtb_Switch_f_idx_1 * rtConstP.pooled7[rtb_LogicalOperator3]) >> 14); if (tmp_1 > 32767) { tmp_1 = 32767; } else { if (tmp_1 < -32768) { tmp_1 = -32768; } } /* Product: '/Divide7' incorporates: * Constant: '/Constant3' * Sum: '/Sum1' */ rtb_r_cos_M1 = (int16_T)((2365 * (int16_T)tmp_0) >> 11); /* MATLAB Function: '/sector_select' incorporates: * Product: '/Divide7' * Sum: '/Sum1' * Sum: '/Sum6' */ if ((int16_T)tmp_0 >= 0) { if ((int16_T)tmp_1 >= 0) { if (rtb_r_cos_M1 > ((int16_T)tmp_1 << 1)) { /* DataTypeConversion: '/Data Type Conversion' */ rtb_DataTypeConversion_j = 2U; } else { /* DataTypeConversion: '/Data Type Conversion' */ rtb_DataTypeConversion_j = 1U; } } else { rtb_Gain_p2 = -rtb_r_cos_M1; if (-rtb_r_cos_M1 > 32767) { rtb_Gain_p2 = 32767; } if (rtb_Gain_p2 > ((int16_T)tmp_1 << 1)) { /* DataTypeConversion: '/Data Type Conversion' */ rtb_DataTypeConversion_j = 3U; } else { /* DataTypeConversion: '/Data Type Conversion' */ rtb_DataTypeConversion_j = 2U; } } } else if ((int16_T)tmp_1 >= 0) { rtb_Gain_p2 = -rtb_r_cos_M1; if (-rtb_r_cos_M1 > 32767) { rtb_Gain_p2 = 32767; } if (rtb_Gain_p2 > ((int16_T)tmp_1 << 1)) { /* DataTypeConversion: '/Data Type Conversion' */ rtb_DataTypeConversion_j = 5U; } else { /* DataTypeConversion: '/Data Type Conversion' */ rtb_DataTypeConversion_j = 6U; } } else if (rtb_r_cos_M1 > ((int16_T)tmp_1 << 1)) { /* DataTypeConversion: '/Data Type Conversion' */ rtb_DataTypeConversion_j = 4U; } else { /* DataTypeConversion: '/Data Type Conversion' */ rtb_DataTypeConversion_j = 5U; } /* End of MATLAB Function: '/sector_select' */ /* Gain: '/Gain' incorporates: * Inport: '/vDC' */ rtb_Gain_p2 = 18919 * rtU->vDC; /* Product: '/Divide' incorporates: * Gain: '/Gain' * Sum: '/Sum6' */ rtb_Sum6_k = (int16_T)(((int64_T)(int16_T)tmp_1 << 26) / rtb_Gain_p2); /* Product: '/Divide1' incorporates: * Gain: '/Gain' * Sum: '/Sum1' */ rtb_Sum1_a = (int16_T)(((int64_T)(int16_T)tmp_0 << 26) / rtb_Gain_p2); /* MultiPortSwitch: '/Multiport Switch' incorporates: * DataTypeConversion: '/Data Type Conversion1' */ switch (rtb_DataTypeConversion_j) { case 1: /* Product: '/Divide3' incorporates: * Constant: '/Constant1' * DataTypeConversion: '/Data Type Conversion2' * Product: '/Divide1' * Product: '/Divide2' */ rtb_Divide3_k = (int16_T)(((int16_T)((rtb_Sum1_a * 9459) >> 13) * (int16_T) rtP.i_pwm_count) >> 12); /* Product: '/Divide1' incorporates: * Constant: '/Constant1' * Constant: '/Constant' * DataTypeConversion: '/Data Type Conversion2' * Product: '/Divide' * Product: '/Divide1' * Product: '/Divide' * Sum: '/Add' */ rtb_Sum1_a = (int16_T)(((int16_T)(rtb_Sum6_k - ((rtb_Sum1_a * 9459) >> 14)) * (int16_T)rtP.i_pwm_count) >> 12); /* Product: '/Divide4' incorporates: * Constant: '/Constant1' * DataTypeConversion: '/Data Type Conversion2' * Sum: '/Add1' * Sum: '/Add2' */ rtb_r_cos_M1 = (int16_T)((int16_T)((int16_T)((int16_T)rtP.i_pwm_count - rtb_Sum1_a) - rtb_Divide3_k) >> 1); /* Sum: '/Add3' */ rtb_Sum6_k = (int16_T)(rtb_r_cos_M1 + rtb_Divide3_k); /* Outport: '/pwm_Duty' incorporates: * Sum: '/Add4' */ rtY->pwm_Duty[0] = (int16_T)(rtb_Sum6_k + rtb_Sum1_a); rtY->pwm_Duty[1] = rtb_Sum6_k; rtY->pwm_Duty[2] = rtb_r_cos_M1; break; case 2: /* Product: '/Divide1' incorporates: * Constant: '/Constant1' * Constant: '/Constant' * DataTypeConversion: '/Data Type Conversion2' * Product: '/Divide' * Product: '/Divide1' * Product: '/Divide' * Sum: '/Add' */ rtb_Divide3_k = (int16_T)(((int16_T)(((rtb_Sum1_a * 9459) >> 14) + rtb_Sum6_k) * (int16_T)rtP.i_pwm_count) >> 12); /* Product: '/Divide3' incorporates: * Constant: '/Constant1' * Constant: '/Constant' * DataTypeConversion: '/Data Type Conversion2' * Product: '/Divide' * Product: '/Divide1' * Product: '/Divide2' * Sum: '/Add5' */ rtb_Sum1_a = (int16_T)(((int16_T)(((rtb_Sum1_a * 9459) >> 14) - rtb_Sum6_k) * (int16_T)rtP.i_pwm_count) >> 12); /* Product: '/Divide4' incorporates: * Constant: '/Constant1' * DataTypeConversion: '/Data Type Conversion2' * Sum: '/Add1' * Sum: '/Add2' */ rtb_r_cos_M1 = (int16_T)((int16_T)((int16_T)((int16_T)rtP.i_pwm_count - rtb_Sum1_a) - rtb_Divide3_k) >> 1); /* Sum: '/Add3' */ rtb_Sum6_k = (int16_T)(rtb_r_cos_M1 + rtb_Divide3_k); /* Outport: '/pwm_Duty' incorporates: * Sum: '/Add4' */ rtY->pwm_Duty[0] = rtb_Sum6_k; rtY->pwm_Duty[1] = (int16_T)(rtb_Sum6_k + rtb_Sum1_a); rtY->pwm_Duty[2] = rtb_r_cos_M1; break; case 3: /* Product: '/Divide1' incorporates: * Constant: '/Constant1' * Constant: '/Constant' * DataTypeConversion: '/Data Type Conversion2' * Product: '/Divide' * Product: '/Divide1' * Product: '/Divide' * Sum: '/Add' */ rtb_Sum6_k = (int16_T)(((int16_T)(-rtb_Sum6_k - ((rtb_Sum1_a * 9459) >> 14)) * (int16_T)rtP.i_pwm_count) >> 12); /* Product: '/Divide3' incorporates: * Constant: '/Constant1' * DataTypeConversion: '/Data Type Conversion2' * Product: '/Divide1' * Product: '/Divide2' */ rtb_Sum1_a = (int16_T)(((int16_T)((rtb_Sum1_a * 9459) >> 13) * (int16_T) rtP.i_pwm_count) >> 12); /* Product: '/Divide4' incorporates: * Constant: '/Constant1' * DataTypeConversion: '/Data Type Conversion2' * Sum: '/Add1' * Sum: '/Add2' */ rtb_r_cos_M1 = (int16_T)((int16_T)((int16_T)((int16_T)rtP.i_pwm_count - rtb_Sum1_a) - rtb_Sum6_k) >> 1); /* Sum: '/Add3' */ rtb_Sum6_k += rtb_r_cos_M1; /* Outport: '/pwm_Duty' incorporates: * Sum: '/Add4' */ rtY->pwm_Duty[0] = rtb_r_cos_M1; rtY->pwm_Duty[1] = (int16_T)(rtb_Sum6_k + rtb_Sum1_a); rtY->pwm_Duty[2] = rtb_Sum6_k; break; case 4: /* Product: '/Divide1' incorporates: * Constant: '/Constant1' * Constant: '/Constant' * DataTypeConversion: '/Data Type Conversion2' * Product: '/Divide' * Product: '/Divide1' * Product: '/Divide' * Sum: '/Add' */ rtb_Sum6_k = (int16_T)(((int16_T)(((rtb_Sum1_a * 9459) >> 14) - rtb_Sum6_k) * (int16_T)rtP.i_pwm_count) >> 12); /* Product: '/Divide3' incorporates: * Constant: '/Constant1' * DataTypeConversion: '/Data Type Conversion2' * Product: '/Divide1' * Product: '/Divide2' * Sum: '/Add5' */ rtb_Sum1_a = (int16_T)(((int16_T)(-((int16_T)((rtb_Sum1_a * 9459) >> 13) << 2) >> 2) * (int16_T)rtP.i_pwm_count) >> 12); /* Product: '/Divide4' incorporates: * Constant: '/Constant1' * DataTypeConversion: '/Data Type Conversion2' * Sum: '/Add1' * Sum: '/Add2' */ rtb_r_cos_M1 = (int16_T)((int16_T)((int16_T)((int16_T)rtP.i_pwm_count - rtb_Sum1_a) - rtb_Sum6_k) >> 1); /* Sum: '/Add3' */ rtb_Sum6_k += rtb_r_cos_M1; /* Outport: '/pwm_Duty' incorporates: * Sum: '/Add4' */ rtY->pwm_Duty[0] = rtb_r_cos_M1; rtY->pwm_Duty[1] = rtb_Sum6_k; rtY->pwm_Duty[2] = (int16_T)(rtb_Sum6_k + rtb_Sum1_a); break; case 5: /* Product: '/Divide3' incorporates: * Constant: '/Constant1' * Constant: '/Constant' * DataTypeConversion: '/Data Type Conversion2' * Product: '/Divide' * Product: '/Divide1' * Product: '/Divide2' * Sum: '/Add5' */ rtb_Divide3_k = (int16_T)(((int16_T)(rtb_Sum6_k - ((rtb_Sum1_a * 9459) >> 14)) * (int16_T)rtP.i_pwm_count) >> 12); /* Product: '/Divide1' incorporates: * Constant: '/Constant1' * Constant: '/Constant' * DataTypeConversion: '/Data Type Conversion2' * Product: '/Divide' * Product: '/Divide1' * Product: '/Divide' * Sum: '/Add' */ rtb_Sum1_a = (int16_T)(((int16_T)(-rtb_Sum6_k - ((rtb_Sum1_a * 9459) >> 14)) * (int16_T)rtP.i_pwm_count) >> 12); /* Product: '/Divide4' incorporates: * Constant: '/Constant1' * DataTypeConversion: '/Data Type Conversion2' * Sum: '/Add1' * Sum: '/Add2' */ rtb_r_cos_M1 = (int16_T)((int16_T)((int16_T)((int16_T)rtP.i_pwm_count - rtb_Sum1_a) - rtb_Divide3_k) >> 1); /* Sum: '/Add3' */ rtb_Sum6_k = (int16_T)(rtb_r_cos_M1 + rtb_Divide3_k); /* Outport: '/pwm_Duty' incorporates: * Sum: '/Add4' */ rtY->pwm_Duty[0] = rtb_Sum6_k; rtY->pwm_Duty[1] = rtb_r_cos_M1; rtY->pwm_Duty[2] = (int16_T)(rtb_Sum6_k + rtb_Sum1_a); break; default: /* Product: '/Divide3' incorporates: * Constant: '/Constant1' * DataTypeConversion: '/Data Type Conversion2' * Product: '/Divide1' * Product: '/Divide2' * Sum: '/Add5' */ rtb_Divide3_k = (int16_T)(((int16_T)(-((int16_T)((rtb_Sum1_a * 9459) >> 13) << 2) >> 2) * (int16_T)rtP.i_pwm_count) >> 12); /* Product: '/Divide1' incorporates: * Constant: '/Constant1' * Constant: '/Constant' * DataTypeConversion: '/Data Type Conversion2' * Product: '/Divide' * Product: '/Divide1' * Product: '/Divide' * Sum: '/Add' */ rtb_Sum1_a = (int16_T)(((int16_T)(((rtb_Sum1_a * 9459) >> 14) + rtb_Sum6_k) * (int16_T)rtP.i_pwm_count) >> 12); /* Product: '/Divide4' incorporates: * Constant: '/Constant1' * DataTypeConversion: '/Data Type Conversion2' * Sum: '/Add1' * Sum: '/Add2' */ rtb_r_cos_M1 = (int16_T)((int16_T)((int16_T)((int16_T)rtP.i_pwm_count - rtb_Sum1_a) - rtb_Divide3_k) >> 1); /* Sum: '/Add3' */ rtb_Sum6_k = (int16_T)(rtb_r_cos_M1 + rtb_Divide3_k); /* Outport: '/pwm_Duty' incorporates: * Sum: '/Add4' */ rtY->pwm_Duty[0] = (int16_T)(rtb_Sum6_k + rtb_Sum1_a); rtY->pwm_Duty[1] = rtb_r_cos_M1; rtY->pwm_Duty[2] = rtb_Sum6_k; break; } /* End of MultiPortSwitch: '/Multiport Switch' */ /* Switch: '/Switch2' */ if (rtb_LogicalOperator12) { /* Update for UnitDelay: '/UnitDelay' incorporates: * UnitDelay: '/Unit Delay1' */ rtDW->UnitDelay_DSTATE_d = rtDW->UnitDelay1_DSTATE_b; } else { /* Update for UnitDelay: '/UnitDelay' incorporates: * Sum: '/Add2' */ rtDW->UnitDelay_DSTATE_d = (int16_T)tmp_2; } /* End of Switch: '/Switch2' */ /* Switch: '/Switch2' */ if (rtb_Equal_k) { /* Update for UnitDelay: '/UnitDelay' incorporates: * UnitDelay: '/Unit Delay1' */ rtDW->UnitDelay_DSTATE_b = rtDW->UnitDelay1_DSTATE_i; } else { /* Update for UnitDelay: '/UnitDelay' incorporates: * Sum: '/Add2' */ rtDW->UnitDelay_DSTATE_b = (int16_T)rtb_Gain_b0; } /* End of Switch: '/Switch2' */ /* Switch: '/Switch1' incorporates: * RelationalOperator: '/Relational Operator' * UnitDelay: '/UnitDelay' */ if (rtb_n_commDeacv != rtDW->UnitDelay_DSTATE_bv) { rtb_UnitDelay_bc = rtb_Sum_i; } /* End of Switch: '/Switch1' */ /* Update for UnitDelay: '/UnitDelay' */ rtDW->UnitDelay_DSTATE_j = rtb_UnitDelay_bc; /* Update for Delay: '/Delay' incorporates: * Inport: '/hall_A' */ rtDW->Delay_DSTATE_d = rtU->hall_A; /* Update for Delay: '/Delay1' incorporates: * Inport: '/hall_B' */ rtDW->Delay1_DSTATE = rtU->hall_B; /* Update for Delay: '/Delay2' incorporates: * Inport: '/hall_C' */ rtDW->Delay2_DSTATE = rtU->hall_C; /* Update for UnitDelay: '/UnitDelay3' incorporates: * Inport: '/us_Count' */ rtDW->UnitDelay3_DSTATE = rtU->us_Count; /* Update for UnitDelay: '/UnitDelay4' incorporates: * Abs: '/Abs5' */ rtDW->UnitDelay4_DSTATE = rtb_Switch2; /* Update for UnitDelay: '/UnitDelay' */ rtDW->UnitDelay_DSTATE_k = rtb_n_commDeacv; /* Update for UnitDelay: '/UnitDelay' */ rtDW->UnitDelay_DSTATE_n = rtb_RelationalOperator4_f; /* Update for UnitDelay: '/UnitDelay1' incorporates: * Sum: '/Sum3' */ rtDW->UnitDelay1_DSTATE = qY; /* Update for UnitDelay: '/UnitDelay' incorporates: * Switch: '/Switch2' */ rtDW->UnitDelay_DSTATE_h = rtDW->Switch2; /* Update for UnitDelay: '/Unit Delay1' incorporates: * Switch: '/Switch2' */ rtDW->UnitDelay1_DSTATE_i = rtb_Divide1_m; /* Update for UnitDelay: '/Unit Delay' incorporates: * Switch: '/Switch2' */ rtDW->UnitDelay_DSTATE_g = rtb_Divide1_m; /* Update for UnitDelay: '/UnitDelay' incorporates: * Switch: '/Switch' */ rtDW->UnitDelay_DSTATE_o = rtDW->Switch; /* Update for UnitDelay: '/Unit Delay1' incorporates: * Switch: '/Switch2' */ rtDW->UnitDelay1_DSTATE_b = rtb_Sum6_p; /* Update for UnitDelay: '/Unit Delay' incorporates: * Switch: '/Switch2' */ rtDW->UnitDelay_DSTATE_a = rtb_Sum6_p; /* Update for UnitDelay: '/Unit Delay' */ rtDW->UnitDelay_DSTATE_bm = rtb_z_ctrlMod; /* Update for UnitDelay: '/UnitDelay' */ rtDW->UnitDelay_DSTATE_bv = rtb_n_commDeacv; /* Update for UnitDelay: '/UnitDelay1' incorporates: * Switch: '/Switch' */ rtDW->UnitDelay1_DSTATE_f[0] = rtb_Switch_f_idx_0; /* End of Outputs for SubSystem: '/PMSM_Controller' */ /* Outport: '/f_Vdq' incorporates: * UnitDelay: '/UnitDelay1' */ rtY->f_Vdq[0] = rtb_UnitDelay1[0]; /* Outputs for Atomic SubSystem: '/PMSM_Controller' */ /* Update for UnitDelay: '/UnitDelay1' incorporates: * Switch: '/Switch' */ rtDW->UnitDelay1_DSTATE_f[1] = rtb_Switch_f_idx_1; /* End of Outputs for SubSystem: '/PMSM_Controller' */ /* Outport: '/f_Vdq' incorporates: * UnitDelay: '/UnitDelay1' */ rtY->f_Vdq[1] = rtb_UnitDelay1[1]; /* Outport: '/n_Sector' */ rtY->n_Sector = rtb_DataTypeConversion_j; /* Outport: '/n_MotError' */ rtY->n_MotError = rtb_UnitDelay_bc; /* Outport: '/f_MotAngle' incorporates: * Merge: '/Merge' */ rtY->f_MotAngle = rtDW->Merge_i; /* Outport: '/f_MotRPM' incorporates: * Switch: '/Switch2' */ rtY->f_MotRPM = rtb_Switch3; /* Outport: '/f_hallAngle' incorporates: * Merge: '/Merge' */ rtY->f_hallAngle = rtb_Sum3_jm; /* Outport: '/n_hallStat' */ rtY->n_hallStat = rtb_Add_gf; /* Outport: '/n_runingMode' */ rtY->n_runingMode = rtb_z_ctrlMod; } /* Model initialize function */ void PMSM_Controller_initialize(RT_MODEL *const rtM) { DW *rtDW = rtM->dwork; PrevZCX *rtPrevZCX = rtM->prevZCSigState; ExtY *rtY = (ExtY *) rtM->outputs; rtPrevZCX->ResettableDelay_Reset_ZCE_a = POS_ZCSIG; rtPrevZCX->PI_backCalc_fixdt1.ResettableDelay_Reset_ZCE = POS_ZCSIG; rtPrevZCX->PI_backCalc_fixdt_o3.ResettableDelay_Reset_ZCE = POS_ZCSIG; rtPrevZCX->PI_Speed.ResettableDelay_Reset_ZCE_f = POS_ZCSIG; /* SystemInitialize for Atomic SubSystem: '/PMSM_Controller' */ /* SystemInitialize for IfAction SubSystem: '/Raw_Motor_Speed_Estimation' */ /* InitializeConditions for UnitDelay: '/UnitDelay2' */ rtDW->UnitDelay2_DSTATE = rtP.n_hall_count_ps; /* SystemInitialize for Outport: '/z_counter' incorporates: * Inport: '/z_counterRawPrev' */ rtDW->z_counterRawPrev = rtP.n_hall_count_ps; /* End of SystemInitialize for SubSystem: '/Raw_Motor_Speed_Estimation' */ /* SystemInitialize for IfAction SubSystem: '/Do_Calc' */ /* SystemInitialize for IfAction SubSystem: '/speed_mode' */ /* SystemInitialize for Atomic SubSystem: '/PI_Speed' */ PI_backCalc_fixdt_Init(&rtDW->PI_Speed); /* End of SystemInitialize for SubSystem: '/PI_Speed' */ /* End of SystemInitialize for SubSystem: '/speed_mode' */ /* SystemInitialize for IfAction SubSystem: '/torque_mode' */ /* InitializeConditions for Delay: '/Delay' */ rtDW->icLoad = 1U; /* SystemInitialize for Atomic SubSystem: '/PI_TrqSpdLim' */ /* InitializeConditions for Delay: '/Resettable Delay' */ rtDW->icLoad_k = 1U; /* End of SystemInitialize for SubSystem: '/PI_TrqSpdLim' */ /* End of SystemInitialize for SubSystem: '/torque_mode' */ /* End of SystemInitialize for SubSystem: '/Do_Calc' */ /* SystemInitialize for IfAction SubSystem: '/CurrentLoop' */ /* SystemInitialize for Atomic SubSystem: '/PI_backCalc_fixdt' */ PI_backCalc_fixdt_p_Init(&rtDW->PI_backCalc_fixdt_o3); /* End of SystemInitialize for SubSystem: '/PI_backCalc_fixdt' */ /* SystemInitialize for Atomic SubSystem: '/PI_backCalc_fixdt1' */ PI_backCalc_fixdt_p_Init(&rtDW->PI_backCalc_fixdt1); /* End of SystemInitialize for SubSystem: '/PI_backCalc_fixdt1' */ /* End of SystemInitialize for SubSystem: '/CurrentLoop' */ /* End of SystemInitialize for SubSystem: '/PMSM_Controller' */ /* SystemInitialize for Outport: '/f_MotAngle' incorporates: * Merge: '/Merge' */ rtY->f_MotAngle = rtDW->Merge_i; } /* * File trailer for generated code. * * [EOF] */