/* * File: PMSM_Controller.c * * Code generated for Simulink model 'PMSM_Controller'. * * Model version : 1.1529 * Simulink Coder version : 9.4 (R2020b) 29-Jul-2020 * C/C++ source code generated on : Tue Aug 2 19:43:20 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_Us32En6_Ys16En5_Is64En10_f_s(int32_T u); extern int16_T rt_sqrt_Us32En10_Ys16En5_Is32En10_s_s(int32_T u); extern uint16_T rt_sqrt_Uu16En14_Yu16En14_Iu32En28_s_s(uint16_T u); static uint16_T plook_u16s16_evencka(int16_T u, int16_T bp0, uint16_T bpSpace, uint32_T maxIndex); static int32_T div_nde_s32_floor(int32_T numerator, int32_T denominator); static void wrapper(uint32_T rtu_In1, uint32_T rtu_In2, uint32_T *rty_Out1); static void Low_Pass_Filter(const int16_T rtu_u[2], uint16_T rtu_coef, int16_T rty_y[2], DW_Low_Pass_Filter *localDW); static void PI_backCalc_fixdt_Init(DW_PI_backCalc_fixdt *localDW); static 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); static void PI_backCalc_fixdt_g_Init(DW_PI_backCalc_fixdt_j *localDW); static int32_T PI_backCalc_fixdt_i(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_j *localDW, ZCE_PI_backCalc_fixdt_n *localZCE); static 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); static void RateInit_a(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); static 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; } static int32_T div_nde_s32_floor(int32_T numerator, int32_T denominator) { return (((numerator < 0) != (denominator < 0)) && (numerator % denominator != 0) ? -1 : 0) + numerator / denominator; } /* * Output and update for action system: * '/wrapper' * '/wrapper' */ static void wrapper(uint32_T rtu_In1, uint32_T rtu_In2, uint32_T *rty_Out1) { /* Sum: '/Add1' incorporates: * Sum: '/Add' * Sum: '/Subtract' */ *rty_Out1 = rtu_In1 - rtu_In2; } /* * Output and update for atomic system: * '/Low_Pass_Filter' * '/Low_Pass_Filter' */ static 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_i; /* Sum: '/Sum2' incorporates: * UnitDelay: '/UnitDelay1' */ rtb_Sum3_i = rtu_u[0] - (localDW->UnitDelay1_DSTATE[0] >> 16); if (rtb_Sum3_i > 32767) { rtb_Sum3_i = 32767; } else { if (rtb_Sum3_i < -32768) { rtb_Sum3_i = -32768; } } /* Sum: '/Sum3' incorporates: * Product: '/Divide3' * Sum: '/Sum2' * UnitDelay: '/UnitDelay1' */ rtb_Sum3_i = rtu_coef * rtb_Sum3_i + localDW->UnitDelay1_DSTATE[0]; /* DataTypeConversion: '/Data Type Conversion' */ rty_y[0] = (int16_T)(rtb_Sum3_i >> 16); /* Update for UnitDelay: '/UnitDelay1' */ localDW->UnitDelay1_DSTATE[0] = rtb_Sum3_i; /* Sum: '/Sum2' incorporates: * UnitDelay: '/UnitDelay1' */ rtb_Sum3_i = rtu_u[1] - (localDW->UnitDelay1_DSTATE[1] >> 16); if (rtb_Sum3_i > 32767) { rtb_Sum3_i = 32767; } else { if (rtb_Sum3_i < -32768) { rtb_Sum3_i = -32768; } } /* Sum: '/Sum3' incorporates: * Product: '/Divide3' * Sum: '/Sum2' * UnitDelay: '/UnitDelay1' */ rtb_Sum3_i = rtu_coef * rtb_Sum3_i + localDW->UnitDelay1_DSTATE[1]; /* DataTypeConversion: '/Data Type Conversion' */ rty_y[1] = (int16_T)(rtb_Sum3_i >> 16); /* Update for UnitDelay: '/UnitDelay1' */ localDW->UnitDelay1_DSTATE[1] = rtb_Sum3_i; } /* System initialize for atomic system: '/PI_Speed' */ static 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' */ static 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_fm != POS_ZCSIG)) { localDW->icLoad = 1U; } localZCE->ResettableDelay_Reset_ZCE_fm = (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' */ static void PI_backCalc_fixdt_g_Init(DW_PI_backCalc_fixdt_j *localDW) { /* InitializeConditions for Delay: '/Resettable Delay' */ localDW->icLoad = 1U; } /* * Output and update for atomic system: * '/PI_backCalc_fixdt' * '/PI_backCalc_fixdt1' */ static int32_T PI_backCalc_fixdt_i(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_j *localDW, ZCE_PI_backCalc_fixdt_n *localZCE) { int32_T rty_pi_out_0; int64_T tmp; int64_T tmp_0; int32_T rtb_Divide4_px; /* Product: '/Divide4' */ rtb_Divide4_px = (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_px * 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_px; 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' */ static 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_c; /* Sum: '/Add' */ rtb_Add_c = (int16_T)((rtu_target - rtu_initVal) >> 1); /* Signum: '/Sign' incorporates: * Sum: '/Add' */ if (rtb_Add_c < 0) { rtb_Add_c = -1; } else { rtb_Add_c = (int16_T)(rtb_Add_c > 0); } /* End of Signum: '/Sign' */ /* Product: '/Divide' */ *rty_s_step = (int16_T)(rtu_step * rtb_Add_c); /* 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' */ } /* * Output and update for action system: * '/RateInit' * '/RateInit' */ static void RateInit_a(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_pn; /* Sum: '/Add' */ rtb_Add_pn = (int16_T)((rtu_target - rtu_initVal) >> 1); /* Signum: '/Sign' incorporates: * Sum: '/Add' */ if (rtb_Add_pn < 0) { rtb_Add_pn = -1; } else { rtb_Add_pn = (int16_T)(rtb_Add_pn > 0); } /* End of Signum: '/Sign' */ /* Product: '/Divide' */ *rty_s_step = (int16_T)(rtu_step * rtb_Add_pn); /* 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_Us32En6_Ys16En5_Is64En10_f_s(int32_T u) { int64_T tmp03_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; tmp03_u = (int64_T)u << 4; for (iBit = 0; iBit < 15; iBit++) { tmp01_y = (int16_T)(y | shiftMask); if (tmp01_y * tmp01_y <= tmp03_u) { y = tmp01_y; } shiftMask = (int16_T)((uint32_T)shiftMask >> 1U); } } else { y = 0; } return y; } int16_T rt_sqrt_Us32En10_Ys16En5_Is32En10_s_s(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_Yu16En14_Iu32En28_s_s(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_2; uint64_T tmp_0; uint64_T tmp_1; int32_T rtb_Divide_e_idx_1; int32_T rtb_Divide_e_idx_2; int32_T rtb_Gain_b; int32_T rtb_Gain_h; int32_T rtb_Gain_ib; int32_T rtb_MathFunction2_n; int32_T rtb_RelationalOperator4_b; int32_T rtb_Switch2_au; int32_T rtb_Switch3; int32_T tmp; uint32_T rtb_Merge; uint32_T rtb_Rem1; uint32_T rtb_Switch1; int16_T rtb_TmpSignalConversionAtLow_Pass_FilterInport1[2]; int16_T rtb_UnitDelay1_ko[2]; int16_T rtb_Add2_lk; int16_T rtb_Divide1_oy; int16_T rtb_Divide3_k; int16_T rtb_Gain_a; int16_T rtb_Sum1_ak; int16_T rtb_Sum6; int16_T rtb_Switch2_pl; int16_T rtb_r_cos_M1; uint16_T rtb_Divide_d; uint16_T rtb_Sum1_p; int8_T rtb_Sum2; uint8_T rtb_Add_h; uint8_T rtb_DataTypeConversion_e; uint8_T rtb_Sum_d; uint8_T rtb_UnitDelay_n; uint8_T rtb_dz_cntTrnsDet; boolean_T rtb_Edge_Detect; boolean_T rtb_LogicalOperator1_g; boolean_T rtb_LogicalOperator2_c; boolean_T rtb_LogicalOperator4_f; boolean_T rtb_RelationalOperator; boolean_T rtb_RelationalOperator4_d; boolean_T rtb_UnitDelay_c; /* Outputs for Atomic SubSystem: '/PMSM_Controller' */ /* Product: '/Divide' incorporates: * Constant: '/Constant' * Inport: '/adc_Phase' */ rtb_Divide_e_idx_1 = rtU->adc_Phase[1] * rtP.f_adc_curr_ceof; rtb_Divide_e_idx_2 = rtU->adc_Phase[2] * rtP.f_adc_curr_ceof; /* Gain: '/Gain' incorporates: * Constant: '/Constant' * Inport: '/adc_Phase' * Product: '/Divide' */ rtb_RelationalOperator4_b = (rtU->adc_Phase[0] * rtP.f_adc_curr_ceof) >> 8; if (rtb_RelationalOperator4_b > 32767) { rtb_RelationalOperator4_b = 32767; } else { if (rtb_RelationalOperator4_b < -32768) { rtb_RelationalOperator4_b = -32768; } } /* Sum: '/Add3' */ tmp_2 = ((int64_T)rtb_Divide_e_idx_1 + rtb_Divide_e_idx_2) >> 8; if (tmp_2 > 32767LL) { tmp_2 = 32767LL; } else { if (tmp_2 < -32768LL) { tmp_2 = -32768LL; } } /* Sum: '/Add' incorporates: * Gain: '/Gain' * Sum: '/Add3' */ rtb_RelationalOperator4_b = ((rtb_RelationalOperator4_b << 1) - (int16_T)tmp_2) >> 1; if (rtb_RelationalOperator4_b > 32767) { rtb_RelationalOperator4_b = 32767; } else { if (rtb_RelationalOperator4_b < -32768) { rtb_RelationalOperator4_b = -32768; } } /* Gain: '/Gain1' incorporates: * Product: '/Divide1' * Sum: '/Add' */ rtb_Divide1_oy = (int16_T)((21845 * rtb_RelationalOperator4_b) >> 16); /* Logic: '/Edge_Detect' incorporates: * Delay: '/Delay' * Delay: '/Delay1' * Delay: '/Delay2' * Inport: '/hall_abc' */ rtb_Edge_Detect = (boolean_T)((rtU->hall_abc[0] != 0) ^ (rtDW->Delay_DSTATE_p != 0) ^ (rtU->hall_abc[1] != 0) ^ (rtDW->Delay1_DSTATE != 0) ^ (rtU->hall_abc[2] != 0)) ^ (rtDW->Delay2_DSTATE != 0); /* Sum: '/Add' incorporates: * Gain: '/Gain' * Gain: '/Gain1' * Inport: '/hall_abc' */ rtb_Add_h = (uint8_T)((uint32_T)(uint8_T)((uint32_T)(uint8_T)(rtU->hall_abc[2] << 2) + (uint8_T)(rtU->hall_abc[1] << 1)) + rtU->hall_abc[0]); /* If: '/If2' incorporates: * Inport: '/sys_ticks' * Inport: '/i_count' */ if (rtb_Edge_Detect) { /* Outputs for IfAction SubSystem: '/Direction_Detection' incorporates: * ActionPort: '/Action Port' */ /* UnitDelay: '/UnitDelay3' */ rtDW->UnitDelay3 = rtDW->Switch2_o; /* Sum: '/Sum2' incorporates: * Constant: '/vec_hallToPos' * Selector: '/Selector' * UnitDelay: '/UnitDelay2' */ rtb_Sum2 = (int8_T)(rtConstP.vec_hallToPos_Value[rtb_Add_h] - rtDW->UnitDelay2_DSTATE_i); /* 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_o = 1; } else { /* Switch: '/Switch2' incorporates: * Constant: '/Constant23' */ rtDW->Switch2_o = -1; } /* End of Switch: '/Switch2' */ rtDW->i_count = rtU->sys_ticks; /* Update for UnitDelay: '/UnitDelay2' incorporates: * Constant: '/vec_hallToPos' * Inport: '/sys_ticks' * Inport: '/i_count' * Selector: '/Selector' */ rtDW->UnitDelay2_DSTATE_i = rtConstP.vec_hallToPos_Value[rtb_Add_h]; /* End of Outputs for SubSystem: '/Direction_Detection' */ } /* End of If: '/If2' */ /* If: '/If' incorporates: * Inport: '/sys_ticks' */ if (rtU->sys_ticks >= rtDW->i_count) { /* Outputs for IfAction SubSystem: '/normal' incorporates: * ActionPort: '/Action Port' */ /* Sum: '/Subtract' */ rtb_Rem1 = rtU->sys_ticks - rtDW->i_count; /* End of Outputs for SubSystem: '/normal' */ } else { /* Outputs for IfAction SubSystem: '/wrapper' incorporates: * ActionPort: '/Action Port' */ wrapper(rtU->sys_ticks, rtDW->i_count, &rtb_Rem1); /* End of Outputs for SubSystem: '/wrapper' */ } /* End of If: '/If' */ /* If: '/If2' */ if (rtb_Edge_Detect) { /* Outputs for IfAction SubSystem: '/Raw_Motor_Speed_Estimation' incorporates: * ActionPort: '/Action Port' */ /* If: '/If' incorporates: * UnitDelay: '/Unit Delay' */ if (rtDW->i_count >= rtDW->UnitDelay_DSTATE) { /* Outputs for IfAction SubSystem: '/normal' incorporates: * ActionPort: '/Action Port' */ /* Sum: '/Subtract' */ rtb_Merge = rtDW->i_count - rtDW->UnitDelay_DSTATE; /* End of Outputs for SubSystem: '/normal' */ } else { /* Outputs for IfAction SubSystem: '/wrapper' incorporates: * ActionPort: '/Action Port' */ wrapper(rtDW->i_count, rtDW->UnitDelay_DSTATE, &rtb_Merge); /* End of Outputs for SubSystem: '/wrapper' */ } /* End of If: '/If' */ /* Sum: '/Sum13' incorporates: * UnitDelay: '/UnitDelay2' * UnitDelay: '/UnitDelay3' * UnitDelay: '/UnitDelay5' */ tmp_1 = (((uint64_T)rtDW->UnitDelay2_DSTATE + rtDW->UnitDelay3_DSTATE) + rtDW->UnitDelay5_DSTATE) + rtb_Merge; if (tmp_1 > 4294967295ULL) { tmp_1 = 4294967295ULL; } /* Switch: '/Switch1' incorporates: * Constant: '/cf_speedCoef' * Constant: '/polePairs' * Product: '/Divide' * Product: '/Divide13' * Product: '/Divide14' * UnitDelay: '/Unit Delay1' */ if (rtDW->UnitDelay1_DSTATE_k != 0) { rtb_Switch1 = (uint32_T)(((uint64_T)(10000000U / rtP.n_polePairs) << 4) / rtb_Merge); } else { /* Product: '/Divide13' incorporates: * Constant: '/cf_speedCoef' * Constant: '/polePairs' * Gain: '/g_Ha' * Product: '/Divide' * Sum: '/Sum13' */ tmp_0 = ((uint64_T)((10000000U / rtP.n_polePairs) << 2) << 4) / (uint32_T) tmp_1; if (tmp_0 > 4294967295ULL) { tmp_0 = 4294967295ULL; } rtb_Switch1 = (uint32_T)tmp_0; } /* End of Switch: '/Switch1' */ /* Sum: '/Sum7' incorporates: * Switch: '/Switch1' * UnitDelay: '/UnitDelay4' */ rtb_Switch3 = ((int32_T)(rtb_Switch1 >> 1) - (int32_T) (rtDW->UnitDelay4_DSTATE_o >> 1)) >> 3; /* Abs: '/Abs2' */ if (rtb_Switch3 < 0) { rtb_Switch3 = -rtb_Switch3; } /* End of Abs: '/Abs2' */ /* Relay: '/dz_cntTrnsDet' */ rtDW->dz_cntTrnsDet_Mode = ((rtb_Switch3 >= 140) || ((rtb_Switch3 > 100) && rtDW->dz_cntTrnsDet_Mode)); /* RelationalOperator: '/Relational Operator4' */ rtb_RelationalOperator4_d = (rtDW->Switch2_o != rtDW->UnitDelay3); /* Switch: '/Switch3' incorporates: * Constant: '/Constant4' * Logic: '/Logical Operator1' * Switch: '/Switch1' * Switch: '/Switch2' * UnitDelay: '/UnitDelay1' */ if (rtb_RelationalOperator4_d && rtDW->UnitDelay1_DSTATE_m) { rtb_RelationalOperator4_b = 0; } else if (rtb_RelationalOperator4_d) { /* Switch: '/Switch2' incorporates: * UnitDelay: '/UnitDelay4' */ rtb_RelationalOperator4_b = (int32_T)rtDW->UnitDelay4_DSTATE; } else { rtb_RelationalOperator4_b = (int32_T)rtb_Switch1; } /* End of Switch: '/Switch3' */ /* Product: '/Divide11' */ rtDW->Divide11 = rtb_RelationalOperator4_b * rtDW->Switch2_o; /* Switch: '/Switch4' incorporates: * UnitDelay: '/Unit Delay1' */ if (rtDW->UnitDelay1_DSTATE_k != 0) { /* Switch: '/Switch4' incorporates: * Product: '/Divide2' */ rtDW->Switch4 = 62914560U / rtb_Merge; } else { /* Switch: '/Switch4' incorporates: * Product: '/Divide1' * Sum: '/Sum13' */ rtDW->Switch4 = 251658240U / (uint32_T)tmp_1; } /* End of Switch: '/Switch4' */ /* SignalConversion generated from: '/delta_count' */ rtDW->OutportBufferFordelta_count = rtb_Merge; /* Update for UnitDelay: '/Unit Delay' */ rtDW->UnitDelay_DSTATE = rtDW->i_count; /* Update for UnitDelay: '/UnitDelay2' incorporates: * UnitDelay: '/UnitDelay3' */ rtDW->UnitDelay2_DSTATE = rtDW->UnitDelay3_DSTATE; /* Update for UnitDelay: '/UnitDelay3' incorporates: * UnitDelay: '/UnitDelay5' */ rtDW->UnitDelay3_DSTATE = rtDW->UnitDelay5_DSTATE; /* Update for UnitDelay: '/UnitDelay5' */ rtDW->UnitDelay5_DSTATE = rtb_Merge; /* Update for UnitDelay: '/Unit Delay1' incorporates: * Relay: '/dz_cntTrnsDet' */ rtDW->UnitDelay1_DSTATE_k = rtDW->dz_cntTrnsDet_Mode; /* Update for UnitDelay: '/UnitDelay4' incorporates: * Switch: '/Switch1' */ rtDW->UnitDelay4_DSTATE_o = rtb_Switch1; /* Update for UnitDelay: '/UnitDelay1' */ rtDW->UnitDelay1_DSTATE_m = rtb_RelationalOperator4_d; /* End of Outputs for SubSystem: '/Raw_Motor_Speed_Estimation' */ } /* End of If: '/If2' */ /* Switch: '/Switch3' incorporates: * Constant: '/Constant16' * Constant: '/Constant2' * Constant: '/vec_hallToPos' * RelationalOperator: '/Relational Operator7' * Selector: '/Selector' * Sum: '/Sum1' */ if (rtDW->Switch2_o == 1) { rtb_Sum2 = rtConstP.vec_hallToPos_Value[rtb_Add_h]; } else { rtb_Sum2 = (int8_T)(rtConstP.vec_hallToPos_Value[rtb_Add_h] + 1); } /* End of Switch: '/Switch3' */ /* Sum: '/Sum3' incorporates: * Gain: '/Gain' * Interpolation_n-D: '/r_cos_M1' * Product: '/Divide1' * Product: '/Divide3' * Switch: '/Switch4' */ rtb_r_cos_M1 = (int16_T)(((int16_T)((int16_T)(((int32_T)((2290649225ULL * rtDW->Switch4) >> 37) * (int32_T)rtb_Rem1) >> 6) * rtDW->Switch2_o) + (rtb_Sum2 << 14)) >> 2); /* MinMax: '/Max' incorporates: * Constant: '/a_elecAngle2' * Interpolation_n-D: '/r_cos_M1' */ if (rtb_r_cos_M1 <= 0) { rtb_r_cos_M1 = 0; } /* End of MinMax: '/Max' */ /* Sum: '/Add2' incorporates: * Constant: '/Constant2' * Product: '/Divide2' */ rtb_Add2_lk = (int16_T)((((15 * rtb_r_cos_M1) >> 4) + (rtP.i_hall_offset << 2)) >> 2); /* DataTypeConversion: '/Data Type Conversion' incorporates: * Sum: '/Add2' */ rtb_r_cos_M1 = (int16_T)(rtb_Add2_lk >> 4); /* If: '/If' incorporates: * Constant: '/Constant1' * Constant: '/Constant3' * Inport: '/In1' * Inport: '/In1' * Inport: '/In1' * Interpolation_n-D: '/r_cos_M1' * Sum: '/Add' * Sum: '/Add1' * Sum: '/Add2' */ if (rtb_r_cos_M1 >= 360) { /* Outputs for IfAction SubSystem: '/If Action Subsystem' incorporates: * ActionPort: '/Action Port' */ rtb_r_cos_M1 = (int16_T)(rtb_Add2_lk - 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_r_cos_M1 = (int16_T)(rtb_Add2_lk + 5760); /* End of Outputs for SubSystem: '/If Action Subsystem2' */ } else { /* Outputs for IfAction SubSystem: '/If Action Subsystem1' incorporates: * ActionPort: '/Action Port' */ rtb_r_cos_M1 = rtb_Add2_lk; /* End of Outputs for SubSystem: '/If Action Subsystem1' */ } /* End of If: '/If' */ /* Switch: '/Switch' incorporates: * Inport: '/set_Angle' */ if (rtU->set_Angle <= 5760) { rtb_r_cos_M1 = rtU->set_Angle; } /* End of Switch: '/Switch' */ /* PreLookup: '/a_elecAngle_XA' incorporates: * Switch: '/Switch' */ rtb_Divide_d = plook_u16s16_evencka(rtb_r_cos_M1, 0, 16U, 360U); /* Sum: '/Add2' */ tmp_2 = ((int64_T)rtb_Divide_e_idx_1 - rtb_Divide_e_idx_2) >> 9; if (tmp_2 > 32767LL) { tmp_2 = 32767LL; } else { if (tmp_2 < -32768LL) { tmp_2 = -32768LL; } } /* Gain: '/Gain2' incorporates: * Sum: '/Add2' * Sum: '/Sum6' */ rtb_Add2_lk = (int16_T)((18919 * (int16_T)tmp_2) >> 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_RelationalOperator4_b = ((rtb_Divide1_oy * rtConstP.pooled13[rtb_Divide_d]) >> 14) + (int16_T)((rtb_Add2_lk * rtConstP.pooled12[rtb_Divide_d]) >> 14); if (rtb_RelationalOperator4_b > 32767) { rtb_RelationalOperator4_b = 32767; } else { if (rtb_RelationalOperator4_b < -32768) { rtb_RelationalOperator4_b = -32768; } } /* SignalConversion generated from: '/Low_Pass_Filter' incorporates: * Sum: '/Sum1' */ rtb_TmpSignalConversionAtLow_Pass_FilterInport1[0] = (int16_T) rtb_RelationalOperator4_b; /* Sum: '/Sum6' incorporates: * Interpolation_n-D: '/r_cos_M1' * Interpolation_n-D: '/r_sin_M1' * Product: '/Divide1' * Product: '/Divide4' */ rtb_RelationalOperator4_b = (int16_T)((rtb_Add2_lk * rtConstP.pooled13[rtb_Divide_d]) >> 14) - ((rtb_Divide1_oy * rtConstP.pooled12[rtb_Divide_d]) >> 14); if (rtb_RelationalOperator4_b > 32767) { rtb_RelationalOperator4_b = 32767; } else { if (rtb_RelationalOperator4_b < -32768) { rtb_RelationalOperator4_b = -32768; } } /* SignalConversion generated from: '/Low_Pass_Filter' incorporates: * Sum: '/Sum6' */ rtb_TmpSignalConversionAtLow_Pass_FilterInport1[1] = (int16_T) rtb_RelationalOperator4_b; /* Outputs for Atomic SubSystem: '/Low_Pass_Filter' */ /* Constant: '/Constant' incorporates: * Outport: '/f_Idq' */ Low_Pass_Filter(rtb_TmpSignalConversionAtLow_Pass_FilterInport1, rtP.f_lpf_idq, rtY->f_Idq, &rtDW->Low_Pass_Filter_l); /* End of Outputs for SubSystem: '/Low_Pass_Filter' */ /* UnitDelay: '/UnitDelay' */ rtb_UnitDelay_n = rtDW->UnitDelay_DSTATE_p; /* Switch: '/Switch2' incorporates: * Constant: '/Constant4' * Constant: '/z_maxCntRst' * Gain: '/Gain' * Product: '/Divide11' * RelationalOperator: '/Relational Operator2' */ if (rtDW->OutportBufferFordelta_count >= 2000000U) { rtb_Switch3 = 0; } else { rtb_Switch3 = rtDW->Divide11; } /* End of Switch: '/Switch2' */ /* Abs: '/Abs5' incorporates: * Switch: '/Switch2' */ if (rtb_Switch3 < 0) { rtb_Rem1 = (uint32_T)-rtb_Switch3; } else { rtb_Rem1 = (uint32_T)rtb_Switch3; } /* End of Abs: '/Abs5' */ /* Outport: '/f_Vdq' incorporates: * UnitDelay: '/Unit Delay' */ rtY->f_Vdq[0] = rtDW->UnitDelay_DSTATE_k[0]; rtY->f_Vdq[1] = rtDW->UnitDelay_DSTATE_k[1]; /* 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: '/Unit Delay' */ if ((rtb_UnitDelay_n & 4U) != 0U) { rtb_UnitDelay_c = true; } else { if (rtDW->UnitDelay_DSTATE_k[1] < 0) { /* Abs: '/Abs4' incorporates: * UnitDelay: '/Unit Delay' */ rtb_Switch2_pl = (int16_T)-rtDW->UnitDelay_DSTATE_k[1]; } else { /* Abs: '/Abs4' incorporates: * UnitDelay: '/Unit Delay' */ rtb_Switch2_pl = rtDW->UnitDelay_DSTATE_k[1]; } rtb_UnitDelay_c = (rtU->b_motEna && (rtb_Rem1 < 48U) && (rtb_Switch2_pl > 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_d = (uint8_T)(((uint32_T)((rtb_Add_h == 7) << 1) + (rtb_Add_h == 0)) + (rtb_UnitDelay_c << 2)); /* RelationalOperator: '/Relational Operator2' incorporates: * Constant: '/CTRL_COMM2' */ rtb_RelationalOperator4_d = (rtb_Sum_d != 0); /* RelationalOperator: '/Relational Operator' incorporates: * UnitDelay: '/UnitDelay' */ rtb_RelationalOperator = (rtb_RelationalOperator4_d != rtDW->UnitDelay_DSTATE_oy); /* If: '/If2' incorporates: * Inport: '/yPrev' * Logic: '/Logical Operator1' * Logic: '/Logical Operator2' * Logic: '/Logical Operator3' * Logic: '/Logical Operator4' * UnitDelay: '/UnitDelay' */ if (rtb_RelationalOperator4_d && (!rtDW->UnitDelay_DSTATE_gv)) { /* Outputs for IfAction SubSystem: '/Qualification' incorporates: * ActionPort: '/Action Port' */ /* Switch: '/Switch1' incorporates: * Constant: '/Constant23' * UnitDelay: '/UnitDelay' */ if (rtb_RelationalOperator) { rtb_Sum1_p = 0U; } else { rtb_Sum1_p = rtDW->UnitDelay_DSTATE_m; } /* End of Switch: '/Switch1' */ /* Switch: '/Switch2' incorporates: * Constant: '/Constant6' * Constant: '/t_errQual' * RelationalOperator: '/Relational Operator2' * Sum: '/Sum1' */ rtb_RelationalOperator = (((uint16_T)(rtb_Sum1_p + 1U) > 1600) || rtDW->UnitDelay_DSTATE_gv); /* MinMax: '/MinMax' incorporates: * Constant: '/Constant6' * Sum: '/Sum1' */ if ((uint16_T)(rtb_Sum1_p + 1U) < 1600) { /* Update for UnitDelay: '/UnitDelay' */ rtDW->UnitDelay_DSTATE_m = (uint16_T)(rtb_Sum1_p + 1U); } else { /* Update for UnitDelay: '/UnitDelay' */ rtDW->UnitDelay_DSTATE_m = 1600U; } /* End of MinMax: '/MinMax' */ /* End of Outputs for SubSystem: '/Qualification' */ } else if ((!rtb_RelationalOperator4_d) && rtDW->UnitDelay_DSTATE_gv) { /* Outputs for IfAction SubSystem: '/Dequalification' incorporates: * ActionPort: '/Action Port' */ /* Switch: '/Switch1' incorporates: * Constant: '/Constant23' * UnitDelay: '/UnitDelay' */ if (rtb_RelationalOperator) { rtb_Sum1_p = 0U; } else { rtb_Sum1_p = rtDW->UnitDelay_DSTATE_i; } /* End of Switch: '/Switch1' */ /* Switch: '/Switch2' incorporates: * Constant: '/t_errDequal' * Constant: '/Constant6' * RelationalOperator: '/Relational Operator2' * Sum: '/Sum1' */ rtb_RelationalOperator = (((uint16_T)(rtb_Sum1_p + 1U) <= 12000) && rtDW->UnitDelay_DSTATE_gv); /* MinMax: '/MinMax' incorporates: * Constant: '/Constant6' * Sum: '/Sum1' */ if ((uint16_T)(rtb_Sum1_p + 1U) < 12000) { /* Update for UnitDelay: '/UnitDelay' */ rtDW->UnitDelay_DSTATE_i = (uint16_T)(rtb_Sum1_p + 1U); } else { /* Update for UnitDelay: '/UnitDelay' */ rtDW->UnitDelay_DSTATE_i = 12000U; } /* End of MinMax: '/MinMax' */ /* End of Outputs for SubSystem: '/Dequalification' */ } else { /* Outputs for IfAction SubSystem: '/Default' incorporates: * ActionPort: '/Action Port' */ rtb_RelationalOperator = rtDW->UnitDelay_DSTATE_gv; /* End of Outputs for SubSystem: '/Default' */ } /* End of If: '/If2' */ /* Logic: '/Logical Operator1' incorporates: * Inport: '/b_motEna' * Logic: '/Logical Operator' */ rtb_LogicalOperator1_g = ((!rtb_RelationalOperator) && rtU->b_motEna); /* Logic: '/Logical Operator4' incorporates: * Constant: '/constant8' * Inport: '/n_ctrlMod' * Logic: '/Logical Operator11' * RelationalOperator: '/Relational Operator10' */ rtb_LogicalOperator4_f = ((!rtb_LogicalOperator1_g) || (rtU->n_ctrlMod == 0)); /* Abs: '/Abs' incorporates: * Gain: '/Gain' * Switch: '/Switch2' */ if (rtb_Switch3 < 0) { rtb_Gain_b = -rtb_Switch3; } else { rtb_Gain_b = rtb_Switch3; } /* End of Abs: '/Abs' */ /* Relay: '/n_SpeedCtrl' incorporates: * Gain: '/Gain' */ rtDW->n_SpeedCtrl_Mode = ((rtb_Gain_b >= 4800) || ((rtb_Gain_b > 3200) && rtDW->n_SpeedCtrl_Mode)); /* Logic: '/Logical Operator10' incorporates: * Inport: '/b_cruiseEna' * Relay: '/n_SpeedCtrl' */ rtb_UnitDelay_c = (rtDW->n_SpeedCtrl_Mode && rtU->b_cruiseEna); /* Logic: '/Logical Operator2' incorporates: * Constant: '/constant' * Inport: '/n_ctrlMod' * Logic: '/Logical Operator5' * RelationalOperator: '/Relational Operator4' */ rtb_LogicalOperator2_c = ((rtU->n_ctrlMod == 2) && (!rtb_UnitDelay_c)); /* Logic: '/Logical Operator1' incorporates: * Constant: '/constant1' * Inport: '/n_ctrlMod' * RelationalOperator: '/Relational Operator1' */ rtb_UnitDelay_c = ((rtU->n_ctrlMod == 1) || rtb_UnitDelay_c); /* Chart: '/Control_Mode_Manager' incorporates: * Logic: '/Logical Operator3' * Logic: '/Logical Operator6' * Logic: '/Logical Operator9' */ if (rtDW->is_active_c11_PMSM_Controller == 0U) { rtDW->is_active_c11_PMSM_Controller = 1U; rtDW->is_c11_PMSM_Controller = IN_OPEN; rtb_dz_cntTrnsDet = OPEN_MODE; } else if (rtDW->is_c11_PMSM_Controller == 1) { if (rtb_LogicalOperator4_f) { rtDW->is_ACTIVE = IN_NO_ACTIVE_CHILD; rtDW->is_c11_PMSM_Controller = IN_OPEN; rtb_dz_cntTrnsDet = OPEN_MODE; } else if (rtDW->is_ACTIVE == 1) { rtb_dz_cntTrnsDet = SPD_MODE; if (!rtb_UnitDelay_c) { if (rtb_LogicalOperator2_c) { rtDW->is_ACTIVE = IN_TORQUE_MODE; rtb_dz_cntTrnsDet = TRQ_MODE; } else { rtDW->is_ACTIVE = IN_SPEED_MODE; } } } else { /* case IN_TORQUE_MODE: */ rtb_dz_cntTrnsDet = TRQ_MODE; if (!rtb_LogicalOperator2_c) { rtDW->is_ACTIVE = IN_SPEED_MODE; rtb_dz_cntTrnsDet = SPD_MODE; } } } else { /* case IN_OPEN: */ rtb_dz_cntTrnsDet = OPEN_MODE; if ((!rtb_LogicalOperator4_f) && (rtb_LogicalOperator2_c || rtb_UnitDelay_c)) { rtDW->is_c11_PMSM_Controller = IN_ACTIVE; if (rtb_LogicalOperator2_c) { rtDW->is_ACTIVE = IN_TORQUE_MODE; rtb_dz_cntTrnsDet = TRQ_MODE; } else { rtDW->is_ACTIVE = IN_SPEED_MODE; rtb_dz_cntTrnsDet = SPD_MODE; } } } /* End of Chart: '/Control_Mode_Manager' */ /* UnitDelay: '/UnitDelay1' */ rtb_UnitDelay1_ko[0] = rtDW->UnitDelay1_DSTATE_o[0]; rtb_UnitDelay1_ko[1] = rtDW->UnitDelay1_DSTATE_o[1]; /* Switch: '/Switch2' incorporates: * Inport: '/spd_Limit' * Inport: '/spd_Target' * RelationalOperator: '/LowerRelop1' * RelationalOperator: '/UpperRelop' * Switch: '/Switch' */ if (rtU->spd_Target > rtU->spd_Limit) { rtb_Switch2_au = rtU->spd_Limit; } else if (rtU->spd_Target < 0) { /* Switch: '/Switch' incorporates: * Constant: '/Constant' * Switch: '/Switch2' */ rtb_Switch2_au = 0; } else { rtb_Switch2_au = rtU->spd_Target; } /* End of Switch: '/Switch2' */ /* Switch: '/Switch2' incorporates: * Inport: '/idq_Limit' * Inport: '/idq_Target' * RelationalOperator: '/LowerRelop1' */ if (rtU->idq_Target > rtU->idq_Limit) { rtb_Divide1_oy = rtU->idq_Limit; } else { /* Gain: '/Gain' */ rtb_Gain_ib = -32768 * rtU->idq_Limit; /* Switch: '/Switch' incorporates: * Gain: '/Gain' * RelationalOperator: '/UpperRelop' * Switch: '/Switch2' */ if ((rtU->idq_Target << 15) < rtb_Gain_ib) { rtb_Divide1_oy = (int16_T)(rtb_Gain_ib >> 15); } else { rtb_Divide1_oy = rtU->idq_Target; } /* End of Switch: '/Switch' */ } /* End of Switch: '/Switch2' */ /* Sum: '/Sum3' incorporates: * UnitDelay: '/UnitDelay1' */ rtb_Merge = rtDW->UnitDelay1_DSTATE + /*MW:OvSatOk*/ 1U; if (rtDW->UnitDelay1_DSTATE + 1U < 1U) { rtb_Merge = MAX_uint32_T; } /* If: '/If' incorporates: * Constant: '/Constant2' * Logic: '/Logical Operator' * Math: '/Rem1' * RelationalOperator: '/Equal1' * RelationalOperator: '/Equal' * Sum: '/Sum3' */ if ((rtb_dz_cntTrnsDet == 0) && (rtb_Merge % 200U == 0U)) { /* Outputs for IfAction SubSystem: '/open_mode' incorporates: * ActionPort: '/Action Port' */ /* RelationalOperator: '/Relational Operator' incorporates: * Inport: '/vdq_Target' * UnitDelay: '/UnitDelay' */ rtb_UnitDelay_c = (rtU->vdq_Target[0] != rtDW->UnitDelay_DSTATE_lz); /* If: '/If' incorporates: * Constant: '/Constant1' * Inport: '/vdq_Target' * UnitDelay: '/Unit Delay' */ if (rtb_UnitDelay_c) { /* Outputs for IfAction SubSystem: '/RateInit' incorporates: * ActionPort: '/Action Port' */ RateInit_a(rtDW->UnitDelay_DSTATE_e[0], rtU->vdq_Target[0], rtP.dz_OpenStepVol, &rtDW->Divide_o, &rtDW->Max_l, &rtDW->Max1_j); /* End of Outputs for SubSystem: '/RateInit' */ /* Switch: '/Switch1' incorporates: * Constant: '/Constant1' * Inport: '/vdq_Target' * UnitDelay: '/Unit Delay' */ rtb_Sum6 = rtDW->UnitDelay_DSTATE_e[0]; } else { /* Switch: '/Switch1' incorporates: * UnitDelay: '/UnitDelay' */ rtb_Sum6 = rtDW->UnitDelay_DSTATE_j; } /* End of If: '/If' */ /* Switch: '/Switch' incorporates: * Constant: '/Constant' * Inport: '/vdq_Target' * Product: '/Divide' * RelationalOperator: '/Equal' * UnitDelay: '/Unit Delay' */ if (rtU->vdq_Target[0] != rtDW->UnitDelay_DSTATE_h) { rtb_Switch2_pl = rtDW->Divide_o; } else { rtb_Switch2_pl = 0; } /* End of Switch: '/Switch' */ /* Sum: '/Add2' */ rtb_RelationalOperator4_b = ((rtb_Sum6 << 2) + rtb_Switch2_pl) >> 2; if (rtb_RelationalOperator4_b > 32767) { rtb_RelationalOperator4_b = 32767; } else { if (rtb_RelationalOperator4_b < -32768) { rtb_RelationalOperator4_b = -32768; } } /* Switch: '/Switch2' incorporates: * MinMax: '/Max' * MinMax: '/Max1' * RelationalOperator: '/LowerRelop1' * RelationalOperator: '/UpperRelop' * Sum: '/Add2' * Switch: '/Switch' */ if ((int16_T)rtb_RelationalOperator4_b > rtDW->Max_l) { rtb_Add2_lk = rtDW->Max_l; } else if ((int16_T)rtb_RelationalOperator4_b < rtDW->Max1_j) { /* Switch: '/Switch' incorporates: * MinMax: '/Max1' * Switch: '/Switch2' */ rtb_Add2_lk = rtDW->Max1_j; } else { rtb_Add2_lk = (int16_T)rtb_RelationalOperator4_b; } /* End of Switch: '/Switch2' */ /* RelationalOperator: '/Relational Operator' incorporates: * Inport: '/vdq_Target' * UnitDelay: '/UnitDelay' */ rtb_LogicalOperator4_f = (rtU->vdq_Target[1] != rtDW->UnitDelay_DSTATE_n); /* If: '/If' incorporates: * Constant: '/Constant5' * Inport: '/vdq_Target' * UnitDelay: '/Unit Delay' */ if (rtb_LogicalOperator4_f) { /* Outputs for IfAction SubSystem: '/RateInit' incorporates: * ActionPort: '/Action Port' */ RateInit_a(rtDW->UnitDelay_DSTATE_e[1], rtU->vdq_Target[1], rtP.dz_OpenStepVol, &rtDW->Divide, &rtDW->Max, &rtDW->Max1); /* End of Outputs for SubSystem: '/RateInit' */ /* Switch: '/Switch1' incorporates: * Constant: '/Constant5' * Inport: '/vdq_Target' * UnitDelay: '/Unit Delay' */ rtb_Sum6 = rtDW->UnitDelay_DSTATE_e[1]; } else { /* Switch: '/Switch1' incorporates: * UnitDelay: '/UnitDelay' */ rtb_Sum6 = rtDW->UnitDelay_DSTATE_ox; } /* End of If: '/If' */ /* Switch: '/Switch' incorporates: * Constant: '/Constant' * Inport: '/vdq_Target' * Product: '/Divide' * RelationalOperator: '/Equal' * UnitDelay: '/Unit Delay' */ if (rtU->vdq_Target[1] != rtDW->UnitDelay_DSTATE_gt) { rtb_Switch2_pl = rtDW->Divide; } else { rtb_Switch2_pl = 0; } /* End of Switch: '/Switch' */ /* Sum: '/Add2' */ rtb_Divide_e_idx_1 = ((rtb_Sum6 << 2) + rtb_Switch2_pl) >> 2; if (rtb_Divide_e_idx_1 > 32767) { rtb_Divide_e_idx_1 = 32767; } else { if (rtb_Divide_e_idx_1 < -32768) { rtb_Divide_e_idx_1 = -32768; } } /* Switch: '/Switch2' incorporates: * MinMax: '/Max' * MinMax: '/Max1' * RelationalOperator: '/LowerRelop1' * RelationalOperator: '/UpperRelop' * Sum: '/Add2' * Switch: '/Switch' */ if ((int16_T)rtb_Divide_e_idx_1 > rtDW->Max) { rtb_Switch2_pl = rtDW->Max; } else if ((int16_T)rtb_Divide_e_idx_1 < rtDW->Max1) { /* Switch: '/Switch' incorporates: * MinMax: '/Max1' * Switch: '/Switch2' */ rtb_Switch2_pl = rtDW->Max1; } else { rtb_Switch2_pl = (int16_T)rtb_Divide_e_idx_1; } /* End of Switch: '/Switch2' */ /* Switch: '/Switch' */ if (rtb_LogicalOperator1_g) { /* Switch: '/Switch' */ rtDW->Switch[0] = rtb_Add2_lk; rtDW->Switch[1] = rtb_Switch2_pl; } else { /* Switch: '/Switch' incorporates: * Constant: '/Constant2' */ rtDW->Switch[0] = 0; rtDW->Switch[1] = 0; } /* End of Switch: '/Switch' */ /* Update for UnitDelay: '/UnitDelay' incorporates: * Inport: '/vdq_Target' */ rtDW->UnitDelay_DSTATE_lz = rtU->vdq_Target[0]; /* Switch: '/Switch2' */ if (rtb_UnitDelay_c) { /* Update for UnitDelay: '/UnitDelay' incorporates: * UnitDelay: '/Unit Delay' */ rtDW->UnitDelay_DSTATE_j = rtDW->UnitDelay_DSTATE_e[0]; } else { /* Update for UnitDelay: '/UnitDelay' incorporates: * Sum: '/Add2' */ rtDW->UnitDelay_DSTATE_j = (int16_T)rtb_RelationalOperator4_b; } /* End of Switch: '/Switch2' */ /* Update for UnitDelay: '/Unit Delay' incorporates: * Switch: '/Switch2' */ rtDW->UnitDelay_DSTATE_h = rtb_Add2_lk; /* Update for UnitDelay: '/UnitDelay' incorporates: * Inport: '/vdq_Target' */ rtDW->UnitDelay_DSTATE_n = rtU->vdq_Target[1]; /* Switch: '/Switch2' */ if (rtb_LogicalOperator4_f) { /* Update for UnitDelay: '/UnitDelay' incorporates: * UnitDelay: '/Unit Delay' */ rtDW->UnitDelay_DSTATE_ox = rtDW->UnitDelay_DSTATE_e[1]; } else { /* Update for UnitDelay: '/UnitDelay' incorporates: * Sum: '/Add2' */ rtDW->UnitDelay_DSTATE_ox = (int16_T)rtb_Divide_e_idx_1; } /* End of Switch: '/Switch2' */ /* Update for UnitDelay: '/Unit Delay' incorporates: * Switch: '/Switch2' */ rtDW->UnitDelay_DSTATE_gt = rtb_Switch2_pl; /* End of Outputs for SubSystem: '/open_mode' */ } /* End of If: '/If' */ /* If: '/If' incorporates: * Constant: '/Constant1' * Constant: '/Constant' * Logic: '/Logical Operator' * Math: '/Rem' * RelationalOperator: '/Equal' * Sum: '/Sum3' * Switch: '/Switch2' */ rtb_Sum2 = -1; if ((rtb_dz_cntTrnsDet != 0) && (rtb_Merge % 40U == 0U)) { rtb_Sum2 = 0; /* Outputs for IfAction SubSystem: '/Do_Calc' incorporates: * ActionPort: '/Action Port' */ /* Outputs for Atomic SubSystem: '/Low_Pass_Filter' */ Low_Pass_Filter(rtb_UnitDelay1_ko, rtP.f_lpf_vdq, rtb_TmpSignalConversionAtLow_Pass_FilterInport1, &rtDW->Low_Pass_Filter_e); /* End of Outputs for SubSystem: '/Low_Pass_Filter' */ /* DataTypeConversion: '/Data Type Conversion' incorporates: * Constant: '/Constant' * RelationalOperator: '/Equal' * UnitDelay: '/Unit Delay' */ rtb_DataTypeConversion_e = (uint8_T)(rtDW->UnitDelay_DSTATE_lv != rtb_dz_cntTrnsDet); /* If: '/If' incorporates: * Constant: '/Constant1' * Constant: '/Constant11' * Constant: '/Constant4' * Gain: '/Gain' * Sum: '/Sum1' * Switch: '/Switch2' * Switch: '/Switch2' * UnitDelay: '/Unit Delay1' */ if (rtb_dz_cntTrnsDet == 1) { rtDW->If_ActiveSubsystem_k = 0; /* Outputs for IfAction SubSystem: '/speed_mode' incorporates: * ActionPort: '/Action Port' */ /* MinMax: '/Min' incorporates: * Constant: '/Constant6' * UnitDelay: '/Unit Delay' */ if (rtP.i_dqMax < rtDW->UnitDelay_DSTATE_di) { rtb_Switch2_pl = rtP.i_dqMax; } else { rtb_Switch2_pl = rtDW->UnitDelay_DSTATE_di; } /* End of MinMax: '/Min' */ /* MinMax: '/Min1' incorporates: * Constant: '/Constant6' * Gain: '/Gain' * Gain: '/Gain1' * UnitDelay: '/Unit Delay' */ if ((int16_T)-rtDW->UnitDelay_DSTATE_di > (int16_T)-rtP.i_dqMax) { rtb_Gain_a = (int16_T)-rtDW->UnitDelay_DSTATE_di; } else { rtb_Gain_a = (int16_T)-rtP.i_dqMax; } /* End of MinMax: '/Min1' */ /* Outputs for Atomic SubSystem: '/PI_Speed' */ rtb_Gain_h = PI_backCalc_fixdt(rtb_Switch2_au - rtb_Switch3, rtP.cf_nKp, rtP.cf_nKi, rtP.cf_nKb, rtb_Switch2_pl, rtb_Gain_a, (int16_T) ((rtP.cf_lastIqGain * rtDW->UnitDelay1_DSTATE_jp) >> 15), rtb_DataTypeConversion_e, &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 = (int16_T)(rtb_Gain_h >> 9); /* End of Outputs for SubSystem: '/speed_mode' */ } else { rtDW->If_ActiveSubsystem_k = 1; /* Outputs for IfAction SubSystem: '/torque_mode' incorporates: * ActionPort: '/Action Port' */ /* Delay: '/Delay' incorporates: * Switch: '/Switch2' */ if (rtDW->icLoad_i != 0) { rtDW->Delay_DSTATE = rtb_Divide1_oy; } /* Switch: '/Switch2' incorporates: * Delay: '/Delay' * RelationalOperator: '/LowerRelop1' * Switch: '/Switch2' */ if (rtb_Divide1_oy > rtDW->Delay_DSTATE) { /* Merge: '/Merge' */ rtDW->Merge = rtDW->Delay_DSTATE; } else { /* Gain: '/Gain' */ rtb_Gain_h = -32768 * rtDW->Delay_DSTATE; /* Switch: '/Switch' incorporates: * Gain: '/Gain' * RelationalOperator: '/UpperRelop' */ if ((rtb_Divide1_oy << 15) < rtb_Gain_h) { /* Merge: '/Merge' */ rtDW->Merge = (int16_T)(rtb_Gain_h >> 15); } else { /* Merge: '/Merge' */ rtDW->Merge = rtb_Divide1_oy; } /* End of Switch: '/Switch' */ } /* End of Switch: '/Switch2' */ /* End of Outputs for SubSystem: '/torque_mode' */ } /* End of If: '/If' */ /* Outputs for IfAction SubSystem: '/MTPA_Calc' incorporates: * ActionPort: '/Action Port' */ /* If: '/If' incorporates: * Constant: '/Constant3' * Merge: '/Merge' * Switch: '/Switch' */ rtDW->Merge_i[0] = 0; rtDW->Merge_i[1] = rtDW->Merge; /* End of Outputs for SubSystem: '/MTPA_Calc' */ /* Sum: '/Sum' incorporates: * Constant: '/Constant3' * UnitDelay: '/Unit Delay1' */ rtb_RelationalOperator4_b = (rtP.V_modulation - rtDW->UnitDelay1_DSTATE_pl) >> 1; if (rtb_RelationalOperator4_b < -32768) { rtb_RelationalOperator4_b = -32768; } /* Delay: '/Resettable Delay' incorporates: * Constant: '/Constant4' * DataTypeConversion: '/Data Type Conversion2' */ if ((rtb_DataTypeConversion_e > 0) && (rtPrevZCX->ResettableDelay_Reset_ZCE_f != 1)) { rtDW->icLoad = 1U; } rtPrevZCX->ResettableDelay_Reset_ZCE_f = (ZCSigState) (rtb_DataTypeConversion_e > 0); if (rtDW->icLoad != 0) { rtDW->ResettableDelay_DSTATE = 0; } /* Signum: '/Sign' incorporates: * Sum: '/Sum' */ if ((int16_T)rtb_RelationalOperator4_b < 0) { rtb_Switch2_pl = -1; } else { rtb_Switch2_pl = (int16_T)((int16_T)rtb_RelationalOperator4_b > 0); } /* End of Signum: '/Sign' */ /* Sum: '/Sum1' incorporates: * Constant: '/Constant2' * Constant: '/Constant5' * Delay: '/Resettable Delay' * Product: '/Divide' * Product: '/Divide1' * Sum: '/Add' * UnitDelay: '/Unit Delay' */ rtb_Gain_h = (((((rtP.cf_Fw_Kb * rtDW->UnitDelay_DSTATE_l) << 6) >> 12) + rtb_Switch2_pl * rtP.cf_Fw_Ki) >> 4) + rtDW->ResettableDelay_DSTATE; /* Switch: '/Switch2' incorporates: * Constant: '/Constant6' * RelationalOperator: '/LowerRelop1' * Sum: '/Sum1' */ if (rtb_Gain_h > 0) { rtb_Divide_e_idx_2 = 0; } else { /* Gain: '/Gain1' */ rtb_Switch2_au = -32768 * rtDW->Merge_i[1]; /* MinMax: '/Max' incorporates: * Constant: '/Constant6' * Gain: '/Gain1' */ rtb_RelationalOperator4_b = rtP.id_fieldWeakMax << 15; if (rtb_Switch2_au <= rtb_RelationalOperator4_b) { rtb_Switch2_au = rtb_RelationalOperator4_b; } /* End of MinMax: '/Max' */ /* Switch: '/Switch' incorporates: * MinMax: '/Max' * RelationalOperator: '/UpperRelop' * Switch: '/Switch2' */ if (((int64_T)rtb_Gain_h << 14) < rtb_Switch2_au) { rtb_Divide_e_idx_2 = rtb_Switch2_au >> 14; } else { rtb_Divide_e_idx_2 = rtb_Gain_h; } /* End of Switch: '/Switch' */ } /* End of Switch: '/Switch2' */ /* Sum: '/Sum1' incorporates: * Product: '/Divide1' * Switch: '/Switch2' */ rtb_Gain_a = (int16_T)((rtb_Divide_e_idx_2 >> 1) + rtDW->Merge_i[0]); /* Sum: '/Sum of Elements' */ rtb_Switch2_au = 1; rtb_Gain_ib = 0; /* Math: '/Math Function2' incorporates: * Math: '/Math Function2' * Product: '/Divide1' */ rtb_RelationalOperator4_b = rtb_Gain_a * rtb_Gain_a; /* Sqrt: '/Sqrt' incorporates: * Math: '/Math Function1' * Math: '/Math Function2' * Merge: '/Merge' * Sum: '/Sum of Elements' * Sum: '/Sum2' */ rtb_Switch2_pl = rt_sqrt_Us32En6_Ys16En5_Is64En10_f_s((((rtDW->Merge_i[0] * rtDW->Merge_i[0] + rtDW->Merge_i[1] * rtDW->Merge_i[1]) >> 1) - (rtb_RelationalOperator4_b >> 1)) >> 3); /* Sum: '/Add' incorporates: * Inport: '/iDC_Limit' * Inport: '/vDC' * Math: '/Math Function2' * Product: '/Divide' * Product: '/Divide' * Switch: '/Switch' */ rtb_MathFunction2_n = rtU->iDC_Limit * rtU->vDC - rtb_Gain_a * rtb_TmpSignalConversionAtLow_Pass_FilterInport1[0]; /* Product: '/Divide3' incorporates: * Constant: '/Constant5' * Gain: '/Gain' * Math: '/Math Function2' */ rtb_Divide_e_idx_1 = rtb_MathFunction2_n / (rtP.i_dqMax << 1); if (rtb_Divide_e_idx_1 > 32767) { rtb_Divide_e_idx_1 = 32767; } else { if (rtb_Divide_e_idx_1 < -32768) { rtb_Divide_e_idx_1 = -32768; } } /* MinMax: '/Min2' incorporates: * Product: '/Divide3' */ if (rtb_TmpSignalConversionAtLow_Pass_FilterInport1[1] > (int16_T) rtb_Divide_e_idx_1) { rtb_Add2_lk = rtb_TmpSignalConversionAtLow_Pass_FilterInport1[1]; } else { rtb_Add2_lk = (int16_T)rtb_Divide_e_idx_1; } /* End of MinMax: '/Min2' */ /* Product: '/Divide1' incorporates: * Math: '/Math Function2' */ rtb_Divide_e_idx_1 = rtb_MathFunction2_n / rtb_Add2_lk; if (rtb_Divide_e_idx_1 > 32767) { rtb_Divide_e_idx_1 = 32767; } else { if (rtb_Divide_e_idx_1 < -32768) { rtb_Divide_e_idx_1 = -32768; } } /* Signum: '/Sign' incorporates: * Sqrt: '/Sqrt' */ if (rtb_Switch2_pl < 0) { rtb_Divide1_oy = -1; } else { rtb_Divide1_oy = (int16_T)(rtb_Switch2_pl > 0); } /* End of Signum: '/Sign' */ /* Product: '/Divide2' incorporates: * Product: '/Divide1' */ rtb_Add2_lk = (int16_T)((int16_T)rtb_Divide_e_idx_1 * rtb_Divide1_oy); /* Switch: '/Switch2' incorporates: * Constant: '/Constant2' * Constant: '/Constant3' * Gain: '/Gain1' * Product: '/Divide2' * RelationalOperator: '/LowerRelop1' * RelationalOperator: '/UpperRelop' * Switch: '/Switch' */ if (rtb_Add2_lk > rtP.i_dqMax) { rtb_Add2_lk = rtP.i_dqMax; } else { if (rtb_Add2_lk < (int16_T)-rtP.i_dqMax) { /* Switch: '/Switch' incorporates: * Constant: '/Constant2' * Gain: '/Gain1' * Switch: '/Switch2' */ rtb_Add2_lk = (int16_T)-rtP.i_dqMax; } } /* End of Switch: '/Switch2' */ /* Switch: '/Switch' incorporates: * MinMax: '/Min1' * Sqrt: '/Sqrt' * Switch: '/Switch2' */ if (rtb_Divide1_oy > 0) { /* MinMax: '/Min' incorporates: * Sqrt: '/Sqrt' * Switch: '/Switch2' */ if (rtb_Add2_lk < rtb_Switch2_pl) { /* Switch: '/Switch' */ rtDW->Switch_p = rtb_Add2_lk; } else { /* Switch: '/Switch' */ rtDW->Switch_p = rtb_Switch2_pl; } /* End of MinMax: '/Min' */ } else if (rtb_Add2_lk > rtb_Switch2_pl) { /* MinMax: '/Min1' incorporates: * Switch: '/Switch' * Switch: '/Switch2' */ rtDW->Switch_p = rtb_Add2_lk; } else { /* Switch: '/Switch' incorporates: * Sqrt: '/Sqrt' */ rtDW->Switch_p = rtb_Switch2_pl; } /* End of Switch: '/Switch' */ /* Switch: '/Switch2' incorporates: * Constant: '/Constant1' * Constant: '/Constant2' * Gain: '/Gain1' * RelationalOperator: '/LowerRelop1' * RelationalOperator: '/UpperRelop' * Switch: '/Switch' * Switch: '/Switch' */ if (rtb_Gain_a > rtP.i_dqMax) { /* Switch: '/Switch2' */ rtDW->Switch2 = rtP.i_dqMax; } else if (rtb_Gain_a < (int16_T)-rtP.i_dqMax) { /* Switch: '/Switch' incorporates: * Constant: '/Constant2' * Gain: '/Gain1' * Switch: '/Switch2' */ rtDW->Switch2 = (int16_T)-rtP.i_dqMax; } else { /* Switch: '/Switch2' */ rtDW->Switch2 = rtb_Gain_a; } /* End of Switch: '/Switch2' */ /* Sqrt: '/Sqrt1' incorporates: * Math: '/Math Function3' * Product: '/Divide1' * Sum: '/Add' */ rtb_Gain_a = rt_sqrt_Us32En10_Ys16En5_Is32En10_s_s(rtb_RelationalOperator4_b + (int16_T)rtb_Divide_e_idx_1 * (int16_T)rtb_Divide_e_idx_1); /* Sum: '/Sum' incorporates: * Sum: '/Sum1' * Switch: '/Switch2' */ rtb_MathFunction2_n = rtb_Divide_e_idx_2 - rtb_Gain_h; /* End of Outputs for SubSystem: '/Do_Calc' */ } /* RelationalOperator: '/Relational Operator' incorporates: * Switch: '/Switch2' * UnitDelay: '/UnitDelay' */ rtb_LogicalOperator1_g = (rtDW->Switch2 != rtDW->UnitDelay_DSTATE_l5); /* Sum: '/Add' incorporates: * Product: '/Divide1' * Switch: '/Switch2' * UnitDelay: '/Unit Delay1' */ rtb_Switch2_pl = (int16_T)(rtDW->Switch2 - rtDW->UnitDelay1_DSTATE_j); /* Abs: '/Abs' incorporates: * Product: '/Divide1' */ if (rtb_Switch2_pl < 0) { rtb_Switch2_pl = (int16_T)-rtb_Switch2_pl; } /* 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_LogicalOperator1_g) { /* Outputs for IfAction SubSystem: '/RateInit' incorporates: * ActionPort: '/Action Port' */ RateInit(rtDW->UnitDelay1_DSTATE_j, rtDW->Switch2, (int16_T)((13107 * rtb_Switch2_pl) >> 13), &rtDW->Divide_d, &rtDW->Max_i, &rtDW->Max1_e); /* End of Outputs for SubSystem: '/RateInit' */ /* Switch: '/Switch1' incorporates: * Gain: '/Gain' * Product: '/Divide1' * UnitDelay: '/Unit Delay1' */ rtb_Add2_lk = rtDW->UnitDelay1_DSTATE_j; } else { /* Switch: '/Switch1' incorporates: * UnitDelay: '/UnitDelay' */ rtb_Add2_lk = rtDW->UnitDelay_DSTATE_g; } /* 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_b) { rtb_Switch2_pl = rtDW->Divide_d; } else { rtb_Switch2_pl = 0; } /* End of Switch: '/Switch' */ /* Sum: '/Add2' */ rtb_RelationalOperator4_b = ((rtb_Add2_lk << 5) + rtb_Switch2_pl) >> 5; if (rtb_RelationalOperator4_b > 32767) { rtb_RelationalOperator4_b = 32767; } else { if (rtb_RelationalOperator4_b < -32768) { rtb_RelationalOperator4_b = -32768; } } /* Switch: '/Switch2' incorporates: * MinMax: '/Max' * MinMax: '/Max1' * RelationalOperator: '/LowerRelop1' * RelationalOperator: '/UpperRelop' * Sum: '/Add2' * Switch: '/Switch' */ if ((int16_T)rtb_RelationalOperator4_b > rtDW->Max_i) { rtb_Add2_lk = rtDW->Max_i; } else if ((int16_T)rtb_RelationalOperator4_b < rtDW->Max1_e) { /* Switch: '/Switch' incorporates: * MinMax: '/Max1' * Switch: '/Switch2' */ rtb_Add2_lk = rtDW->Max1_e; } else { rtb_Add2_lk = (int16_T)rtb_RelationalOperator4_b; } /* End of Switch: '/Switch2' */ /* RelationalOperator: '/Relational Operator' incorporates: * Switch: '/Switch' * UnitDelay: '/UnitDelay' */ rtb_UnitDelay_c = (rtDW->Switch_p != rtDW->UnitDelay_DSTATE_er); /* Sum: '/Add' incorporates: * Product: '/Divide1' * Switch: '/Switch' * UnitDelay: '/Unit Delay1' */ rtb_Switch2_pl = (int16_T)(rtDW->Switch_p - rtDW->UnitDelay1_DSTATE_p); /* Abs: '/Abs' incorporates: * Product: '/Divide1' */ if (rtb_Switch2_pl < 0) { rtb_Switch2_pl = (int16_T)-rtb_Switch2_pl; } /* 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_UnitDelay_c) { /* Outputs for IfAction SubSystem: '/RateInit' incorporates: * ActionPort: '/Action Port' */ RateInit(rtDW->UnitDelay1_DSTATE_p, rtDW->Switch_p, (int16_T)((13107 * rtb_Switch2_pl) >> 13), &rtDW->Divide_g, &rtDW->Max_p, &rtDW->Max1_i); /* End of Outputs for SubSystem: '/RateInit' */ /* Switch: '/Switch1' incorporates: * Gain: '/Gain' * Product: '/Divide1' * UnitDelay: '/Unit Delay1' */ rtb_Sum6 = rtDW->UnitDelay1_DSTATE_p; } else { /* Switch: '/Switch1' incorporates: * UnitDelay: '/UnitDelay' */ rtb_Sum6 = rtDW->UnitDelay_DSTATE_o; } /* 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_p != rtDW->UnitDelay_DSTATE_d) { rtb_Switch2_pl = rtDW->Divide_g; } else { rtb_Switch2_pl = 0; } /* End of Switch: '/Switch' */ /* Sum: '/Add2' */ rtb_Divide_e_idx_1 = ((rtb_Sum6 << 5) + rtb_Switch2_pl) >> 5; if (rtb_Divide_e_idx_1 > 32767) { rtb_Divide_e_idx_1 = 32767; } else { if (rtb_Divide_e_idx_1 < -32768) { rtb_Divide_e_idx_1 = -32768; } } /* Switch: '/Switch2' incorporates: * MinMax: '/Max' * MinMax: '/Max1' * RelationalOperator: '/LowerRelop1' * RelationalOperator: '/UpperRelop' * Sum: '/Add2' * Switch: '/Switch' */ if ((int16_T)rtb_Divide_e_idx_1 > rtDW->Max_p) { rtb_Divide1_oy = rtDW->Max_p; } else if ((int16_T)rtb_Divide_e_idx_1 < rtDW->Max1_i) { /* Switch: '/Switch' incorporates: * MinMax: '/Max1' * Switch: '/Switch2' */ rtb_Divide1_oy = rtDW->Max1_i; } else { rtb_Divide1_oy = (int16_T)rtb_Divide_e_idx_1; } /* End of Switch: '/Switch2' */ /* DataTypeConversion: '/Data Type Conversion' incorporates: * Logic: '/Logical Operator' * RelationalOperator: '/Equal' * UnitDelay: '/Unit Delay' */ rtb_DataTypeConversion_e = (uint8_T)((rtb_dz_cntTrnsDet != 0) && (rtDW->UnitDelay_DSTATE_h3 != rtb_dz_cntTrnsDet)); /* If: '/If1' incorporates: * Constant: '/Constant1' * Constant: '/Constant3' * Constant: '/Constant4' * Constant: '/Constant6' * Constant: '/Constant7' * Constant: '/Constant8' * Gain: '/Gain1' * Gain: '/Gain2' * Inport: '/In1' * Merge: '/Merge' * Outport: '/f_Idq' * Product: '/Divide' * Sum: '/Sum' * Sum: '/Sum1' * Switch: '/Switch2' * Switch: '/Switch2' * Switch: '/Switch' * UnitDelay: '/UnitDelay1' */ if (rtb_dz_cntTrnsDet != 0) { /* Outputs for IfAction SubSystem: '/CurrentLoop' incorporates: * ActionPort: '/Action Port' */ /* Product: '/Divide' incorporates: * Constant: '/Constant2' * Inport: '/vDC' */ rtb_Switch2_pl = (int16_T)((rtU->vDC * rtP.V_modulation) >> 14); /* Outputs for Atomic SubSystem: '/PI_backCalc_fixdt' */ rtb_Switch2_au = PI_backCalc_fixdt_i((int16_T)(rtb_Add2_lk - rtY->f_Idq[0]), rtP.cf_idKp, rtP.cf_idKi, rtP.cf_idKb, rtb_Switch2_pl, (int16_T) -rtb_Switch2_pl, rtDW->UnitDelay1_DSTATE_o[0], rtb_DataTypeConversion_e, &rtDW->PI_backCalc_fixdt_ig, &rtPrevZCX->PI_backCalc_fixdt_ig); /* End of Outputs for SubSystem: '/PI_backCalc_fixdt' */ /* Outputs for Atomic SubSystem: '/PI_backCalc_fixdt1' */ rtb_Gain_ib = PI_backCalc_fixdt_i((int16_T)(rtb_Divide1_oy - rtY->f_Idq[1]), rtP.cf_iqKp, rtP.cf_iqKi, rtP.cf_iqKb, rtb_Switch2_pl, (int16_T) -rtb_Switch2_pl, rtDW->UnitDelay1_DSTATE_o[1], rtb_DataTypeConversion_e, &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_TmpSignalConversionAtLow_Pass_FilterInport1[0] = (int16_T) (rtb_Switch2_au >> 9); rtb_TmpSignalConversionAtLow_Pass_FilterInport1[1] = (int16_T)(rtb_Gain_ib >> 9); /* End of Outputs for SubSystem: '/CurrentLoop' */ } else { /* Outputs for IfAction SubSystem: '/OpenLoop' incorporates: * ActionPort: '/Action Port' */ rtb_TmpSignalConversionAtLow_Pass_FilterInport1[0] = rtDW->Switch[0]; rtb_TmpSignalConversionAtLow_Pass_FilterInport1[1] = rtDW->Switch[1]; /* End of Outputs for SubSystem: '/OpenLoop' */ } /* End of If: '/If1' */ /* Product: '/Divide2' incorporates: * Constant: '/Constant' * Inport: '/vDC' * Product: '/Divide1' */ rtb_Switch2_pl = (int16_T)div_nde_s32_floor(rtU->vDC << 14, rtP.V_modulation); /* Sum: '/Sum of Elements' incorporates: * Math: '/Math Function' * Merge: '/Merge' */ tmp_2 = (int64_T)((rtb_TmpSignalConversionAtLow_Pass_FilterInport1[0] * rtb_TmpSignalConversionAtLow_Pass_FilterInport1[0]) >> 4) + ((rtb_TmpSignalConversionAtLow_Pass_FilterInport1[1] * rtb_TmpSignalConversionAtLow_Pass_FilterInport1[1]) >> 4); if (tmp_2 > 2147483647LL) { tmp_2 = 2147483647LL; } else { if (tmp_2 < -2147483648LL) { tmp_2 = -2147483648LL; } } /* Product: '/Divide' incorporates: * Math: '/Math Function1' * Product: '/Divide1' * Sum: '/Sum of Elements' */ tmp_2 = ((int64_T)(int32_T)tmp_2 << 14) / ((rtb_Switch2_pl * rtb_Switch2_pl) >> 4); if (tmp_2 < 0LL) { tmp_2 = 0LL; } else { if (tmp_2 > 65535LL) { tmp_2 = 65535LL; } } /* Sqrt: '/Sqrt' incorporates: * Product: '/Divide' */ rtb_Sum1_p = rt_sqrt_Uu16En14_Yu16En14_Iu32En28_s_s((uint16_T)tmp_2); /* Switch: '/Switch' incorporates: * Merge: '/Merge' * Sqrt: '/Sqrt' */ if (rtb_Sum1_p > 16384) { /* Switch: '/Switch' incorporates: * Merge: '/Merge' * MultiPortSwitch: '/Multiport Switch' * Product: '/Divide1' */ rtb_UnitDelay1_ko[0] = (int16_T) ((rtb_TmpSignalConversionAtLow_Pass_FilterInport1[0] << 14) / rtb_Sum1_p); rtb_UnitDelay1_ko[1] = (int16_T) ((rtb_TmpSignalConversionAtLow_Pass_FilterInport1[1] << 14) / rtb_Sum1_p); } else { rtb_UnitDelay1_ko[0] = rtb_TmpSignalConversionAtLow_Pass_FilterInport1[0]; rtb_UnitDelay1_ko[1] = rtb_TmpSignalConversionAtLow_Pass_FilterInport1[1]; } /* End of Switch: '/Switch' */ /* Sum: '/Sum1' incorporates: * Interpolation_n-D: '/r_cos_M1' * Interpolation_n-D: '/r_sin_M1' * Product: '/Divide2' * Product: '/Divide3' */ rtb_Divide_e_idx_2 = (int16_T)((rtb_UnitDelay1_ko[0] * rtConstP.pooled12[rtb_Divide_d]) >> 14) + (int16_T)((rtb_UnitDelay1_ko[1] * rtConstP.pooled13[rtb_Divide_d]) >> 14); if (rtb_Divide_e_idx_2 > 32767) { rtb_Divide_e_idx_2 = 32767; } else { if (rtb_Divide_e_idx_2 < -32768) { rtb_Divide_e_idx_2 = -32768; } } /* Sum: '/Sum6' incorporates: * Interpolation_n-D: '/r_cos_M1' * Interpolation_n-D: '/r_sin_M1' * Product: '/Divide1' * Product: '/Divide4' */ tmp = (int16_T)((rtb_UnitDelay1_ko[0] * rtConstP.pooled13[rtb_Divide_d]) >> 14) - (int16_T)((rtb_UnitDelay1_ko[1] * rtConstP.pooled12[rtb_Divide_d]) >> 14); if (tmp > 32767) { tmp = 32767; } else { if (tmp < -32768) { tmp = -32768; } } /* Product: '/Divide7' incorporates: * Constant: '/Constant3' * Sum: '/Sum1' */ rtb_Switch2_pl = (int16_T)((2365 * (int16_T)rtb_Divide_e_idx_2) >> 11); /* MATLAB Function: '/sector_select' incorporates: * Product: '/Divide7' * Sum: '/Sum1' * Sum: '/Sum6' */ if ((int16_T)rtb_Divide_e_idx_2 >= 0) { if ((int16_T)tmp >= 0) { if (rtb_Switch2_pl > ((int16_T)tmp << 1)) { /* DataTypeConversion: '/Data Type Conversion' */ rtb_DataTypeConversion_e = 2U; } else { /* DataTypeConversion: '/Data Type Conversion' */ rtb_DataTypeConversion_e = 1U; } } else { rtb_Gain_b = -rtb_Switch2_pl; if (-rtb_Switch2_pl > 32767) { rtb_Gain_b = 32767; } if (rtb_Gain_b > ((int16_T)tmp << 1)) { /* DataTypeConversion: '/Data Type Conversion' */ rtb_DataTypeConversion_e = 3U; } else { /* DataTypeConversion: '/Data Type Conversion' */ rtb_DataTypeConversion_e = 2U; } } } else if ((int16_T)tmp >= 0) { rtb_Gain_b = -rtb_Switch2_pl; if (-rtb_Switch2_pl > 32767) { rtb_Gain_b = 32767; } if (rtb_Gain_b > ((int16_T)tmp << 1)) { /* DataTypeConversion: '/Data Type Conversion' */ rtb_DataTypeConversion_e = 5U; } else { /* DataTypeConversion: '/Data Type Conversion' */ rtb_DataTypeConversion_e = 6U; } } else if (rtb_Switch2_pl > ((int16_T)tmp << 1)) { /* DataTypeConversion: '/Data Type Conversion' */ rtb_DataTypeConversion_e = 4U; } else { /* DataTypeConversion: '/Data Type Conversion' */ rtb_DataTypeConversion_e = 5U; } /* End of MATLAB Function: '/sector_select' */ /* Gain: '/Gain' incorporates: * Inport: '/vDC' */ rtb_Gain_b = 18919 * rtU->vDC; /* Product: '/Divide' incorporates: * Gain: '/Gain' * Sum: '/Sum6' */ rtb_Sum6 = (int16_T)(((int64_T)(int16_T)tmp << 26) / rtb_Gain_b); /* Product: '/Divide1' incorporates: * Gain: '/Gain' * Sum: '/Sum1' */ rtb_Sum1_ak = (int16_T)(((int64_T)(int16_T)rtb_Divide_e_idx_2 << 26) / rtb_Gain_b); /* MultiPortSwitch: '/Multiport Switch' incorporates: * DataTypeConversion: '/Data Type Conversion1' */ switch (rtb_DataTypeConversion_e) { case 1: /* Product: '/Divide3' incorporates: * Constant: '/Constant1' * DataTypeConversion: '/Data Type Conversion2' * Product: '/Divide1' * Product: '/Divide2' */ rtb_Divide3_k = (int16_T)(((int16_T)((rtb_Sum1_ak * 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_ak = (int16_T)(((int16_T)(rtb_Sum6 - ((rtb_Sum1_ak * 9459) >> 14)) * (int16_T)rtP.i_pwm_count) >> 12); /* Product: '/Divide4' incorporates: * Constant: '/Constant1' * DataTypeConversion: '/Data Type Conversion2' * Sum: '/Add1' * Sum: '/Add2' */ rtb_Switch2_pl = (int16_T)((int16_T)((int16_T)((int16_T)rtP.i_pwm_count - rtb_Sum1_ak) - rtb_Divide3_k) >> 1); /* Sum: '/Add3' */ rtb_Sum6 = (int16_T)(rtb_Switch2_pl + rtb_Divide3_k); /* Outport: '/n_Duty' incorporates: * Sum: '/Add4' */ rtY->n_Duty[0] = (int16_T)(rtb_Sum6 + rtb_Sum1_ak); rtY->n_Duty[1] = rtb_Sum6; rtY->n_Duty[2] = rtb_Switch2_pl; 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_ak * 9459) >> 14) + rtb_Sum6) * (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_ak = (int16_T)(((int16_T)(((rtb_Sum1_ak * 9459) >> 14) - rtb_Sum6) * (int16_T)rtP.i_pwm_count) >> 12); /* Product: '/Divide4' incorporates: * Constant: '/Constant1' * DataTypeConversion: '/Data Type Conversion2' * Sum: '/Add1' * Sum: '/Add2' */ rtb_Switch2_pl = (int16_T)((int16_T)((int16_T)((int16_T)rtP.i_pwm_count - rtb_Sum1_ak) - rtb_Divide3_k) >> 1); /* Sum: '/Add3' */ rtb_Sum6 = (int16_T)(rtb_Switch2_pl + rtb_Divide3_k); /* Outport: '/n_Duty' incorporates: * Sum: '/Add4' */ rtY->n_Duty[0] = rtb_Sum6; rtY->n_Duty[1] = (int16_T)(rtb_Sum6 + rtb_Sum1_ak); rtY->n_Duty[2] = rtb_Switch2_pl; break; case 3: /* Product: '/Divide1' incorporates: * Constant: '/Constant1' * Constant: '/Constant' * DataTypeConversion: '/Data Type Conversion2' * Product: '/Divide' * Product: '/Divide1' * Product: '/Divide' * Sum: '/Add' */ rtb_Sum6 = (int16_T)(((int16_T)(-rtb_Sum6 - ((rtb_Sum1_ak * 9459) >> 14)) * (int16_T)rtP.i_pwm_count) >> 12); /* Product: '/Divide3' incorporates: * Constant: '/Constant1' * DataTypeConversion: '/Data Type Conversion2' * Product: '/Divide1' * Product: '/Divide2' */ rtb_Sum1_ak = (int16_T)(((int16_T)((rtb_Sum1_ak * 9459) >> 13) * (int16_T) rtP.i_pwm_count) >> 12); /* Product: '/Divide4' incorporates: * Constant: '/Constant1' * DataTypeConversion: '/Data Type Conversion2' * Sum: '/Add1' * Sum: '/Add2' */ rtb_Switch2_pl = (int16_T)((int16_T)((int16_T)((int16_T)rtP.i_pwm_count - rtb_Sum1_ak) - rtb_Sum6) >> 1); /* Sum: '/Add3' */ rtb_Sum6 += rtb_Switch2_pl; /* Outport: '/n_Duty' incorporates: * Sum: '/Add4' */ rtY->n_Duty[0] = rtb_Switch2_pl; rtY->n_Duty[1] = (int16_T)(rtb_Sum6 + rtb_Sum1_ak); rtY->n_Duty[2] = rtb_Sum6; break; case 4: /* Product: '/Divide1' incorporates: * Constant: '/Constant1' * Constant: '/Constant' * DataTypeConversion: '/Data Type Conversion2' * Product: '/Divide' * Product: '/Divide1' * Product: '/Divide' * Sum: '/Add' */ rtb_Sum6 = (int16_T)(((int16_T)(((rtb_Sum1_ak * 9459) >> 14) - rtb_Sum6) * (int16_T)rtP.i_pwm_count) >> 12); /* Product: '/Divide3' incorporates: * Constant: '/Constant1' * DataTypeConversion: '/Data Type Conversion2' * Product: '/Divide1' * Product: '/Divide2' * Sum: '/Add5' */ rtb_Sum1_ak = (int16_T)(((int16_T)(-((int16_T)((rtb_Sum1_ak * 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_Switch2_pl = (int16_T)((int16_T)((int16_T)((int16_T)rtP.i_pwm_count - rtb_Sum1_ak) - rtb_Sum6) >> 1); /* Sum: '/Add3' */ rtb_Sum6 += rtb_Switch2_pl; /* Outport: '/n_Duty' incorporates: * Sum: '/Add4' */ rtY->n_Duty[0] = rtb_Switch2_pl; rtY->n_Duty[1] = rtb_Sum6; rtY->n_Duty[2] = (int16_T)(rtb_Sum6 + rtb_Sum1_ak); 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 - ((rtb_Sum1_ak * 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_ak = (int16_T)(((int16_T)(-rtb_Sum6 - ((rtb_Sum1_ak * 9459) >> 14)) * (int16_T)rtP.i_pwm_count) >> 12); /* Product: '/Divide4' incorporates: * Constant: '/Constant1' * DataTypeConversion: '/Data Type Conversion2' * Sum: '/Add1' * Sum: '/Add2' */ rtb_Switch2_pl = (int16_T)((int16_T)((int16_T)((int16_T)rtP.i_pwm_count - rtb_Sum1_ak) - rtb_Divide3_k) >> 1); /* Sum: '/Add3' */ rtb_Sum6 = (int16_T)(rtb_Switch2_pl + rtb_Divide3_k); /* Outport: '/n_Duty' incorporates: * Sum: '/Add4' */ rtY->n_Duty[0] = rtb_Sum6; rtY->n_Duty[1] = rtb_Switch2_pl; rtY->n_Duty[2] = (int16_T)(rtb_Sum6 + rtb_Sum1_ak); 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_ak * 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_ak = (int16_T)(((int16_T)(((rtb_Sum1_ak * 9459) >> 14) + rtb_Sum6) * (int16_T)rtP.i_pwm_count) >> 12); /* Product: '/Divide4' incorporates: * Constant: '/Constant1' * DataTypeConversion: '/Data Type Conversion2' * Sum: '/Add1' * Sum: '/Add2' */ rtb_Switch2_pl = (int16_T)((int16_T)((int16_T)((int16_T)rtP.i_pwm_count - rtb_Sum1_ak) - rtb_Divide3_k) >> 1); /* Sum: '/Add3' */ rtb_Sum6 = (int16_T)(rtb_Switch2_pl + rtb_Divide3_k); /* Outport: '/n_Duty' incorporates: * Sum: '/Add4' */ rtY->n_Duty[0] = (int16_T)(rtb_Sum6 + rtb_Sum1_ak); rtY->n_Duty[1] = rtb_Switch2_pl; rtY->n_Duty[2] = rtb_Sum6; break; } /* End of MultiPortSwitch: '/Multiport Switch' */ /* Switch: '/Switch2' */ if (rtb_UnitDelay_c) { /* Update for UnitDelay: '/UnitDelay' incorporates: * UnitDelay: '/Unit Delay1' */ rtDW->UnitDelay_DSTATE_o = rtDW->UnitDelay1_DSTATE_p; } else { /* Update for UnitDelay: '/UnitDelay' incorporates: * Sum: '/Add2' */ rtDW->UnitDelay_DSTATE_o = (int16_T)rtb_Divide_e_idx_1; } /* End of Switch: '/Switch2' */ /* Switch: '/Switch2' */ if (rtb_LogicalOperator1_g) { /* Update for UnitDelay: '/UnitDelay' incorporates: * UnitDelay: '/Unit Delay1' */ rtDW->UnitDelay_DSTATE_g = rtDW->UnitDelay1_DSTATE_j; } else { /* Update for UnitDelay: '/UnitDelay' incorporates: * Sum: '/Add2' */ rtDW->UnitDelay_DSTATE_g = (int16_T)rtb_RelationalOperator4_b; } /* End of Switch: '/Switch2' */ /* Switch: '/Switch1' incorporates: * RelationalOperator: '/Relational Operator' * UnitDelay: '/UnitDelay' */ if (rtb_RelationalOperator != rtDW->UnitDelay_DSTATE_f) { rtb_UnitDelay_n = rtb_Sum_d; } /* End of Switch: '/Switch1' */ /* If: '/If1' */ if (rtb_Edge_Detect) { /* Outputs for IfAction SubSystem: '/AdvCtrlDetect' incorporates: * ActionPort: '/Action Port' */ /* Relay: '/n_commDeacv' incorporates: * Abs: '/Abs5' */ rtDW->n_commDeacv_Mode = ((rtb_Rem1 >= 480U) || ((rtb_Rem1 > 240U) && rtDW->n_commDeacv_Mode)); /* Outport: '/b_advCtrl' incorporates: * Constant: '/Constant' * RelationalOperator: '/Compare' * Relay: '/n_commDeacv' * Sum: '/Sum13' * UnitDelay: '/UnitDelay2' * UnitDelay: '/UnitDelay3' * UnitDelay: '/UnitDelay5' */ rtY->b_advCtrl = ((uint16_T)((uint32_T)(uint16_T)((uint32_T)(uint16_T) ((uint32_T)rtDW->UnitDelay2_DSTATE_o + rtDW->UnitDelay3_DSTATE_p) + rtDW->UnitDelay5_DSTATE_m) + rtDW->n_commDeacv_Mode) >= 4); /* Update for UnitDelay: '/UnitDelay2' incorporates: * UnitDelay: '/UnitDelay3' */ rtDW->UnitDelay2_DSTATE_o = rtDW->UnitDelay3_DSTATE_p; /* Update for UnitDelay: '/UnitDelay3' incorporates: * UnitDelay: '/UnitDelay5' */ rtDW->UnitDelay3_DSTATE_p = rtDW->UnitDelay5_DSTATE_m; /* Update for UnitDelay: '/UnitDelay5' incorporates: * Logic: '/Logical Operator3' * Relay: '/n_commDeacv' */ rtDW->UnitDelay5_DSTATE_m = rtDW->n_commDeacv_Mode; /* End of Outputs for SubSystem: '/AdvCtrlDetect' */ } /* End of If: '/If1' */ /* Update for Delay: '/Delay' incorporates: * Inport: '/hall_abc' */ rtDW->Delay_DSTATE_p = rtU->hall_abc[0]; /* Update for Delay: '/Delay1' incorporates: * Inport: '/hall_abc' */ rtDW->Delay1_DSTATE = rtU->hall_abc[1]; /* Update for Delay: '/Delay2' incorporates: * Inport: '/hall_abc' */ rtDW->Delay2_DSTATE = rtU->hall_abc[2]; /* Update for UnitDelay: '/UnitDelay4' incorporates: * Abs: '/Abs5' */ rtDW->UnitDelay4_DSTATE = rtb_Rem1; /* Update for UnitDelay: '/UnitDelay' */ rtDW->UnitDelay_DSTATE_p = rtb_UnitDelay_n; /* Update for UnitDelay: '/UnitDelay' */ rtDW->UnitDelay_DSTATE_gv = rtb_RelationalOperator; /* Update for UnitDelay: '/UnitDelay' */ rtDW->UnitDelay_DSTATE_oy = rtb_RelationalOperator4_d; /* Update for UnitDelay: '/UnitDelay1' incorporates: * Sum: '/Sum3' */ rtDW->UnitDelay1_DSTATE = rtb_Merge; /* Update for UnitDelay: '/Unit Delay' incorporates: * Switch: '/Switch' */ rtDW->UnitDelay_DSTATE_k[0] = rtb_UnitDelay1_ko[0]; /* Update for UnitDelay: '/UnitDelay1' incorporates: * Switch: '/Switch' * UnitDelay: '/Unit Delay' */ rtDW->UnitDelay1_DSTATE_o[0] = rtb_UnitDelay1_ko[0]; /* Update for UnitDelay: '/Unit Delay' incorporates: * Switch: '/Switch' * UnitDelay: '/Unit Delay' */ rtDW->UnitDelay_DSTATE_e[0] = rtb_UnitDelay1_ko[0]; /* Update for UnitDelay: '/Unit Delay' incorporates: * Switch: '/Switch' */ rtDW->UnitDelay_DSTATE_k[1] = rtb_UnitDelay1_ko[1]; /* Update for UnitDelay: '/UnitDelay1' incorporates: * Switch: '/Switch' * UnitDelay: '/Unit Delay' */ rtDW->UnitDelay1_DSTATE_o[1] = rtb_UnitDelay1_ko[1]; /* Update for UnitDelay: '/Unit Delay' incorporates: * Switch: '/Switch' * UnitDelay: '/Unit Delay' */ rtDW->UnitDelay_DSTATE_e[1] = rtb_UnitDelay1_ko[1]; /* If: '/If' */ if (rtb_Sum2 == 0) { /* Update for IfAction SubSystem: '/Do_Calc' incorporates: * ActionPort: '/Action Port' */ /* Update for UnitDelay: '/Unit Delay' */ rtDW->UnitDelay_DSTATE_lv = rtb_dz_cntTrnsDet; /* Update for UnitDelay: '/Unit Delay1' incorporates: * Merge: '/Merge' */ rtDW->UnitDelay1_DSTATE_jp = rtDW->Merge; /* Update for If: '/If' */ switch (rtDW->If_ActiveSubsystem_k) { case 0: /* Update for IfAction SubSystem: '/speed_mode' incorporates: * ActionPort: '/Action Port' */ /* Update for UnitDelay: '/Unit Delay' incorporates: * Sqrt: '/Sqrt1' */ rtDW->UnitDelay_DSTATE_di = rtb_Gain_a; /* 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: * Sqrt: '/Sqrt1' */ rtDW->icLoad_i = 0U; rtDW->Delay_DSTATE = rtb_Gain_a; /* End of Update for SubSystem: '/torque_mode' */ break; } /* End of Update for If: '/If' */ /* Update for UnitDelay: '/Unit Delay1' incorporates: * Sqrt: '/Sqrt' */ rtDW->UnitDelay1_DSTATE_pl = rtb_Sum1_p; /* Update for UnitDelay: '/Unit Delay' incorporates: * Sum: '/Sum' */ rtDW->UnitDelay_DSTATE_l = rtb_MathFunction2_n; /* Update for Delay: '/Resettable Delay' incorporates: * Sum: '/Sum1' */ rtDW->icLoad = 0U; rtDW->ResettableDelay_DSTATE = rtb_Gain_h; /* End of Update for SubSystem: '/Do_Calc' */ } /* Update for UnitDelay: '/UnitDelay' incorporates: * Switch: '/Switch2' */ rtDW->UnitDelay_DSTATE_l5 = rtDW->Switch2; /* Update for UnitDelay: '/Unit Delay1' incorporates: * Switch: '/Switch2' */ rtDW->UnitDelay1_DSTATE_j = rtb_Add2_lk; /* Update for UnitDelay: '/Unit Delay' incorporates: * Switch: '/Switch2' */ rtDW->UnitDelay_DSTATE_b = rtb_Add2_lk; /* Update for UnitDelay: '/UnitDelay' incorporates: * Switch: '/Switch' */ rtDW->UnitDelay_DSTATE_er = rtDW->Switch_p; /* Update for UnitDelay: '/Unit Delay1' incorporates: * Switch: '/Switch2' */ rtDW->UnitDelay1_DSTATE_p = rtb_Divide1_oy; /* Update for UnitDelay: '/Unit Delay' incorporates: * Switch: '/Switch2' */ rtDW->UnitDelay_DSTATE_d = rtb_Divide1_oy; /* Update for UnitDelay: '/Unit Delay' */ rtDW->UnitDelay_DSTATE_h3 = rtb_dz_cntTrnsDet; /* Update for UnitDelay: '/UnitDelay' */ rtDW->UnitDelay_DSTATE_f = rtb_RelationalOperator; /* End of Outputs for SubSystem: '/PMSM_Controller' */ /* Outport: '/n_Sector' */ rtY->n_Sector = rtb_DataTypeConversion_e; /* Outport: '/n_MotError' */ rtY->n_MotError = rtb_UnitDelay_n; /* Outport: '/f_MotAngle' incorporates: * Switch: '/Switch' */ rtY->f_MotAngle = rtb_r_cos_M1; /* Outport: '/f_MotRPM' incorporates: * Switch: '/Switch2' */ rtY->f_MotRPM = rtb_Switch3; /* Outport: '/n_hallStat' */ rtY->n_hallStat = rtb_Add_h; /* Outport: '/n_FocMode' */ rtY->n_FocMode = rtb_dz_cntTrnsDet; } /* Model initialize function */ void PMSM_Controller_initialize(RT_MODEL *const rtM) { DW *rtDW = rtM->dwork; PrevZCX *rtPrevZCX = rtM->prevZCSigState; rtPrevZCX->ResettableDelay_Reset_ZCE_f = POS_ZCSIG; rtPrevZCX->PI_backCalc_fixdt1.ResettableDelay_Reset_ZCE = POS_ZCSIG; rtPrevZCX->PI_backCalc_fixdt_ig.ResettableDelay_Reset_ZCE = POS_ZCSIG; rtPrevZCX->PI_Speed.ResettableDelay_Reset_ZCE_fm = POS_ZCSIG; /* SystemInitialize for Atomic SubSystem: '/PMSM_Controller' */ /* SystemInitialize for IfAction SubSystem: '/Raw_Motor_Speed_Estimation' */ /* InitializeConditions for UnitDelay: '/UnitDelay2' */ rtDW->UnitDelay2_DSTATE = 1000000U; /* SystemInitialize for SignalConversion generated from: '/delta_count' incorporates: * Outport: '/delta_count' */ rtDW->OutportBufferFordelta_count = 1000000U; /* End of SystemInitialize for SubSystem: '/Raw_Motor_Speed_Estimation' */ /* SystemInitialize for IfAction SubSystem: '/Do_Calc' */ /* Start for If: '/If' */ rtDW->If_ActiveSubsystem_k = -1; /* InitializeConditions for Delay: '/Resettable Delay' */ rtDW->icLoad = 1U; /* 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_i = 1U; /* 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_g_Init(&rtDW->PI_backCalc_fixdt_ig); /* End of SystemInitialize for SubSystem: '/PI_backCalc_fixdt' */ /* SystemInitialize for Atomic SubSystem: '/PI_backCalc_fixdt1' */ PI_backCalc_fixdt_g_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' */ } /* * File trailer for generated code. * * [EOF] */