/* * File: BLDC_controller.c * * Code generated for Simulink model 'BLDC_controller'. * * Model version : 1.1296 * Simulink Coder version : 8.13 (R2017b) 24-Jul-2017 * C/C++ source code generated on : Tue Oct 20 17:29:57 2020 * * Target selection: ert.tlc * Embedded hardware selection: ARM Compatible->ARM Cortex * Emulation hardware selection: * Differs from embedded hardware (MATLAB Host) * Code generation objectives: * 1. Execution efficiency * 2. RAM efficiency * Validation result: Not run */ #include "BLDC_controller.h" /* Named constants for Chart: '/F03_02_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 IN_VOLTAGE_MODE ((uint8_T)3U) #define OPEN_MODE ((uint8_T)0U) #define SPD_MODE ((uint8_T)2U) #define TRQ_MODE ((uint8_T)3U) #define VLT_MODE ((uint8_T)1U) #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 #if 0 /* Skip this size verification because of preprocessor limitation */ #if ( ULLONG_MAX != (0xFFFFFFFFFFFFFFFFULL) ) || ( LLONG_MAX != (0x7FFFFFFFFFFFFFFFLL) ) #error Code was generated for compiler with different sized ulong_long/long_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 #endif uint8_T plook_u8s16_evencka(int16_T u, int16_T bp0, uint16_T bpSpace, uint32_T maxIndex); uint8_T plook_u8u16_evencka(uint16_T u, uint16_T bp0, uint16_T bpSpace, uint32_T maxIndex); int32_T div_nde_s32_floor(int32_T numerator, int32_T denominator); extern void Counter_Init(DW_Counter *localDW, int16_T rtp_z_cntInit); extern int16_T Counter(int16_T rtu_inc, int16_T rtu_max, boolean_T rtu_rst, DW_Counter *localDW); extern void Low_Pass_Filter_Reset(DW_Low_Pass_Filter *localDW); 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 Counter_b_Init(DW_Counter_b *localDW, uint16_T rtp_z_cntInit); extern void Counter_n(uint16_T rtu_inc, uint16_T rtu_max, boolean_T rtu_rst, uint16_T *rty_cnt, DW_Counter_b *localDW); extern void either_edge(boolean_T rtu_u, boolean_T *rty_y, DW_either_edge *localDW); extern void Debounce_Filter_Init(DW_Debounce_Filter *localDW); extern void Debounce_Filter(boolean_T rtu_u, uint16_T rtu_tAcv, uint16_T rtu_tDeacv, boolean_T *rty_y, DW_Debounce_Filter *localDW); extern void I_backCalc_fixdt_Init(DW_I_backCalc_fixdt *localDW, int32_T rtp_yInit); extern void I_backCalc_fixdt_Reset(DW_I_backCalc_fixdt *localDW, int32_T rtp_yInit); extern void I_backCalc_fixdt(int16_T rtu_err, uint16_T rtu_I, uint16_T rtu_Kb, int16_T rtu_satMax, int16_T rtu_satMin, int16_T *rty_out, DW_I_backCalc_fixdt * localDW); extern void PI_clamp_fixdt_Init(DW_PI_clamp_fixdt *localDW); extern void PI_clamp_fixdt_Reset(DW_PI_clamp_fixdt *localDW); extern void PI_clamp_fixdt(int16_T rtu_err, uint16_T rtu_P, uint16_T rtu_I, int32_T rtu_init, int16_T rtu_satMax, int16_T rtu_satMin, int32_T rtu_ext_limProt, int16_T *rty_out, DW_PI_clamp_fixdt *localDW); extern void PI_clamp_fixdt_d_Init(DW_PI_clamp_fixdt_m *localDW); extern void PI_clamp_fixdt_b_Reset(DW_PI_clamp_fixdt_m *localDW); extern void PI_clamp_fixdt_l(int16_T rtu_err, uint16_T rtu_P, uint16_T rtu_I, int16_T rtu_init, int16_T rtu_satMax, int16_T rtu_satMin, int32_T rtu_ext_limProt, int16_T *rty_out, DW_PI_clamp_fixdt_m *localDW); extern void PI_clamp_fixdt_f_Init(DW_PI_clamp_fixdt_g *localDW); extern void PI_clamp_fixdt_g_Reset(DW_PI_clamp_fixdt_g *localDW); extern void PI_clamp_fixdt_k(int16_T rtu_err, uint16_T rtu_P, uint16_T rtu_I, int16_T rtu_init, int16_T rtu_satMax, int16_T rtu_satMin, int32_T rtu_ext_limProt, int16_T *rty_out, DW_PI_clamp_fixdt_g *localDW); uint8_T plook_u8s16_evencka(int16_T u, int16_T bp0, uint16_T bpSpace, uint32_T maxIndex) { uint8_T bpIndex; uint16_T fbpIndex; /* 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 { fbpIndex = (uint16_T)((uint32_T)(uint16_T)(u - bp0) / bpSpace); if (fbpIndex < maxIndex) { bpIndex = (uint8_T)fbpIndex; } else { bpIndex = (uint8_T)maxIndex; } } return bpIndex; } uint8_T plook_u8u16_evencka(uint16_T u, uint16_T bp0, uint16_T bpSpace, uint32_T maxIndex) { uint8_T bpIndex; uint16_T fbpIndex; /* 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 { fbpIndex = (uint16_T)((uint32_T)(uint16_T)((uint32_T)u - bp0) / bpSpace); if (fbpIndex < maxIndex) { bpIndex = (uint8_T)fbpIndex; } else { bpIndex = (uint8_T)maxIndex; } } return bpIndex; } int32_T div_nde_s32_floor(int32_T numerator, int32_T denominator) { return (((numerator < 0) != (denominator < 0)) && (numerator % denominator != 0) ? -1 : 0) + numerator / denominator; } /* System initialize for atomic system: '/Counter' */ void Counter_Init(DW_Counter *localDW, int16_T rtp_z_cntInit) { /* InitializeConditions for UnitDelay: '/UnitDelay' */ localDW->UnitDelay_DSTATE = rtp_z_cntInit; } /* Output and update for atomic system: '/Counter' */ int16_T Counter(int16_T rtu_inc, int16_T rtu_max, boolean_T rtu_rst, DW_Counter * localDW) { int16_T rtu_rst_0; int16_T rty_cnt_0; /* Switch: '/Switch1' incorporates: * Constant: '/Constant23' * UnitDelay: '/UnitDelay' */ if (rtu_rst) { rtu_rst_0 = 0; } else { rtu_rst_0 = localDW->UnitDelay_DSTATE; } /* End of Switch: '/Switch1' */ /* Sum: '/Sum1' */ rty_cnt_0 = (int16_T)(rtu_inc + rtu_rst_0); /* MinMax: '/MinMax' */ if (rty_cnt_0 < rtu_max) { /* Update for UnitDelay: '/UnitDelay' */ localDW->UnitDelay_DSTATE = rty_cnt_0; } else { /* Update for UnitDelay: '/UnitDelay' */ localDW->UnitDelay_DSTATE = rtu_max; } /* End of MinMax: '/MinMax' */ return rty_cnt_0; } /* System reset for atomic system: '/Low_Pass_Filter' */ void Low_Pass_Filter_Reset(DW_Low_Pass_Filter *localDW) { /* InitializeConditions for UnitDelay: '/UnitDelay1' */ localDW->UnitDelay1_DSTATE[0] = 0; localDW->UnitDelay1_DSTATE[1] = 0; } /* Output and update for atomic system: '/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_g; /* Sum: '/Sum2' incorporates: * UnitDelay: '/UnitDelay1' */ rtb_Sum3_g = rtu_u[0] - (localDW->UnitDelay1_DSTATE[0] >> 16); if (rtb_Sum3_g > 32767) { rtb_Sum3_g = 32767; } else { if (rtb_Sum3_g < -32768) { rtb_Sum3_g = -32768; } } /* Sum: '/Sum3' incorporates: * Product: '/Divide3' * Sum: '/Sum2' * UnitDelay: '/UnitDelay1' */ rtb_Sum3_g = rtu_coef * rtb_Sum3_g + localDW->UnitDelay1_DSTATE[0]; /* DataTypeConversion: '/Data Type Conversion' */ rty_y[0] = (int16_T)(rtb_Sum3_g >> 16); /* Update for UnitDelay: '/UnitDelay1' */ localDW->UnitDelay1_DSTATE[0] = rtb_Sum3_g; /* Sum: '/Sum2' incorporates: * UnitDelay: '/UnitDelay1' */ rtb_Sum3_g = rtu_u[1] - (localDW->UnitDelay1_DSTATE[1] >> 16); if (rtb_Sum3_g > 32767) { rtb_Sum3_g = 32767; } else { if (rtb_Sum3_g < -32768) { rtb_Sum3_g = -32768; } } /* Sum: '/Sum3' incorporates: * Product: '/Divide3' * Sum: '/Sum2' * UnitDelay: '/UnitDelay1' */ rtb_Sum3_g = rtu_coef * rtb_Sum3_g + localDW->UnitDelay1_DSTATE[1]; /* DataTypeConversion: '/Data Type Conversion' */ rty_y[1] = (int16_T)(rtb_Sum3_g >> 16); /* Update for UnitDelay: '/UnitDelay1' */ localDW->UnitDelay1_DSTATE[1] = rtb_Sum3_g; } /* * System initialize for atomic system: * '/Counter' * '/Counter' */ void Counter_b_Init(DW_Counter_b *localDW, uint16_T rtp_z_cntInit) { /* InitializeConditions for UnitDelay: '/UnitDelay' */ localDW->UnitDelay_DSTATE = rtp_z_cntInit; } /* * Output and update for atomic system: * '/Counter' * '/Counter' */ void Counter_n(uint16_T rtu_inc, uint16_T rtu_max, boolean_T rtu_rst, uint16_T *rty_cnt, DW_Counter_b *localDW) { uint16_T rtu_rst_0; /* Switch: '/Switch1' incorporates: * Constant: '/Constant23' * UnitDelay: '/UnitDelay' */ if (rtu_rst) { rtu_rst_0 = 0U; } else { rtu_rst_0 = localDW->UnitDelay_DSTATE; } /* End of Switch: '/Switch1' */ /* Sum: '/Sum1' */ *rty_cnt = (uint16_T)((uint32_T)rtu_inc + rtu_rst_0); /* MinMax: '/MinMax' */ if (*rty_cnt < rtu_max) { /* Update for UnitDelay: '/UnitDelay' */ localDW->UnitDelay_DSTATE = *rty_cnt; } else { /* Update for UnitDelay: '/UnitDelay' */ localDW->UnitDelay_DSTATE = rtu_max; } /* End of MinMax: '/MinMax' */ } /* * Output and update for atomic system: * '/either_edge' * '/either_edge' */ void either_edge(boolean_T rtu_u, boolean_T *rty_y, DW_either_edge *localDW) { /* RelationalOperator: '/Relational Operator' incorporates: * UnitDelay: '/UnitDelay' */ *rty_y = (rtu_u != localDW->UnitDelay_DSTATE); /* Update for UnitDelay: '/UnitDelay' */ localDW->UnitDelay_DSTATE = rtu_u; } /* System initialize for atomic system: '/Debounce_Filter' */ void Debounce_Filter_Init(DW_Debounce_Filter *localDW) { /* SystemInitialize for IfAction SubSystem: '/Qualification' */ /* SystemInitialize for Atomic SubSystem: '/Counter' */ Counter_b_Init(&localDW->Counter_n1, 0U); /* End of SystemInitialize for SubSystem: '/Counter' */ /* End of SystemInitialize for SubSystem: '/Qualification' */ /* SystemInitialize for IfAction SubSystem: '/Dequalification' */ /* SystemInitialize for Atomic SubSystem: '/Counter' */ Counter_b_Init(&localDW->Counter_e, 0U); /* End of SystemInitialize for SubSystem: '/Counter' */ /* End of SystemInitialize for SubSystem: '/Dequalification' */ } /* Output and update for atomic system: '/Debounce_Filter' */ void Debounce_Filter(boolean_T rtu_u, uint16_T rtu_tAcv, uint16_T rtu_tDeacv, boolean_T *rty_y, DW_Debounce_Filter *localDW) { uint16_T rtb_Sum1_n; boolean_T rtb_RelationalOperator_g; /* Outputs for Atomic SubSystem: '/either_edge' */ either_edge(rtu_u, &rtb_RelationalOperator_g, &localDW->either_edge_p); /* End of Outputs for SubSystem: '/either_edge' */ /* If: '/If2' incorporates: * Constant: '/Constant6' * Constant: '/Constant6' * Inport: '/yPrev' * Logic: '/Logical Operator1' * Logic: '/Logical Operator2' * Logic: '/Logical Operator3' * Logic: '/Logical Operator4' * UnitDelay: '/UnitDelay' */ if (rtu_u && (!localDW->UnitDelay_DSTATE)) { /* Outputs for IfAction SubSystem: '/Qualification' incorporates: * ActionPort: '/Action Port' */ /* Outputs for Atomic SubSystem: '/Counter' */ Counter_n(1U, rtu_tAcv, rtb_RelationalOperator_g, &rtb_Sum1_n, &localDW->Counter_n1); /* End of Outputs for SubSystem: '/Counter' */ /* Switch: '/Switch2' incorporates: * Constant: '/Constant6' * RelationalOperator: '/Relational Operator2' */ *rty_y = ((rtb_Sum1_n > rtu_tAcv) || localDW->UnitDelay_DSTATE); /* End of Outputs for SubSystem: '/Qualification' */ } else if ((!rtu_u) && localDW->UnitDelay_DSTATE) { /* Outputs for IfAction SubSystem: '/Dequalification' incorporates: * ActionPort: '/Action Port' */ /* Outputs for Atomic SubSystem: '/Counter' */ Counter_n(1U, rtu_tDeacv, rtb_RelationalOperator_g, &rtb_Sum1_n, &localDW->Counter_e); /* End of Outputs for SubSystem: '/Counter' */ /* Switch: '/Switch2' incorporates: * Constant: '/Constant6' * RelationalOperator: '/Relational Operator2' */ *rty_y = ((!(rtb_Sum1_n > rtu_tDeacv)) && localDW->UnitDelay_DSTATE); /* End of Outputs for SubSystem: '/Dequalification' */ } else { /* Outputs for IfAction SubSystem: '/Default' incorporates: * ActionPort: '/Action Port' */ *rty_y = localDW->UnitDelay_DSTATE; /* End of Outputs for SubSystem: '/Default' */ } /* End of If: '/If2' */ /* Update for UnitDelay: '/UnitDelay' */ localDW->UnitDelay_DSTATE = *rty_y; } /* * System initialize for atomic system: * '/I_backCalc_fixdt' * '/I_backCalc_fixdt1' * '/I_backCalc_fixdt' */ void I_backCalc_fixdt_Init(DW_I_backCalc_fixdt *localDW, int32_T rtp_yInit) { /* InitializeConditions for UnitDelay: '/UnitDelay' */ localDW->UnitDelay_DSTATE_m = rtp_yInit; } /* * System reset for atomic system: * '/I_backCalc_fixdt' * '/I_backCalc_fixdt1' * '/I_backCalc_fixdt' */ void I_backCalc_fixdt_Reset(DW_I_backCalc_fixdt *localDW, int32_T rtp_yInit) { /* InitializeConditions for UnitDelay: '/UnitDelay' */ localDW->UnitDelay_DSTATE = 0; /* InitializeConditions for UnitDelay: '/UnitDelay' */ localDW->UnitDelay_DSTATE_m = rtp_yInit; } /* * Output and update for atomic system: * '/I_backCalc_fixdt' * '/I_backCalc_fixdt1' * '/I_backCalc_fixdt' */ void I_backCalc_fixdt(int16_T rtu_err, uint16_T rtu_I, uint16_T rtu_Kb, int16_T rtu_satMax, int16_T rtu_satMin, int16_T *rty_out, DW_I_backCalc_fixdt *localDW) { int32_T rtb_Sum1_o; int16_T rtb_DataTypeConversion1_gf; /* Sum: '/Sum2' incorporates: * Product: '/Divide2' * UnitDelay: '/UnitDelay' */ rtb_Sum1_o = (rtu_err * rtu_I) >> 4; if ((rtb_Sum1_o < 0) && (localDW->UnitDelay_DSTATE < MIN_int32_T - rtb_Sum1_o)) { rtb_Sum1_o = MIN_int32_T; } else if ((rtb_Sum1_o > 0) && (localDW->UnitDelay_DSTATE > MAX_int32_T - rtb_Sum1_o)) { rtb_Sum1_o = MAX_int32_T; } else { rtb_Sum1_o += localDW->UnitDelay_DSTATE; } /* End of Sum: '/Sum2' */ /* Sum: '/Sum1' incorporates: * UnitDelay: '/UnitDelay' */ rtb_Sum1_o += localDW->UnitDelay_DSTATE_m; /* DataTypeConversion: '/Data Type Conversion1' */ rtb_DataTypeConversion1_gf = (int16_T)(rtb_Sum1_o >> 12); /* Switch: '/Switch2' incorporates: * RelationalOperator: '/LowerRelop1' * RelationalOperator: '/UpperRelop' * Switch: '/Switch' */ if (rtb_DataTypeConversion1_gf > rtu_satMax) { *rty_out = rtu_satMax; } else if (rtb_DataTypeConversion1_gf < rtu_satMin) { /* Switch: '/Switch' */ *rty_out = rtu_satMin; } else { *rty_out = rtb_DataTypeConversion1_gf; } /* End of Switch: '/Switch2' */ /* Update for UnitDelay: '/UnitDelay' incorporates: * Product: '/Divide1' * Sum: '/Sum3' */ localDW->UnitDelay_DSTATE = (int16_T)(*rty_out - rtb_DataTypeConversion1_gf) * rtu_Kb; /* Update for UnitDelay: '/UnitDelay' */ localDW->UnitDelay_DSTATE_m = rtb_Sum1_o; } /* System initialize for atomic system: '/PI_clamp_fixdt' */ void PI_clamp_fixdt_Init(DW_PI_clamp_fixdt *localDW) { /* InitializeConditions for Delay: '/Resettable Delay' */ localDW->icLoad = 1U; } /* System reset for atomic system: '/PI_clamp_fixdt' */ void PI_clamp_fixdt_Reset(DW_PI_clamp_fixdt *localDW) { /* InitializeConditions for UnitDelay: '/UnitDelay1' */ localDW->UnitDelay1_DSTATE = false; /* InitializeConditions for Delay: '/Resettable Delay' */ localDW->icLoad = 1U; } /* Output and update for atomic system: '/PI_clamp_fixdt' */ void PI_clamp_fixdt(int16_T rtu_err, uint16_T rtu_P, uint16_T rtu_I, int32_T rtu_init, int16_T rtu_satMax, int16_T rtu_satMin, int32_T rtu_ext_limProt, int16_T *rty_out, DW_PI_clamp_fixdt *localDW) { boolean_T rtb_LowerRelop1_c0; boolean_T rtb_UpperRelop_f; int32_T rtb_Sum1_p0; int32_T q0; int32_T tmp; int16_T tmp_0; /* Sum: '/Sum2' incorporates: * Product: '/Divide2' */ q0 = rtu_err * rtu_I; if ((q0 < 0) && (rtu_ext_limProt < MIN_int32_T - q0)) { q0 = MIN_int32_T; } else if ((q0 > 0) && (rtu_ext_limProt > MAX_int32_T - q0)) { q0 = MAX_int32_T; } else { q0 += rtu_ext_limProt; } /* Delay: '/Resettable Delay' */ if (localDW->icLoad != 0) { localDW->ResettableDelay_DSTATE = rtu_init; } /* Switch: '/Switch1' incorporates: * Constant: '/Constant' * Sum: '/Sum2' * UnitDelay: '/UnitDelay1' */ if (localDW->UnitDelay1_DSTATE) { tmp = 0; } else { tmp = q0; } /* End of Switch: '/Switch1' */ /* Sum: '/Sum1' incorporates: * Delay: '/Resettable Delay' */ rtb_Sum1_p0 = tmp + localDW->ResettableDelay_DSTATE; /* Product: '/Divide5' */ tmp = (rtu_err * rtu_P) >> 11; if (tmp > 32767) { tmp = 32767; } else { if (tmp < -32768) { tmp = -32768; } } /* Sum: '/Sum1' incorporates: * DataTypeConversion: '/Data Type Conversion1' * Product: '/Divide5' */ tmp = (((rtb_Sum1_p0 >> 16) << 1) + tmp) >> 1; if (tmp > 32767) { tmp = 32767; } else { if (tmp < -32768) { tmp = -32768; } } /* RelationalOperator: '/LowerRelop1' incorporates: * Sum: '/Sum1' */ rtb_LowerRelop1_c0 = ((int16_T)tmp > rtu_satMax); /* RelationalOperator: '/UpperRelop' incorporates: * Sum: '/Sum1' */ rtb_UpperRelop_f = ((int16_T)tmp < rtu_satMin); /* Switch: '/Switch1' incorporates: * Sum: '/Sum1' * Switch: '/Switch3' */ if (rtb_LowerRelop1_c0) { *rty_out = rtu_satMax; } else if (rtb_UpperRelop_f) { /* Switch: '/Switch3' */ *rty_out = rtu_satMin; } else { *rty_out = (int16_T)tmp; } /* End of Switch: '/Switch1' */ /* Signum: '/SignDeltaU2' incorporates: * Sum: '/Sum2' */ if (q0 < 0) { q0 = -1; } else { q0 = (q0 > 0); } /* End of Signum: '/SignDeltaU2' */ /* Signum: '/SignDeltaU3' incorporates: * Sum: '/Sum1' */ if ((int16_T)tmp < 0) { tmp_0 = -1; } else { tmp_0 = (int16_T)((int16_T)tmp > 0); } /* End of Signum: '/SignDeltaU3' */ /* Update for UnitDelay: '/UnitDelay1' incorporates: * DataTypeConversion: '/DataTypeConv4' * Logic: '/AND1' * Logic: '/AND1' * RelationalOperator: '/Equal1' */ localDW->UnitDelay1_DSTATE = ((q0 == tmp_0) && (rtb_LowerRelop1_c0 || rtb_UpperRelop_f)); /* Update for Delay: '/Resettable Delay' */ localDW->icLoad = 0U; localDW->ResettableDelay_DSTATE = rtb_Sum1_p0; } /* System initialize for atomic system: '/PI_clamp_fixdt' */ void PI_clamp_fixdt_d_Init(DW_PI_clamp_fixdt_m *localDW) { /* InitializeConditions for Delay: '/Resettable Delay' */ localDW->icLoad = 1U; } /* System reset for atomic system: '/PI_clamp_fixdt' */ void PI_clamp_fixdt_b_Reset(DW_PI_clamp_fixdt_m *localDW) { /* InitializeConditions for UnitDelay: '/UnitDelay1' */ localDW->UnitDelay1_DSTATE = false; /* InitializeConditions for Delay: '/Resettable Delay' */ localDW->icLoad = 1U; } /* Output and update for atomic system: '/PI_clamp_fixdt' */ void PI_clamp_fixdt_l(int16_T rtu_err, uint16_T rtu_P, uint16_T rtu_I, int16_T rtu_init, int16_T rtu_satMax, int16_T rtu_satMin, int32_T rtu_ext_limProt, int16_T *rty_out, DW_PI_clamp_fixdt_m *localDW) { boolean_T rtb_LowerRelop1_l; boolean_T rtb_UpperRelop_l; int32_T rtb_Sum1_ni; int32_T q0; int32_T tmp; int16_T tmp_0; /* Sum: '/Sum2' incorporates: * Product: '/Divide2' */ q0 = rtu_err * rtu_I; if ((q0 < 0) && (rtu_ext_limProt < MIN_int32_T - q0)) { q0 = MIN_int32_T; } else if ((q0 > 0) && (rtu_ext_limProt > MAX_int32_T - q0)) { q0 = MAX_int32_T; } else { q0 += rtu_ext_limProt; } /* Delay: '/Resettable Delay' */ if (localDW->icLoad != 0) { localDW->ResettableDelay_DSTATE = rtu_init << 16; } /* Switch: '/Switch1' incorporates: * Constant: '/Constant' * Sum: '/Sum2' * UnitDelay: '/UnitDelay1' */ if (localDW->UnitDelay1_DSTATE) { tmp = 0; } else { tmp = q0; } /* End of Switch: '/Switch1' */ /* Sum: '/Sum1' incorporates: * Delay: '/Resettable Delay' */ rtb_Sum1_ni = tmp + localDW->ResettableDelay_DSTATE; /* Product: '/Divide5' */ tmp = (rtu_err * rtu_P) >> 11; if (tmp > 32767) { tmp = 32767; } else { if (tmp < -32768) { tmp = -32768; } } /* Sum: '/Sum1' incorporates: * DataTypeConversion: '/Data Type Conversion1' * Product: '/Divide5' */ tmp = (((rtb_Sum1_ni >> 16) << 1) + tmp) >> 1; if (tmp > 32767) { tmp = 32767; } else { if (tmp < -32768) { tmp = -32768; } } /* RelationalOperator: '/LowerRelop1' incorporates: * Sum: '/Sum1' */ rtb_LowerRelop1_l = ((int16_T)tmp > rtu_satMax); /* RelationalOperator: '/UpperRelop' incorporates: * Sum: '/Sum1' */ rtb_UpperRelop_l = ((int16_T)tmp < rtu_satMin); /* Switch: '/Switch1' incorporates: * Sum: '/Sum1' * Switch: '/Switch3' */ if (rtb_LowerRelop1_l) { *rty_out = rtu_satMax; } else if (rtb_UpperRelop_l) { /* Switch: '/Switch3' */ *rty_out = rtu_satMin; } else { *rty_out = (int16_T)tmp; } /* End of Switch: '/Switch1' */ /* Signum: '/SignDeltaU2' incorporates: * Sum: '/Sum2' */ if (q0 < 0) { q0 = -1; } else { q0 = (q0 > 0); } /* End of Signum: '/SignDeltaU2' */ /* Signum: '/SignDeltaU3' incorporates: * Sum: '/Sum1' */ if ((int16_T)tmp < 0) { tmp_0 = -1; } else { tmp_0 = (int16_T)((int16_T)tmp > 0); } /* End of Signum: '/SignDeltaU3' */ /* Update for UnitDelay: '/UnitDelay1' incorporates: * DataTypeConversion: '/DataTypeConv4' * Logic: '/AND1' * Logic: '/AND1' * RelationalOperator: '/Equal1' */ localDW->UnitDelay1_DSTATE = ((q0 == tmp_0) && (rtb_LowerRelop1_l || rtb_UpperRelop_l)); /* Update for Delay: '/Resettable Delay' */ localDW->icLoad = 0U; localDW->ResettableDelay_DSTATE = rtb_Sum1_ni; } /* System initialize for atomic system: '/PI_clamp_fixdt' */ void PI_clamp_fixdt_f_Init(DW_PI_clamp_fixdt_g *localDW) { /* InitializeConditions for Delay: '/Resettable Delay' */ localDW->icLoad = 1U; } /* System reset for atomic system: '/PI_clamp_fixdt' */ void PI_clamp_fixdt_g_Reset(DW_PI_clamp_fixdt_g *localDW) { /* InitializeConditions for UnitDelay: '/UnitDelay1' */ localDW->UnitDelay1_DSTATE = false; /* InitializeConditions for Delay: '/Resettable Delay' */ localDW->icLoad = 1U; } /* Output and update for atomic system: '/PI_clamp_fixdt' */ void PI_clamp_fixdt_k(int16_T rtu_err, uint16_T rtu_P, uint16_T rtu_I, int16_T rtu_init, int16_T rtu_satMax, int16_T rtu_satMin, int32_T rtu_ext_limProt, int16_T *rty_out, DW_PI_clamp_fixdt_g *localDW) { boolean_T rtb_LowerRelop1_i3; boolean_T rtb_UpperRelop_i; int16_T rtb_Sum1_bm; int16_T tmp; int32_T tmp_0; int32_T q0; /* Sum: '/Sum2' incorporates: * Product: '/Divide2' */ q0 = rtu_err * rtu_I; if ((q0 < 0) && (rtu_ext_limProt < MIN_int32_T - q0)) { q0 = MIN_int32_T; } else if ((q0 > 0) && (rtu_ext_limProt > MAX_int32_T - q0)) { q0 = MAX_int32_T; } else { q0 += rtu_ext_limProt; } /* Delay: '/Resettable Delay' */ if (localDW->icLoad != 0) { localDW->ResettableDelay_DSTATE = rtu_init; } /* Switch: '/Switch1' incorporates: * Constant: '/Constant' * Sum: '/Sum2' * UnitDelay: '/UnitDelay1' */ if (localDW->UnitDelay1_DSTATE) { tmp = 0; } else { tmp = (int16_T)(((q0 < 0 ? 65535 : 0) + q0) >> 16); } /* End of Switch: '/Switch1' */ /* Sum: '/Sum1' incorporates: * Delay: '/Resettable Delay' */ rtb_Sum1_bm = (int16_T)(tmp + localDW->ResettableDelay_DSTATE); /* Product: '/Divide5' */ tmp_0 = (rtu_err * rtu_P) >> 11; if (tmp_0 > 32767) { tmp_0 = 32767; } else { if (tmp_0 < -32768) { tmp_0 = -32768; } } /* Sum: '/Sum1' incorporates: * Product: '/Divide5' */ tmp_0 = ((rtb_Sum1_bm << 1) + tmp_0) >> 1; if (tmp_0 > 32767) { tmp_0 = 32767; } else { if (tmp_0 < -32768) { tmp_0 = -32768; } } /* RelationalOperator: '/LowerRelop1' incorporates: * Sum: '/Sum1' */ rtb_LowerRelop1_i3 = ((int16_T)tmp_0 > rtu_satMax); /* RelationalOperator: '/UpperRelop' incorporates: * Sum: '/Sum1' */ rtb_UpperRelop_i = ((int16_T)tmp_0 < rtu_satMin); /* Switch: '/Switch1' incorporates: * Sum: '/Sum1' * Switch: '/Switch3' */ if (rtb_LowerRelop1_i3) { *rty_out = rtu_satMax; } else if (rtb_UpperRelop_i) { /* Switch: '/Switch3' */ *rty_out = rtu_satMin; } else { *rty_out = (int16_T)tmp_0; } /* End of Switch: '/Switch1' */ /* Signum: '/SignDeltaU2' incorporates: * Sum: '/Sum2' */ if (q0 < 0) { q0 = -1; } else { q0 = (q0 > 0); } /* End of Signum: '/SignDeltaU2' */ /* Signum: '/SignDeltaU3' incorporates: * Sum: '/Sum1' */ if ((int16_T)tmp_0 < 0) { tmp = -1; } else { tmp = (int16_T)((int16_T)tmp_0 > 0); } /* End of Signum: '/SignDeltaU3' */ /* Update for UnitDelay: '/UnitDelay1' incorporates: * DataTypeConversion: '/DataTypeConv4' * Logic: '/AND1' * Logic: '/AND1' * RelationalOperator: '/Equal1' */ localDW->UnitDelay1_DSTATE = ((q0 == tmp) && (rtb_LowerRelop1_i3 || rtb_UpperRelop_i)); /* Update for Delay: '/Resettable Delay' */ localDW->icLoad = 0U; localDW->ResettableDelay_DSTATE = rtb_Sum1_bm; } /* Model step function */ void BLDC_controller_step(RT_MODEL *const rtM) { P *rtP = ((P *) rtM->defaultParam); DW *rtDW = ((DW *) rtM->dwork); ExtU *rtU = (ExtU *) rtM->inputs; ExtY *rtY = (ExtY *) rtM->outputs; boolean_T rtb_LogicalOperator; int8_T rtb_Sum2_h; boolean_T rtb_RelationalOperator4_d; boolean_T rtb_UnitDelay5_e; uint8_T rtb_a_elecAngle_XA_g; boolean_T rtb_LogicalOperator1_j; boolean_T rtb_LogicalOperator2_p; boolean_T rtb_RelationalOperator1_mv; int16_T rtb_Switch1_l; int16_T rtb_Saturation; int16_T rtb_Saturation1; int32_T rtb_Sum1_jt; int16_T rtb_Merge_m; int16_T rtb_Merge1; int16_T rtb_TmpSignalConversionAtLow_Pa[2]; int32_T rtb_Switch1; int32_T rtb_Sum1; int32_T rtb_Gain3; uint8_T Sum; int16_T Switch2; int16_T Abs5; int16_T DataTypeConversion2; int16_T tmp[4]; int8_T UnitDelay3; /* Outputs for Atomic SubSystem: '/BLDC_controller' */ /* Sum: '/Sum' incorporates: * Gain: '/g_Ha' * Gain: '/g_Hb' * Inport: '/b_hallA ' * Inport: '/b_hallB' * Inport: '/b_hallC' */ Sum = (uint8_T)((uint32_T)(uint8_T)((uint32_T)(uint8_T)(rtU->b_hallA << 2) + (uint8_T)(rtU->b_hallB << 1)) + rtU->b_hallC); /* Logic: '/Logical Operator' incorporates: * Inport: '/b_hallA ' * Inport: '/b_hallB' * Inport: '/b_hallC' * UnitDelay: '/UnitDelay1' * UnitDelay: '/UnitDelay2' * UnitDelay: '/UnitDelay3' */ rtb_LogicalOperator = (boolean_T)((rtU->b_hallA != 0) ^ (rtU->b_hallB != 0) ^ (rtU->b_hallC != 0) ^ (rtDW->UnitDelay3_DSTATE_fy != 0) ^ (rtDW->UnitDelay1_DSTATE != 0)) ^ (rtDW->UnitDelay2_DSTATE_f != 0); /* If: '/If2' incorporates: * If: '/If2' * Inport: '/z_counterRawPrev' * UnitDelay: '/UnitDelay3' */ if (rtb_LogicalOperator) { /* Outputs for IfAction SubSystem: '/F01_03_Direction_Detection' incorporates: * ActionPort: '/Action Port' */ /* UnitDelay: '/UnitDelay3' */ UnitDelay3 = rtDW->Switch2_e; /* Sum: '/Sum2' incorporates: * Constant: '/vec_hallToPos' * Selector: '/Selector' * UnitDelay: '/UnitDelay2' */ rtb_Sum2_h = (int8_T)(rtConstP.vec_hallToPos_Value[Sum] - rtDW->UnitDelay2_DSTATE_b); /* Switch: '/Switch2' incorporates: * Constant: '/Constant20' * Constant: '/Constant23' * Constant: '/Constant24' * Constant: '/Constant8' * Logic: '/Logical Operator3' * RelationalOperator: '/Relational Operator1' * RelationalOperator: '/Relational Operator6' */ if ((rtb_Sum2_h == 1) || (rtb_Sum2_h == -5)) { rtDW->Switch2_e = 1; } else { rtDW->Switch2_e = -1; } /* End of Switch: '/Switch2' */ /* Update for UnitDelay: '/UnitDelay2' incorporates: * Constant: '/vec_hallToPos' * Selector: '/Selector' */ rtDW->UnitDelay2_DSTATE_b = rtConstP.vec_hallToPos_Value[Sum]; /* End of Outputs for SubSystem: '/F01_03_Direction_Detection' */ /* Outputs for IfAction SubSystem: '/Raw_Motor_Speed_Estimation' incorporates: * ActionPort: '/Action Port' */ rtDW->z_counterRawPrev = rtDW->UnitDelay3_DSTATE; /* Sum: '/Sum7' incorporates: * Inport: '/z_counterRawPrev' * UnitDelay: '/UnitDelay3' * UnitDelay: '/UnitDelay4' */ Switch2 = (int16_T)(rtDW->z_counterRawPrev - rtDW->UnitDelay4_DSTATE); /* Abs: '/Abs2' */ if (Switch2 < 0) { rtb_Switch1_l = (int16_T)-Switch2; } else { rtb_Switch1_l = Switch2; } /* End of Abs: '/Abs2' */ /* Relay: '/dz_cntTrnsDet' */ if (rtb_Switch1_l >= rtP->dz_cntTrnsDetHi) { rtDW->dz_cntTrnsDet_Mode = true; } else { if (rtb_Switch1_l <= rtP->dz_cntTrnsDetLo) { rtDW->dz_cntTrnsDet_Mode = false; } } rtDW->dz_cntTrnsDet = rtDW->dz_cntTrnsDet_Mode; /* End of Relay: '/dz_cntTrnsDet' */ /* RelationalOperator: '/Relational Operator4' */ rtb_RelationalOperator4_d = (rtDW->Switch2_e != UnitDelay3); /* Switch: '/Switch3' incorporates: * Constant: '/Constant4' * Logic: '/Logical Operator1' * Switch: '/Switch1' * Switch: '/Switch2' * UnitDelay: '/UnitDelay1' */ if (rtb_RelationalOperator4_d && rtDW->UnitDelay1_DSTATE_n) { rtb_Switch1_l = 0; } else if (rtb_RelationalOperator4_d) { /* Switch: '/Switch2' incorporates: * UnitDelay: '/UnitDelay4' */ rtb_Switch1_l = rtDW->UnitDelay4_DSTATE_e; } else if (rtDW->dz_cntTrnsDet) { /* Switch: '/Switch1' incorporates: * Constant: '/cf_speedCoef' * Product: '/Divide14' * Switch: '/Switch2' */ rtb_Switch1_l = (int16_T)((rtP->cf_speedCoef << 4) / rtDW->z_counterRawPrev); } else { /* Switch: '/Switch1' incorporates: * Constant: '/cf_speedCoef' * Gain: '/g_Ha' * Product: '/Divide13' * Sum: '/Sum13' * Switch: '/Switch2' * UnitDelay: '/UnitDelay2' * UnitDelay: '/UnitDelay3' * UnitDelay: '/UnitDelay5' */ rtb_Switch1_l = (int16_T)(((uint16_T)(rtP->cf_speedCoef << 2) << 4) / (int16_T)(((rtDW->UnitDelay2_DSTATE + rtDW->UnitDelay3_DSTATE_o) + rtDW->UnitDelay5_DSTATE) + rtDW->z_counterRawPrev)); } /* End of Switch: '/Switch3' */ /* Product: '/Divide11' */ rtDW->Divide11 = (int16_T)(rtb_Switch1_l * rtDW->Switch2_e); /* Update for UnitDelay: '/UnitDelay4' */ rtDW->UnitDelay4_DSTATE = rtDW->z_counterRawPrev; /* Update for UnitDelay: '/UnitDelay2' incorporates: * UnitDelay: '/UnitDelay3' */ rtDW->UnitDelay2_DSTATE = rtDW->UnitDelay3_DSTATE_o; /* Update for UnitDelay: '/UnitDelay3' incorporates: * UnitDelay: '/UnitDelay5' */ rtDW->UnitDelay3_DSTATE_o = rtDW->UnitDelay5_DSTATE; /* Update for UnitDelay: '/UnitDelay5' */ rtDW->UnitDelay5_DSTATE = rtDW->z_counterRawPrev; /* Update for UnitDelay: '/UnitDelay1' */ rtDW->UnitDelay1_DSTATE_n = rtb_RelationalOperator4_d; /* End of Outputs for SubSystem: '/Raw_Motor_Speed_Estimation' */ } /* End of If: '/If2' */ /* Outputs for Atomic SubSystem: '/Counter' */ /* Constant: '/Constant6' incorporates: * Constant: '/z_maxCntRst2' */ rtb_Switch1_l = (int16_T) Counter(1, rtP->z_maxCntRst, rtb_LogicalOperator, &rtDW->Counter_e); /* End of Outputs for SubSystem: '/Counter' */ /* Switch: '/Switch2' incorporates: * Constant: '/Constant4' * Constant: '/z_maxCntRst' * RelationalOperator: '/Relational Operator2' */ if (rtb_Switch1_l > rtP->z_maxCntRst) { Switch2 = 0; } else { Switch2 = rtDW->Divide11; } /* End of Switch: '/Switch2' */ /* Abs: '/Abs5' */ if (Switch2 < 0) { Abs5 = (int16_T)-Switch2; } else { Abs5 = Switch2; } /* End of Abs: '/Abs5' */ /* Relay: '/n_commDeacv' */ if (Abs5 >= rtP->n_commDeacvHi) { rtDW->n_commDeacv_Mode = true; } else { if (Abs5 <= rtP->n_commAcvLo) { rtDW->n_commDeacv_Mode = false; } } /* Logic: '/Logical Operator3' incorporates: * Constant: '/b_angleMeasEna' * Logic: '/Logical Operator1' * Logic: '/Logical Operator2' * Relay: '/n_commDeacv' */ rtb_LogicalOperator = (rtP->b_angleMeasEna || (rtDW->n_commDeacv_Mode && (!rtDW->dz_cntTrnsDet))); /* UnitDelay: '/UnitDelay2' */ rtb_RelationalOperator4_d = rtDW->UnitDelay2_DSTATE_c; /* UnitDelay: '/UnitDelay5' */ rtb_UnitDelay5_e = rtDW->UnitDelay5_DSTATE_m; /* DataTypeConversion: '/Data Type Conversion2' incorporates: * Inport: '/r_inpTgt' */ DataTypeConversion2 = (int16_T)(rtU->r_inpTgt << 4); /* Saturate: '/Saturation' incorporates: * Inport: '/i_phaAB' */ rtb_Gain3 = rtU->i_phaAB << 4; if (rtb_Gain3 >= 27200) { rtb_Saturation = 27200; } else if (rtb_Gain3 <= -27200) { rtb_Saturation = -27200; } else { rtb_Saturation = (int16_T)(rtU->i_phaAB << 4); } /* End of Saturate: '/Saturation' */ /* Saturate: '/Saturation1' incorporates: * Inport: '/i_phaBC' */ rtb_Gain3 = rtU->i_phaBC << 4; if (rtb_Gain3 >= 27200) { rtb_Saturation1 = 27200; } else if (rtb_Gain3 <= -27200) { rtb_Saturation1 = -27200; } else { rtb_Saturation1 = (int16_T)(rtU->i_phaBC << 4); } /* End of Saturate: '/Saturation1' */ /* If: '/If1' incorporates: * Constant: '/b_angleMeasEna' */ if (!rtP->b_angleMeasEna) { /* Outputs for IfAction SubSystem: '/F01_05_Electrical_Angle_Estimation' incorporates: * ActionPort: '/Action Port' */ /* Switch: '/Switch2' incorporates: * Constant: '/Constant16' * Product: '/Divide1' * Product: '/Divide3' * RelationalOperator: '/Relational Operator7' * Sum: '/Sum3' * Switch: '/Switch3' */ if (rtb_LogicalOperator) { /* MinMax: '/MinMax' */ rtb_Merge_m = rtb_Switch1_l; if (!(rtb_Merge_m < rtDW->z_counterRawPrev)) { rtb_Merge_m = rtDW->z_counterRawPrev; } /* End of MinMax: '/MinMax' */ /* Switch: '/Switch3' incorporates: * Constant: '/vec_hallToPos' * Constant: '/Constant16' * RelationalOperator: '/Relational Operator7' * Selector: '/Selector' * Sum: '/Sum1' */ if (rtDW->Switch2_e == 1) { rtb_Sum2_h = rtConstP.vec_hallToPos_Value[Sum]; } else { rtb_Sum2_h = (int8_T)(rtConstP.vec_hallToPos_Value[Sum] + 1); } rtb_Merge_m = (int16_T)(((int16_T)((int16_T)((rtb_Merge_m << 14) / rtDW->z_counterRawPrev) * rtDW->Switch2_e) + (rtb_Sum2_h << 14)) >> 2); } else { if (rtDW->Switch2_e == 1) { /* Switch: '/Switch3' incorporates: * Constant: '/vec_hallToPos' * Selector: '/Selector' */ rtb_Sum2_h = rtConstP.vec_hallToPos_Value[Sum]; } else { /* Switch: '/Switch3' incorporates: * Constant: '/vec_hallToPos' * Selector: '/Selector' * Sum: '/Sum1' */ rtb_Sum2_h = (int8_T)(rtConstP.vec_hallToPos_Value[Sum] + 1); } rtb_Merge_m = (int16_T)(rtb_Sum2_h << 12); } /* End of Switch: '/Switch2' */ /* MinMax: '/MinMax1' incorporates: * Constant: '/Constant1' */ if (!(rtb_Merge_m > 0)) { rtb_Merge_m = 0; } /* End of MinMax: '/MinMax1' */ /* SignalConversion: '/Signal Conversion2' incorporates: * Product: '/Divide2' */ rtb_Merge_m = (int16_T)((15 * rtb_Merge_m) >> 4); /* End of Outputs for SubSystem: '/F01_05_Electrical_Angle_Estimation' */ } else { /* Outputs for IfAction SubSystem: '/F01_06_Electrical_Angle_Measurement' incorporates: * ActionPort: '/Action Port' */ /* Sum: '/Sum1' incorporates: * Constant: '/Constant2' * Constant: '/n_polePairs' * Inport: '/a_mechAngle' * Product: '/Divide' */ rtb_Sum1_jt = rtU->a_mechAngle * rtP->n_polePairs - 480; /* DataTypeConversion: '/Data Type Conversion20' incorporates: * Constant: '/a_elecPeriod' * Product: '/Divide2' * Product: '/Divide3' * Sum: '/Sum3' */ rtb_Merge_m = (int16_T)((int16_T)(rtb_Sum1_jt - ((int16_T)((int16_T) div_nde_s32_floor(rtb_Sum1_jt, 5760) * 360) << 4)) << 2); /* End of Outputs for SubSystem: '/F01_06_Electrical_Angle_Measurement' */ } /* End of If: '/If1' */ /* If: '/If1' incorporates: * Constant: '/z_ctrlTypSel' */ rtb_Sum2_h = rtDW->If1_ActiveSubsystem; UnitDelay3 = -1; if (rtP->z_ctrlTypSel == 2) { UnitDelay3 = 0; } rtDW->If1_ActiveSubsystem = UnitDelay3; if ((rtb_Sum2_h != UnitDelay3) && (rtb_Sum2_h == 0)) { /* Disable for If: '/If2' */ if (rtDW->If2_ActiveSubsystem_a == 0) { /* Disable for Outport: '/iq' */ rtDW->DataTypeConversion[0] = 0; /* Disable for Outport: '/iqAbs' */ rtDW->Abs5_h = 0; /* Disable for Outport: '/id' */ rtDW->DataTypeConversion[1] = 0; } rtDW->If2_ActiveSubsystem_a = -1; /* End of Disable for If: '/If2' */ /* Disable for Outport: '/r_sin' */ rtDW->r_sin_M1 = 0; /* Disable for Outport: '/r_cos' */ rtDW->r_cos_M1 = 0; /* Disable for Outport: '/iq' */ rtDW->DataTypeConversion[0] = 0; /* Disable for Outport: '/id' */ rtDW->DataTypeConversion[1] = 0; /* Disable for Outport: '/iqAbs' */ rtDW->Abs5_h = 0; } if (UnitDelay3 == 0) { /* Outputs for IfAction SubSystem: '/Clarke_Park_Transform_Forward' incorporates: * ActionPort: '/Action Port' */ /* If: '/If1' incorporates: * Constant: '/z_selPhaCurMeasABC' */ if (rtP->z_selPhaCurMeasABC == 0) { /* Outputs for IfAction SubSystem: '/Clarke_PhasesAB' incorporates: * ActionPort: '/Action Port' */ /* Gain: '/Gain4' */ rtb_Gain3 = 18919 * rtb_Saturation; /* Gain: '/Gain2' */ rtb_Sum1_jt = 18919 * rtb_Saturation1; /* Sum: '/Sum1' incorporates: * Gain: '/Gain2' * Gain: '/Gain4' */ rtb_Gain3 = (((rtb_Gain3 < 0 ? 32767 : 0) + rtb_Gain3) >> 15) + (int16_T) (((rtb_Sum1_jt < 0 ? 16383 : 0) + rtb_Sum1_jt) >> 14); if (rtb_Gain3 > 32767) { rtb_Gain3 = 32767; } else { if (rtb_Gain3 < -32768) { rtb_Gain3 = -32768; } } rtb_Merge1 = (int16_T)rtb_Gain3; /* End of Sum: '/Sum1' */ /* End of Outputs for SubSystem: '/Clarke_PhasesAB' */ } else if (rtP->z_selPhaCurMeasABC == 1) { /* Outputs for IfAction SubSystem: '/Clarke_PhasesBC' incorporates: * ActionPort: '/Action Port' */ /* Sum: '/Sum3' */ rtb_Gain3 = rtb_Saturation - rtb_Saturation1; if (rtb_Gain3 > 32767) { rtb_Gain3 = 32767; } else { if (rtb_Gain3 < -32768) { rtb_Gain3 = -32768; } } /* Gain: '/Gain2' incorporates: * Sum: '/Sum3' */ rtb_Gain3 *= 18919; rtb_Merge1 = (int16_T)(((rtb_Gain3 < 0 ? 32767 : 0) + rtb_Gain3) >> 15); /* Sum: '/Sum1' */ rtb_Gain3 = -rtb_Saturation - rtb_Saturation1; if (rtb_Gain3 > 32767) { rtb_Gain3 = 32767; } else { if (rtb_Gain3 < -32768) { rtb_Gain3 = -32768; } } rtb_Saturation = (int16_T)rtb_Gain3; /* End of Sum: '/Sum1' */ /* End of Outputs for SubSystem: '/Clarke_PhasesBC' */ } else { /* Outputs for IfAction SubSystem: '/Clarke_PhasesAC' incorporates: * ActionPort: '/Action Port' */ /* Gain: '/Gain4' */ rtb_Gain3 = 18919 * rtb_Saturation; /* Gain: '/Gain2' */ rtb_Sum1_jt = 18919 * rtb_Saturation1; /* Sum: '/Sum1' incorporates: * Gain: '/Gain2' * Gain: '/Gain4' */ rtb_Gain3 = -(((rtb_Gain3 < 0 ? 32767 : 0) + rtb_Gain3) >> 15) - (int16_T) (((rtb_Sum1_jt < 0 ? 16383 : 0) + rtb_Sum1_jt) >> 14); if (rtb_Gain3 > 32767) { rtb_Gain3 = 32767; } else { if (rtb_Gain3 < -32768) { rtb_Gain3 = -32768; } } rtb_Merge1 = (int16_T)rtb_Gain3; /* End of Sum: '/Sum1' */ /* End of Outputs for SubSystem: '/Clarke_PhasesAC' */ } /* End of If: '/If1' */ /* PreLookup: '/a_elecAngle_XA' */ rtb_a_elecAngle_XA_g = plook_u8s16_evencka(rtb_Merge_m, 0, 128U, 180U); /* Interpolation_n-D: '/r_sin_M1' */ rtDW->r_sin_M1 = rtConstP.r_sin_M1_Table[rtb_a_elecAngle_XA_g]; /* Interpolation_n-D: '/r_cos_M1' */ rtDW->r_cos_M1 = rtConstP.r_cos_M1_Table[rtb_a_elecAngle_XA_g]; /* If: '/If2' incorporates: * Constant: '/cf_currFilt' * Inport: '/b_motEna' */ rtb_Sum2_h = rtDW->If2_ActiveSubsystem_a; UnitDelay3 = -1; if (rtU->b_motEna) { UnitDelay3 = 0; } rtDW->If2_ActiveSubsystem_a = UnitDelay3; if ((rtb_Sum2_h != UnitDelay3) && (rtb_Sum2_h == 0)) { /* Disable for Outport: '/iq' */ rtDW->DataTypeConversion[0] = 0; /* Disable for Outport: '/iqAbs' */ rtDW->Abs5_h = 0; /* Disable for Outport: '/id' */ rtDW->DataTypeConversion[1] = 0; } if (UnitDelay3 == 0) { if (0 != rtb_Sum2_h) { /* SystemReset for IfAction SubSystem: '/Current_Filtering' incorporates: * ActionPort: '/Action Port' */ /* SystemReset for Atomic SubSystem: '/Low_Pass_Filter' */ /* SystemReset for If: '/If2' */ Low_Pass_Filter_Reset(&rtDW->Low_Pass_Filter_m); /* End of SystemReset for SubSystem: '/Low_Pass_Filter' */ /* End of SystemReset for SubSystem: '/Current_Filtering' */ } /* Sum: '/Sum6' incorporates: * Product: '/Divide1' * Product: '/Divide4' */ rtb_Gain3 = (int16_T)((rtb_Merge1 * rtDW->r_cos_M1) >> 14) - (int16_T) ((rtb_Saturation * rtDW->r_sin_M1) >> 14); if (rtb_Gain3 > 32767) { rtb_Gain3 = 32767; } else { if (rtb_Gain3 < -32768) { rtb_Gain3 = -32768; } } /* Outputs for IfAction SubSystem: '/Current_Filtering' incorporates: * ActionPort: '/Action Port' */ /* SignalConversion: '/TmpSignal ConversionAtLow_Pass_FilterInport1' incorporates: * Sum: '/Sum6' */ rtb_TmpSignalConversionAtLow_Pa[0] = (int16_T)rtb_Gain3; /* End of Outputs for SubSystem: '/Current_Filtering' */ /* Sum: '/Sum1' incorporates: * Product: '/Divide2' * Product: '/Divide3' */ rtb_Gain3 = (int16_T)((rtb_Saturation * rtDW->r_cos_M1) >> 14) + (int16_T) ((rtb_Merge1 * rtDW->r_sin_M1) >> 14); if (rtb_Gain3 > 32767) { rtb_Gain3 = 32767; } else { if (rtb_Gain3 < -32768) { rtb_Gain3 = -32768; } } /* Outputs for IfAction SubSystem: '/Current_Filtering' incorporates: * ActionPort: '/Action Port' */ /* SignalConversion: '/TmpSignal ConversionAtLow_Pass_FilterInport1' incorporates: * Sum: '/Sum1' */ rtb_TmpSignalConversionAtLow_Pa[1] = (int16_T)rtb_Gain3; /* Outputs for Atomic SubSystem: '/Low_Pass_Filter' */ Low_Pass_Filter(rtb_TmpSignalConversionAtLow_Pa, rtP->cf_currFilt, rtDW->DataTypeConversion, &rtDW->Low_Pass_Filter_m); /* End of Outputs for SubSystem: '/Low_Pass_Filter' */ /* Abs: '/Abs5' incorporates: * Constant: '/cf_currFilt' */ if (rtDW->DataTypeConversion[0] < 0) { rtDW->Abs5_h = (int16_T)-rtDW->DataTypeConversion[0]; } else { rtDW->Abs5_h = rtDW->DataTypeConversion[0]; } /* End of Abs: '/Abs5' */ /* End of Outputs for SubSystem: '/Current_Filtering' */ } /* End of If: '/If2' */ /* End of Outputs for SubSystem: '/Clarke_Park_Transform_Forward' */ } /* End of If: '/If1' */ /* Chart: '/Task_Scheduler' incorporates: * UnitDelay: '/UnitDelay2' * UnitDelay: '/UnitDelay5' * UnitDelay: '/UnitDelay6' */ if (rtDW->UnitDelay2_DSTATE_c) { /* Outputs for Function Call SubSystem: '/F02_Diagnostics' */ /* If: '/If2' incorporates: * Constant: '/CTRL_COMM2' * Constant: '/t_errDequal' * Constant: '/t_errQual' * Constant: '/b_diagEna' * RelationalOperator: '/Relational Operator2' */ if (rtP->b_diagEna) { /* Outputs for IfAction SubSystem: '/Diagnostics_Enabled' incorporates: * ActionPort: '/Action Port' */ /* Switch: '/Switch3' incorporates: * Abs: '/Abs4' * Constant: '/n_stdStillDet' * Constant: '/CTRL_COMM4' * Constant: '/r_errInpTgtThres' * Inport: '/b_motEna' * Logic: '/Logical Operator1' * RelationalOperator: '/Relational Operator9' * RelationalOperator: '/Relational Operator7' * S-Function (sfix_bitop): '/Bitwise Operator1' * UnitDelay: '/UnitDelay' * UnitDelay: '/UnitDelay4' */ if ((rtDW->UnitDelay_DSTATE_e & 4) != 0) { rtb_RelationalOperator1_mv = true; } else { if (rtDW->UnitDelay4_DSTATE_eu < 0) { /* Abs: '/Abs4' incorporates: * UnitDelay: '/UnitDelay4' */ rtb_Saturation1 = (int16_T)-rtDW->UnitDelay4_DSTATE_eu; } else { /* Abs: '/Abs4' incorporates: * UnitDelay: '/UnitDelay4' */ rtb_Saturation1 = rtDW->UnitDelay4_DSTATE_eu; } rtb_RelationalOperator1_mv = (rtU->b_motEna && (Abs5 < rtP->n_stdStillDet) && (rtb_Saturation1 > rtP->r_errInpTgtThres)); } /* 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_a_elecAngle_XA_g = (uint8_T)(((uint32_T)((Sum == 7) << 1) + (Sum == 0)) + (rtb_RelationalOperator1_mv << 2)); /* Outputs for Atomic SubSystem: '/Debounce_Filter' */ Debounce_Filter(rtb_a_elecAngle_XA_g != 0, rtP->t_errQual, rtP->t_errDequal, &rtDW->Merge_p, &rtDW->Debounce_Filter_k); /* End of Outputs for SubSystem: '/Debounce_Filter' */ /* Outputs for Atomic SubSystem: '/either_edge' */ either_edge(rtDW->Merge_p, &rtb_RelationalOperator1_mv, &rtDW->either_edge_i); /* End of Outputs for SubSystem: '/either_edge' */ /* Switch: '/Switch1' incorporates: * Constant: '/CTRL_COMM2' * Constant: '/t_errDequal' * Constant: '/t_errQual' * RelationalOperator: '/Relational Operator2' */ if (rtb_RelationalOperator1_mv) { /* Outport: '/z_errCode' */ rtY->z_errCode = rtb_a_elecAngle_XA_g; } else { /* Outport: '/z_errCode' incorporates: * UnitDelay: '/UnitDelay' */ rtY->z_errCode = rtDW->UnitDelay_DSTATE_e; } /* End of Switch: '/Switch1' */ /* Update for UnitDelay: '/UnitDelay' incorporates: * Outport: '/z_errCode' */ rtDW->UnitDelay_DSTATE_e = rtY->z_errCode; /* End of Outputs for SubSystem: '/Diagnostics_Enabled' */ } /* End of If: '/If2' */ /* End of Outputs for SubSystem: '/F02_Diagnostics' */ /* Outputs for Function Call SubSystem: '/F03_Control_Mode_Manager' */ /* Logic: '/Logical Operator4' incorporates: * Constant: '/constant8' * Inport: '/b_motEna' * Inport: '/z_ctrlModReq' * Logic: '/Logical Operator7' * RelationalOperator: '/Relational Operator10' */ rtb_RelationalOperator1_mv = (rtDW->Merge_p || (!rtU->b_motEna) || (rtU->z_ctrlModReq == 0)); /* Logic: '/Logical Operator1' incorporates: * Constant: '/b_cruiseCtrlEna' * Constant: '/constant1' * Inport: '/z_ctrlModReq' * RelationalOperator: '/Relational Operator1' */ rtb_LogicalOperator1_j = ((rtU->z_ctrlModReq == 2) || rtP->b_cruiseCtrlEna); /* Logic: '/Logical Operator2' incorporates: * Constant: '/b_cruiseCtrlEna' * Constant: '/constant' * Inport: '/z_ctrlModReq' * Logic: '/Logical Operator5' * RelationalOperator: '/Relational Operator4' */ rtb_LogicalOperator2_p = ((rtU->z_ctrlModReq == 3) && (!rtP->b_cruiseCtrlEna)); /* Chart: '/F03_02_Control_Mode_Manager' incorporates: * Constant: '/constant5' * Inport: '/z_ctrlModReq' * Logic: '/Logical Operator3' * Logic: '/Logical Operator6' * Logic: '/Logical Operator9' * RelationalOperator: '/Relational Operator5' */ if (rtDW->is_active_c1_BLDC_controller == 0U) { rtDW->is_active_c1_BLDC_controller = 1U; rtDW->is_c1_BLDC_controller = IN_OPEN; rtDW->z_ctrlMod = OPEN_MODE; } else if (rtDW->is_c1_BLDC_controller == IN_ACTIVE) { if (rtb_RelationalOperator1_mv) { rtDW->is_ACTIVE = IN_NO_ACTIVE_CHILD; rtDW->is_c1_BLDC_controller = IN_OPEN; rtDW->z_ctrlMod = OPEN_MODE; } else { switch (rtDW->is_ACTIVE) { case IN_SPEED_MODE: rtDW->z_ctrlMod = SPD_MODE; if (!rtb_LogicalOperator1_j) { rtDW->is_ACTIVE = IN_NO_ACTIVE_CHILD; if (rtb_LogicalOperator2_p) { rtDW->is_ACTIVE = IN_TORQUE_MODE; rtDW->z_ctrlMod = TRQ_MODE; } else { rtDW->is_ACTIVE = IN_VOLTAGE_MODE; rtDW->z_ctrlMod = VLT_MODE; } } break; case IN_TORQUE_MODE: rtDW->z_ctrlMod = TRQ_MODE; if (!rtb_LogicalOperator2_p) { rtDW->is_ACTIVE = IN_NO_ACTIVE_CHILD; if (rtb_LogicalOperator1_j) { rtDW->is_ACTIVE = IN_SPEED_MODE; rtDW->z_ctrlMod = SPD_MODE; } else { rtDW->is_ACTIVE = IN_VOLTAGE_MODE; rtDW->z_ctrlMod = VLT_MODE; } } break; default: rtDW->z_ctrlMod = VLT_MODE; if (rtb_LogicalOperator2_p || rtb_LogicalOperator1_j) { rtDW->is_ACTIVE = IN_NO_ACTIVE_CHILD; if (rtb_LogicalOperator2_p) { rtDW->is_ACTIVE = IN_TORQUE_MODE; rtDW->z_ctrlMod = TRQ_MODE; } else if (rtb_LogicalOperator1_j) { rtDW->is_ACTIVE = IN_SPEED_MODE; rtDW->z_ctrlMod = SPD_MODE; } else { rtDW->is_ACTIVE = IN_VOLTAGE_MODE; rtDW->z_ctrlMod = VLT_MODE; } } break; } } } else { rtDW->z_ctrlMod = OPEN_MODE; if ((!rtb_RelationalOperator1_mv) && ((rtU->z_ctrlModReq == 1) || rtb_LogicalOperator1_j || rtb_LogicalOperator2_p)) { rtDW->is_c1_BLDC_controller = IN_ACTIVE; if (rtb_LogicalOperator2_p) { rtDW->is_ACTIVE = IN_TORQUE_MODE; rtDW->z_ctrlMod = TRQ_MODE; } else if (rtb_LogicalOperator1_j) { rtDW->is_ACTIVE = IN_SPEED_MODE; rtDW->z_ctrlMod = SPD_MODE; } else { rtDW->is_ACTIVE = IN_VOLTAGE_MODE; rtDW->z_ctrlMod = VLT_MODE; } } } /* End of Chart: '/F03_02_Control_Mode_Manager' */ /* If: '/If1' incorporates: * Constant: '/z_ctrlTypSel' * Inport: '/r_inpTgt' * Saturate: '/Saturation' */ if (rtP->z_ctrlTypSel == 2) { /* Outputs for IfAction SubSystem: '/FOC_Control_Type' incorporates: * ActionPort: '/Action Port' */ /* SignalConversion: '/TmpSignal ConversionAtSelectorInport1' incorporates: * Constant: '/Vd_max' * Constant: '/constant1' * Constant: '/i_max' * Constant: '/n_max' */ tmp[0] = 0; tmp[1] = rtP->Vd_max; tmp[2] = rtP->n_max; tmp[3] = rtP->i_max; /* End of Outputs for SubSystem: '/FOC_Control_Type' */ /* Saturate: '/Saturation' */ if (DataTypeConversion2 > 16000) { DataTypeConversion2 = 16000; } else { if (DataTypeConversion2 < -16000) { DataTypeConversion2 = -16000; } } /* Outputs for IfAction SubSystem: '/FOC_Control_Type' incorporates: * ActionPort: '/Action Port' */ /* Product: '/Divide1' incorporates: * Inport: '/z_ctrlModReq' * Product: '/Divide4' * Selector: '/Selector' */ rtb_Saturation = (int16_T)(((uint16_T)((tmp[rtU->z_ctrlModReq] << 5) / 125) * DataTypeConversion2) >> 12); /* End of Outputs for SubSystem: '/FOC_Control_Type' */ } else if (DataTypeConversion2 > 16000) { /* Outputs for IfAction SubSystem: '/Default_Control_Type' incorporates: * ActionPort: '/Action Port' */ /* Saturate: '/Saturation' incorporates: * Inport: '/r_inpTgt' */ rtb_Saturation = 16000; /* End of Outputs for SubSystem: '/Default_Control_Type' */ } else if (DataTypeConversion2 < -16000) { /* Outputs for IfAction SubSystem: '/Default_Control_Type' incorporates: * ActionPort: '/Action Port' */ /* Saturate: '/Saturation' incorporates: * Inport: '/r_inpTgt' */ rtb_Saturation = -16000; /* End of Outputs for SubSystem: '/Default_Control_Type' */ } else { /* Outputs for IfAction SubSystem: '/Default_Control_Type' incorporates: * ActionPort: '/Action Port' */ rtb_Saturation = DataTypeConversion2; /* End of Outputs for SubSystem: '/Default_Control_Type' */ } /* End of If: '/If1' */ /* If: '/If2' incorporates: * Inport: '/r_inpTgtScaRaw' */ rtb_Sum2_h = rtDW->If2_ActiveSubsystem_f; UnitDelay3 = (int8_T)!(rtDW->z_ctrlMod == 0); rtDW->If2_ActiveSubsystem_f = UnitDelay3; switch (UnitDelay3) { case 0: if (UnitDelay3 != rtb_Sum2_h) { /* SystemReset for IfAction SubSystem: '/Open_Mode' incorporates: * ActionPort: '/Action Port' */ /* SystemReset for Atomic SubSystem: '/rising_edge_init' */ /* SystemReset for If: '/If2' incorporates: * UnitDelay: '/UnitDelay' * UnitDelay: '/UnitDelay' */ rtDW->UnitDelay_DSTATE_b = true; /* End of SystemReset for SubSystem: '/rising_edge_init' */ /* SystemReset for Atomic SubSystem: '/Rate_Limiter' */ rtDW->UnitDelay_DSTATE = 0; /* End of SystemReset for SubSystem: '/Rate_Limiter' */ /* End of SystemReset for SubSystem: '/Open_Mode' */ } /* Outputs for IfAction SubSystem: '/Open_Mode' incorporates: * ActionPort: '/Action Port' */ /* DataTypeConversion: '/Data Type Conversion' incorporates: * UnitDelay: '/UnitDelay4' */ rtb_Gain3 = rtDW->UnitDelay4_DSTATE_eu << 12; rtb_Sum1_jt = (rtb_Gain3 & 134217728) != 0 ? rtb_Gain3 | -134217728 : rtb_Gain3 & 134217727; /* Outputs for Atomic SubSystem: '/rising_edge_init' */ /* UnitDelay: '/UnitDelay' */ rtb_RelationalOperator1_mv = rtDW->UnitDelay_DSTATE_b; /* Update for UnitDelay: '/UnitDelay' incorporates: * Constant: '/Constant' */ rtDW->UnitDelay_DSTATE_b = false; /* End of Outputs for SubSystem: '/rising_edge_init' */ /* Outputs for Atomic SubSystem: '/Rate_Limiter' */ /* Switch: '/Switch1' incorporates: * UnitDelay: '/UnitDelay' */ if (rtb_RelationalOperator1_mv) { rtb_Switch1 = rtb_Sum1_jt; } else { rtb_Switch1 = rtDW->UnitDelay_DSTATE; } /* End of Switch: '/Switch1' */ /* Sum: '/Sum1' */ rtb_Gain3 = -rtb_Switch1; rtb_Sum1 = (rtb_Gain3 & 134217728) != 0 ? rtb_Gain3 | -134217728 : rtb_Gain3 & 134217727; /* Switch: '/Switch2' incorporates: * Constant: '/dV_openRate' * RelationalOperator: '/LowerRelop1' */ if (rtb_Sum1 > rtP->dV_openRate) { rtb_Sum1 = rtP->dV_openRate; } else { /* Gain: '/Gain3' */ rtb_Gain3 = -rtP->dV_openRate; rtb_Gain3 = (rtb_Gain3 & 134217728) != 0 ? rtb_Gain3 | -134217728 : rtb_Gain3 & 134217727; /* Switch: '/Switch' incorporates: * RelationalOperator: '/UpperRelop' */ if (rtb_Sum1 < rtb_Gain3) { rtb_Sum1 = rtb_Gain3; } /* End of Switch: '/Switch' */ } /* End of Switch: '/Switch2' */ /* Sum: '/Sum2' */ rtb_Gain3 = rtb_Sum1 + rtb_Switch1; rtb_Switch1 = (rtb_Gain3 & 134217728) != 0 ? rtb_Gain3 | -134217728 : rtb_Gain3 & 134217727; /* Switch: '/Switch2' */ if (rtb_RelationalOperator1_mv) { /* Update for UnitDelay: '/UnitDelay' */ rtDW->UnitDelay_DSTATE = rtb_Sum1_jt; } else { /* Update for UnitDelay: '/UnitDelay' */ rtDW->UnitDelay_DSTATE = rtb_Switch1; } /* End of Switch: '/Switch2' */ /* End of Outputs for SubSystem: '/Rate_Limiter' */ /* DataTypeConversion: '/Data Type Conversion1' */ rtDW->Merge1 = (int16_T)(rtb_Switch1 >> 12); /* End of Outputs for SubSystem: '/Open_Mode' */ break; case 1: /* Outputs for IfAction SubSystem: '/Default_Mode' incorporates: * ActionPort: '/Action Port' */ rtDW->Merge1 = rtb_Saturation; /* End of Outputs for SubSystem: '/Default_Mode' */ break; } /* End of If: '/If2' */ /* Abs: '/Abs1' */ if (rtDW->Merge1 < 0) { rtDW->Abs1 = (int16_T)-rtDW->Merge1; } else { rtDW->Abs1 = rtDW->Merge1; } /* End of Abs: '/Abs1' */ /* End of Outputs for SubSystem: '/F03_Control_Mode_Manager' */ } else if (rtDW->UnitDelay5_DSTATE_m) { /* Outputs for Function Call SubSystem: '/F04_Field_Weakening' */ /* If: '/If3' incorporates: * Constant: '/b_fieldWeakEna' */ if (rtP->b_fieldWeakEna) { /* Outputs for IfAction SubSystem: '/Field_Weakening_Enabled' incorporates: * ActionPort: '/Action Port' */ /* Abs: '/Abs5' */ if (DataTypeConversion2 < 0) { DataTypeConversion2 = (int16_T)-DataTypeConversion2; } /* End of Abs: '/Abs5' */ /* Switch: '/Switch2' incorporates: * Constant: '/r_fieldWeakHi' * Constant: '/r_fieldWeakLo' * RelationalOperator: '/LowerRelop1' * RelationalOperator: '/UpperRelop' * Switch: '/Switch' */ if (DataTypeConversion2 > rtP->r_fieldWeakHi) { DataTypeConversion2 = rtP->r_fieldWeakHi; } else { if (DataTypeConversion2 < rtP->r_fieldWeakLo) { /* Switch: '/Switch' incorporates: * Constant: '/r_fieldWeakLo' */ DataTypeConversion2 = rtP->r_fieldWeakLo; } } /* End of Switch: '/Switch2' */ /* Switch: '/Switch2' incorporates: * Constant: '/z_ctrlTypSel' * Constant: '/CTRL_COMM2' * Constant: '/a_phaAdvMax' * Constant: '/id_fieldWeakMax' * RelationalOperator: '/Relational Operator1' */ if (rtP->z_ctrlTypSel == 2) { rtb_Saturation1 = rtP->id_fieldWeakMax; } else { rtb_Saturation1 = rtP->a_phaAdvMax; } /* End of Switch: '/Switch2' */ /* Switch: '/Switch2' incorporates: * Constant: '/n_fieldWeakAuthHi' * Constant: '/n_fieldWeakAuthLo' * RelationalOperator: '/LowerRelop1' * RelationalOperator: '/UpperRelop' * Switch: '/Switch' */ if (Abs5 > rtP->n_fieldWeakAuthHi) { rtb_Saturation = rtP->n_fieldWeakAuthHi; } else if (Abs5 < rtP->n_fieldWeakAuthLo) { /* Switch: '/Switch' incorporates: * Constant: '/n_fieldWeakAuthLo' */ rtb_Saturation = rtP->n_fieldWeakAuthLo; } else { rtb_Saturation = Abs5; } /* End of Switch: '/Switch2' */ /* Product: '/Divide3' incorporates: * Constant: '/n_fieldWeakAuthHi' * Constant: '/n_fieldWeakAuthLo' * Constant: '/r_fieldWeakHi' * Constant: '/r_fieldWeakLo' * Product: '/Divide1' * Product: '/Divide14' * Product: '/Divide2' * Sum: '/Sum1' * Sum: '/Sum2' * Sum: '/Sum3' * Sum: '/Sum4' */ rtDW->Divide3 = (int16_T)(((uint16_T)(((uint32_T)(uint16_T)(((int16_T) (DataTypeConversion2 - rtP->r_fieldWeakLo) << 15) / (int16_T) (rtP->r_fieldWeakHi - rtP->r_fieldWeakLo)) * (uint16_T)(((int16_T) (rtb_Saturation - rtP->n_fieldWeakAuthLo) << 15) / (int16_T) (rtP->n_fieldWeakAuthHi - rtP->n_fieldWeakAuthLo))) >> 15) * rtb_Saturation1) >> 15); /* End of Outputs for SubSystem: '/Field_Weakening_Enabled' */ } /* End of If: '/If3' */ /* End of Outputs for SubSystem: '/F04_Field_Weakening' */ /* Outputs for Function Call SubSystem: '/Motor_Limitations' */ /* If: '/If1' incorporates: * Constant: '/z_ctrlTypSel' * Constant: '/Vd_max1' * Constant: '/i_max' */ rtb_Sum2_h = rtDW->If1_ActiveSubsystem_o; UnitDelay3 = -1; if (rtP->z_ctrlTypSel == 2) { UnitDelay3 = 0; } rtDW->If1_ActiveSubsystem_o = UnitDelay3; if ((rtb_Sum2_h != UnitDelay3) && (rtb_Sum2_h == 0)) { /* Disable for SwitchCase: '/Switch Case' */ rtDW->SwitchCase_ActiveSubsystem_d = -1; } if (UnitDelay3 == 0) { /* Outputs for IfAction SubSystem: '/Motor_Limitations_Enabled' incorporates: * ActionPort: '/Action Port' */ rtDW->Vd_max1 = rtP->Vd_max; /* Gain: '/Gain3' incorporates: * Constant: '/Vd_max1' */ rtDW->Gain3 = (int16_T)-rtDW->Vd_max1; /* Interpolation_n-D: '/Vq_max_M1' incorporates: * Abs: '/Abs5' * PreLookup: '/Vq_max_XA' * UnitDelay: '/UnitDelay4' */ if (rtDW->Switch1 < 0) { rtb_Saturation1 = (int16_T)-rtDW->Switch1; } else { rtb_Saturation1 = rtDW->Switch1; } rtDW->Vq_max_M1 = rtP->Vq_max_M1[plook_u8s16_evencka(rtb_Saturation1, rtP->Vq_max_XA[0], (uint16_T)(rtP->Vq_max_XA[1] - rtP->Vq_max_XA[0]), 45U)]; /* End of Interpolation_n-D: '/Vq_max_M1' */ /* Gain: '/Gain5' */ rtDW->Gain5 = (int16_T)-rtDW->Vq_max_M1; rtDW->i_max = rtP->i_max; /* Interpolation_n-D: '/iq_maxSca_M1' incorporates: * Constant: '/i_max' * Product: '/Divide4' */ rtb_Gain3 = rtDW->Divide3 << 16; rtb_Gain3 = (rtb_Gain3 == MIN_int32_T) && (rtDW->i_max == -1) ? MAX_int32_T : rtb_Gain3 / rtDW->i_max; if (rtb_Gain3 < 0) { rtb_Gain3 = 0; } else { if (rtb_Gain3 > 65535) { rtb_Gain3 = 65535; } } /* Product: '/Divide1' incorporates: * Interpolation_n-D: '/iq_maxSca_M1' * PreLookup: '/iq_maxSca_XA' * Product: '/Divide4' */ rtDW->Divide1_n = (int16_T) ((rtConstP.iq_maxSca_M1_Table[plook_u8u16_evencka((uint16_T)rtb_Gain3, 0U, 1311U, 49U)] * rtDW->i_max) >> 16); /* Gain: '/Gain1' */ rtDW->Gain1 = (int16_T)-rtDW->Divide1_n; /* SwitchCase: '/Switch Case' incorporates: * Constant: '/n_max1' * Constant: '/Constant1' * Constant: '/cf_KbLimProt' * Constant: '/cf_nKiLimProt' * Constant: '/Constant' * Constant: '/Constant1' * Constant: '/cf_KbLimProt' * Constant: '/cf_iqKiLimProt' * Constant: '/cf_nKiLimProt' * Sum: '/Sum1' * Sum: '/Sum1' * Sum: '/Sum2' */ rtb_Sum2_h = rtDW->SwitchCase_ActiveSubsystem_d; UnitDelay3 = -1; switch (rtDW->z_ctrlMod) { case 1: UnitDelay3 = 0; break; case 2: UnitDelay3 = 1; break; case 3: UnitDelay3 = 2; break; } rtDW->SwitchCase_ActiveSubsystem_d = UnitDelay3; switch (UnitDelay3) { case 0: if (UnitDelay3 != rtb_Sum2_h) { /* SystemReset for IfAction SubSystem: '/Voltage_Mode_Protection' incorporates: * ActionPort: '/Action Port' */ /* SystemReset for Atomic SubSystem: '/I_backCalc_fixdt' */ /* SystemReset for SwitchCase: '/Switch Case' */ I_backCalc_fixdt_Reset(&rtDW->I_backCalc_fixdt_i, 65536000); /* End of SystemReset for SubSystem: '/I_backCalc_fixdt' */ /* SystemReset for Atomic SubSystem: '/I_backCalc_fixdt1' */ I_backCalc_fixdt_Reset(&rtDW->I_backCalc_fixdt1, 65536000); /* End of SystemReset for SubSystem: '/I_backCalc_fixdt1' */ /* End of SystemReset for SubSystem: '/Voltage_Mode_Protection' */ } /* Outputs for IfAction SubSystem: '/Voltage_Mode_Protection' incorporates: * ActionPort: '/Action Port' */ /* Outputs for Atomic SubSystem: '/I_backCalc_fixdt' */ I_backCalc_fixdt((int16_T)(rtDW->Divide1_n - rtDW->Abs5_h), rtP->cf_iqKiLimProt, rtP->cf_KbLimProt, rtDW->Abs1, 0, &rtDW->Switch2_a, &rtDW->I_backCalc_fixdt_i); /* End of Outputs for SubSystem: '/I_backCalc_fixdt' */ /* Outputs for Atomic SubSystem: '/I_backCalc_fixdt1' */ I_backCalc_fixdt((int16_T)(rtP->n_max - Abs5), rtP->cf_nKiLimProt, rtP->cf_KbLimProt, rtDW->Abs1, 0, &rtDW->Switch2_o, &rtDW->I_backCalc_fixdt1); /* End of Outputs for SubSystem: '/I_backCalc_fixdt1' */ /* End of Outputs for SubSystem: '/Voltage_Mode_Protection' */ break; case 1: /* Outputs for IfAction SubSystem: '/Speed_Mode_Protection' incorporates: * ActionPort: '/Action Port' */ /* Switch: '/Switch2' incorporates: * RelationalOperator: '/LowerRelop1' * RelationalOperator: '/UpperRelop' * Switch: '/Switch' */ if (rtDW->DataTypeConversion[0] > rtDW->Divide1_n) { rtb_Saturation1 = rtDW->Divide1_n; } else if (rtDW->DataTypeConversion[0] < rtDW->Gain1) { /* Switch: '/Switch' */ rtb_Saturation1 = rtDW->Gain1; } else { rtb_Saturation1 = rtDW->DataTypeConversion[0]; } /* End of Switch: '/Switch2' */ /* Product: '/Divide1' incorporates: * Constant: '/cf_iqKiLimProt' * Sum: '/Sum3' */ rtDW->Divide1 = (int16_T)(rtb_Saturation1 - rtDW->DataTypeConversion[0]) * rtP->cf_iqKiLimProt; /* End of Outputs for SubSystem: '/Speed_Mode_Protection' */ break; case 2: if (UnitDelay3 != rtb_Sum2_h) { /* SystemReset for IfAction SubSystem: '/Torque_Mode_Protection' incorporates: * ActionPort: '/Action Port' */ /* SystemReset for Atomic SubSystem: '/I_backCalc_fixdt' */ /* SystemReset for SwitchCase: '/Switch Case' */ I_backCalc_fixdt_Reset(&rtDW->I_backCalc_fixdt_j, 58982400); /* End of SystemReset for SubSystem: '/I_backCalc_fixdt' */ /* End of SystemReset for SubSystem: '/Torque_Mode_Protection' */ } /* Outputs for IfAction SubSystem: '/Torque_Mode_Protection' incorporates: * ActionPort: '/Action Port' */ /* Outputs for Atomic SubSystem: '/I_backCalc_fixdt' */ I_backCalc_fixdt((int16_T)(rtP->n_max - Abs5), rtP->cf_nKiLimProt, rtP->cf_KbLimProt, rtDW->Vq_max_M1, 0, &rtDW->Switch2_i, &rtDW->I_backCalc_fixdt_j); /* End of Outputs for SubSystem: '/I_backCalc_fixdt' */ /* End of Outputs for SubSystem: '/Torque_Mode_Protection' */ break; } /* End of SwitchCase: '/Switch Case' */ /* Gain: '/Gain4' */ rtDW->Gain4 = (int16_T)-rtDW->i_max; /* End of Outputs for SubSystem: '/Motor_Limitations_Enabled' */ } /* End of If: '/If1' */ /* End of Outputs for SubSystem: '/Motor_Limitations' */ } else { if (rtDW->UnitDelay6_DSTATE) { /* Outputs for Function Call SubSystem: '/FOC' */ /* If: '/If1' incorporates: * Constant: '/z_ctrlTypSel' */ rtb_Sum2_h = rtDW->If1_ActiveSubsystem_j; UnitDelay3 = -1; if (rtP->z_ctrlTypSel == 2) { UnitDelay3 = 0; } rtDW->If1_ActiveSubsystem_j = UnitDelay3; if ((rtb_Sum2_h != UnitDelay3) && (rtb_Sum2_h == 0)) { /* Disable for SwitchCase: '/Switch Case' */ rtDW->SwitchCase_ActiveSubsystem = -1; /* Disable for If: '/If1' */ rtDW->If1_ActiveSubsystem_a = -1; } if (UnitDelay3 == 0) { /* Outputs for IfAction SubSystem: '/FOC_Enabled' incorporates: * ActionPort: '/Action Port' */ /* SwitchCase: '/Switch Case' incorporates: * Constant: '/cf_nKi' * Constant: '/cf_nKp' * Inport: '/r_inpTgtSca' * Sum: '/Sum3' * UnitDelay: '/UnitDelay4' */ rtb_Sum2_h = rtDW->SwitchCase_ActiveSubsystem; switch (rtDW->z_ctrlMod) { case 1: break; case 2: UnitDelay3 = 1; break; case 3: UnitDelay3 = 2; break; default: UnitDelay3 = 3; break; } rtDW->SwitchCase_ActiveSubsystem = UnitDelay3; switch (UnitDelay3) { case 0: /* Outputs for IfAction SubSystem: '/Voltage_Mode' incorporates: * ActionPort: '/Action Port' */ /* MinMax: '/MinMax' */ if (rtDW->Abs1 < rtDW->Switch2_a) { DataTypeConversion2 = rtDW->Abs1; } else { DataTypeConversion2 = rtDW->Switch2_a; } if (!(DataTypeConversion2 < rtDW->Switch2_o)) { DataTypeConversion2 = rtDW->Switch2_o; } /* End of MinMax: '/MinMax' */ /* Signum: '/SignDeltaU2' */ if (rtDW->Merge1 < 0) { rtb_Saturation1 = -1; } else { rtb_Saturation1 = (int16_T)(rtDW->Merge1 > 0); } /* End of Signum: '/SignDeltaU2' */ /* Product: '/Divide1' */ rtb_Saturation = (int16_T)(DataTypeConversion2 * rtb_Saturation1); /* Switch: '/Switch2' incorporates: * RelationalOperator: '/LowerRelop1' * RelationalOperator: '/UpperRelop' * Switch: '/Switch' */ if (rtb_Saturation > rtDW->Vq_max_M1) { /* SignalConversion: '/Signal Conversion2' */ rtDW->Merge = rtDW->Vq_max_M1; } else if (rtb_Saturation < rtDW->Gain5) { /* Switch: '/Switch' incorporates: * SignalConversion: '/Signal Conversion2' */ rtDW->Merge = rtDW->Gain5; } else { /* SignalConversion: '/Signal Conversion2' incorporates: * Switch: '/Switch' */ rtDW->Merge = rtb_Saturation; } /* End of Switch: '/Switch2' */ /* End of Outputs for SubSystem: '/Voltage_Mode' */ break; case 1: if (UnitDelay3 != rtb_Sum2_h) { /* SystemReset for IfAction SubSystem: '/Speed_Mode' incorporates: * ActionPort: '/Action Port' */ /* SystemReset for Atomic SubSystem: '/PI_clamp_fixdt' */ /* SystemReset for SwitchCase: '/Switch Case' */ PI_clamp_fixdt_b_Reset(&rtDW->PI_clamp_fixdt_l4); /* End of SystemReset for SubSystem: '/PI_clamp_fixdt' */ /* End of SystemReset for SubSystem: '/Speed_Mode' */ } /* Outputs for IfAction SubSystem: '/Speed_Mode' incorporates: * ActionPort: '/Action Port' */ /* DataTypeConversion: '/Data Type Conversion2' incorporates: * Constant: '/n_cruiseMotTgt' */ rtb_Saturation = (int16_T)(rtP->n_cruiseMotTgt << 4); /* Switch: '/Switch4' incorporates: * Constant: '/b_cruiseCtrlEna' * Logic: '/Logical Operator1' * RelationalOperator: '/Relational Operator3' */ if (rtP->b_cruiseCtrlEna && (rtb_Saturation != 0)) { /* Switch: '/Switch3' incorporates: * MinMax: '/MinMax4' */ if (rtb_Saturation > 0) { rtb_TmpSignalConversionAtLow_Pa[0] = rtDW->Vq_max_M1; /* MinMax: '/MinMax3' */ if (rtDW->Merge1 > rtDW->Gain5) { rtb_TmpSignalConversionAtLow_Pa[1] = rtDW->Merge1; } else { rtb_TmpSignalConversionAtLow_Pa[1] = rtDW->Gain5; } /* End of MinMax: '/MinMax3' */ } else { if (rtDW->Vq_max_M1 < rtDW->Merge1) { /* MinMax: '/MinMax4' */ rtb_TmpSignalConversionAtLow_Pa[0] = rtDW->Vq_max_M1; } else { rtb_TmpSignalConversionAtLow_Pa[0] = rtDW->Merge1; } rtb_TmpSignalConversionAtLow_Pa[1] = rtDW->Gain5; } /* End of Switch: '/Switch3' */ } else { rtb_TmpSignalConversionAtLow_Pa[0] = rtDW->Vq_max_M1; rtb_TmpSignalConversionAtLow_Pa[1] = rtDW->Gain5; } /* End of Switch: '/Switch4' */ /* Switch: '/Switch2' incorporates: * Constant: '/b_cruiseCtrlEna' */ if (!rtP->b_cruiseCtrlEna) { rtb_Saturation = rtDW->Merge1; } /* End of Switch: '/Switch2' */ /* Sum: '/Sum3' */ rtb_Gain3 = rtb_Saturation - Switch2; if (rtb_Gain3 > 32767) { rtb_Gain3 = 32767; } else { if (rtb_Gain3 < -32768) { rtb_Gain3 = -32768; } } /* Outputs for Atomic SubSystem: '/PI_clamp_fixdt' */ PI_clamp_fixdt_l((int16_T)rtb_Gain3, rtP->cf_nKp, rtP->cf_nKi, rtDW->UnitDelay4_DSTATE_eu, rtb_TmpSignalConversionAtLow_Pa[0], rtb_TmpSignalConversionAtLow_Pa[1], rtDW->Divide1, &rtDW->Merge, &rtDW->PI_clamp_fixdt_l4); /* End of Outputs for SubSystem: '/PI_clamp_fixdt' */ /* End of Outputs for SubSystem: '/Speed_Mode' */ break; case 2: if (UnitDelay3 != rtb_Sum2_h) { /* SystemReset for IfAction SubSystem: '/Torque_Mode' incorporates: * ActionPort: '/Action Port' */ /* SystemReset for Atomic SubSystem: '/PI_clamp_fixdt' */ /* SystemReset for SwitchCase: '/Switch Case' */ PI_clamp_fixdt_g_Reset(&rtDW->PI_clamp_fixdt_kh); /* End of SystemReset for SubSystem: '/PI_clamp_fixdt' */ /* End of SystemReset for SubSystem: '/Torque_Mode' */ } /* Outputs for IfAction SubSystem: '/Torque_Mode' incorporates: * ActionPort: '/Action Port' */ /* Gain: '/Gain4' */ rtb_Saturation = (int16_T)-rtDW->Switch2_i; /* Switch: '/Switch2' incorporates: * RelationalOperator: '/LowerRelop1' * RelationalOperator: '/UpperRelop' * Switch: '/Switch' */ if (rtDW->Merge1 > rtDW->Divide1_n) { rtb_Saturation1 = rtDW->Divide1_n; } else if (rtDW->Merge1 < rtDW->Gain1) { /* Switch: '/Switch' */ rtb_Saturation1 = rtDW->Gain1; } else { rtb_Saturation1 = rtDW->Merge1; } /* End of Switch: '/Switch2' */ /* Sum: '/Sum2' */ rtb_Gain3 = rtb_Saturation1 - rtDW->DataTypeConversion[0]; if (rtb_Gain3 > 32767) { rtb_Gain3 = 32767; } else { if (rtb_Gain3 < -32768) { rtb_Gain3 = -32768; } } /* MinMax: '/MinMax1' */ if (rtDW->Vq_max_M1 < rtDW->Switch2_i) { rtb_Saturation1 = rtDW->Vq_max_M1; } else { rtb_Saturation1 = rtDW->Switch2_i; } /* End of MinMax: '/MinMax1' */ /* MinMax: '/MinMax2' */ if (!(rtb_Saturation > rtDW->Gain5)) { rtb_Saturation = rtDW->Gain5; } /* End of MinMax: '/MinMax2' */ /* Outputs for Atomic SubSystem: '/PI_clamp_fixdt' */ /* SignalConversion: '/Signal Conversion2' incorporates: * Constant: '/cf_iqKi' * Constant: '/cf_iqKp' * Constant: '/constant2' * Sum: '/Sum2' * UnitDelay: '/UnitDelay4' */ PI_clamp_fixdt_k((int16_T)rtb_Gain3, rtP->cf_iqKp, rtP->cf_iqKi, rtDW->UnitDelay4_DSTATE_eu, rtb_Saturation1, rtb_Saturation, 0, &rtDW->Merge, &rtDW->PI_clamp_fixdt_kh); /* End of Outputs for SubSystem: '/PI_clamp_fixdt' */ /* End of Outputs for SubSystem: '/Torque_Mode' */ break; case 3: /* Outputs for IfAction SubSystem: '/Open_Mode' incorporates: * ActionPort: '/Action Port' */ rtDW->Merge = rtDW->Merge1; /* End of Outputs for SubSystem: '/Open_Mode' */ break; } /* End of SwitchCase: '/Switch Case' */ /* If: '/If1' incorporates: * Constant: '/cf_idKi1' * Constant: '/cf_idKp1' * Constant: '/constant1' * Constant: '/constant2' * Sum: '/Sum3' */ rtb_Sum2_h = rtDW->If1_ActiveSubsystem_a; UnitDelay3 = -1; if (rtb_LogicalOperator) { UnitDelay3 = 0; } rtDW->If1_ActiveSubsystem_a = UnitDelay3; if (UnitDelay3 == 0) { if (0 != rtb_Sum2_h) { /* SystemReset for IfAction SubSystem: '/Vd_Calculation' incorporates: * ActionPort: '/Action Port' */ /* SystemReset for Atomic SubSystem: '/PI_clamp_fixdt' */ /* SystemReset for If: '/If1' */ PI_clamp_fixdt_Reset(&rtDW->PI_clamp_fixdt_i); /* End of SystemReset for SubSystem: '/PI_clamp_fixdt' */ /* End of SystemReset for SubSystem: '/Vd_Calculation' */ } /* Outputs for IfAction SubSystem: '/Vd_Calculation' incorporates: * ActionPort: '/Action Port' */ /* Gain: '/toNegative' */ rtb_Saturation = (int16_T)-rtDW->Divide3; /* Switch: '/Switch2' incorporates: * RelationalOperator: '/LowerRelop1' * RelationalOperator: '/UpperRelop' * Switch: '/Switch' */ if (rtb_Saturation > rtDW->i_max) { rtb_Saturation = rtDW->i_max; } else { if (rtb_Saturation < rtDW->Gain4) { /* Switch: '/Switch' */ rtb_Saturation = rtDW->Gain4; } } /* End of Switch: '/Switch2' */ /* Sum: '/Sum3' */ rtb_Gain3 = rtb_Saturation - rtDW->DataTypeConversion[1]; if (rtb_Gain3 > 32767) { rtb_Gain3 = 32767; } else { if (rtb_Gain3 < -32768) { rtb_Gain3 = -32768; } } /* Outputs for Atomic SubSystem: '/PI_clamp_fixdt' */ PI_clamp_fixdt((int16_T)rtb_Gain3, rtP->cf_idKp, rtP->cf_idKi, 0, rtDW->Vd_max1, rtDW->Gain3, 0, &rtDW->Switch1, &rtDW->PI_clamp_fixdt_i); /* End of Outputs for SubSystem: '/PI_clamp_fixdt' */ /* End of Outputs for SubSystem: '/Vd_Calculation' */ } /* End of If: '/If1' */ /* End of Outputs for SubSystem: '/FOC_Enabled' */ } /* End of If: '/If1' */ /* End of Outputs for SubSystem: '/FOC' */ } } /* End of Chart: '/Task_Scheduler' */ /* If: '/If2' incorporates: * Constant: '/z_ctrlTypSel' * Constant: '/CTRL_COMM1' * RelationalOperator: '/Relational Operator6' * Switch: '/Switch2' */ rtb_Sum2_h = rtDW->If2_ActiveSubsystem; UnitDelay3 = -1; if (rtP->z_ctrlTypSel == 2) { rtb_Saturation = rtDW->Merge; UnitDelay3 = 0; } else { rtb_Saturation = rtDW->Merge1; } rtDW->If2_ActiveSubsystem = UnitDelay3; if ((rtb_Sum2_h != UnitDelay3) && (rtb_Sum2_h == 0)) { /* Disable for Outport: '/V_phaABC_FOC' */ rtDW->Gain4_e[0] = 0; rtDW->Gain4_e[1] = 0; rtDW->Gain4_e[2] = 0; } if (UnitDelay3 == 0) { /* Outputs for IfAction SubSystem: '/Clarke_Park_Transform_Inverse' incorporates: * ActionPort: '/Action Port' */ /* Sum: '/Sum6' incorporates: * Product: '/Divide1' * Product: '/Divide4' */ rtb_Gain3 = (int16_T)((rtDW->Switch1 * rtDW->r_cos_M1) >> 14) - (int16_T) ((rtDW->Merge * rtDW->r_sin_M1) >> 14); if (rtb_Gain3 > 32767) { rtb_Gain3 = 32767; } else { if (rtb_Gain3 < -32768) { rtb_Gain3 = -32768; } } /* Sum: '/Sum1' incorporates: * Product: '/Divide2' * Product: '/Divide3' */ rtb_Sum1_jt = (int16_T)((rtDW->Switch1 * rtDW->r_sin_M1) >> 14) + (int16_T) ((rtDW->Merge * rtDW->r_cos_M1) >> 14); if (rtb_Sum1_jt > 32767) { rtb_Sum1_jt = 32767; } else { if (rtb_Sum1_jt < -32768) { rtb_Sum1_jt = -32768; } } /* Gain: '/Gain1' incorporates: * Sum: '/Sum1' */ rtb_Sum1_jt *= 14189; /* Sum: '/Sum6' incorporates: * Gain: '/Gain1' * Gain: '/Gain3' * Sum: '/Sum6' */ rtb_Sum1_jt = (((rtb_Sum1_jt < 0 ? 16383 : 0) + rtb_Sum1_jt) >> 14) - ((int16_T)(((int16_T)rtb_Gain3 < 0) + (int16_T)rtb_Gain3) >> 1); if (rtb_Sum1_jt > 32767) { rtb_Sum1_jt = 32767; } else { if (rtb_Sum1_jt < -32768) { rtb_Sum1_jt = -32768; } } /* Sum: '/Sum2' incorporates: * Sum: '/Sum6' * Sum: '/Sum6' */ rtb_Switch1 = -(int16_T)rtb_Gain3 - (int16_T)rtb_Sum1_jt; if (rtb_Switch1 > 32767) { rtb_Switch1 = 32767; } else { if (rtb_Switch1 < -32768) { rtb_Switch1 = -32768; } } /* MinMax: '/MinMax1' incorporates: * Sum: '/Sum2' * Sum: '/Sum6' * Sum: '/Sum6' */ DataTypeConversion2 = (int16_T)rtb_Gain3; if (!((int16_T)rtb_Gain3 < (int16_T)rtb_Sum1_jt)) { DataTypeConversion2 = (int16_T)rtb_Sum1_jt; } if (!(DataTypeConversion2 < (int16_T)rtb_Switch1)) { DataTypeConversion2 = (int16_T)rtb_Switch1; } /* MinMax: '/MinMax2' incorporates: * Sum: '/Sum2' * Sum: '/Sum6' * Sum: '/Sum6' */ rtb_Saturation1 = (int16_T)rtb_Gain3; if (!((int16_T)rtb_Gain3 > (int16_T)rtb_Sum1_jt)) { rtb_Saturation1 = (int16_T)rtb_Sum1_jt; } if (!(rtb_Saturation1 > (int16_T)rtb_Switch1)) { rtb_Saturation1 = (int16_T)rtb_Switch1; } /* Sum: '/Add' incorporates: * MinMax: '/MinMax1' * MinMax: '/MinMax2' */ rtb_Sum1 = DataTypeConversion2 + rtb_Saturation1; if (rtb_Sum1 > 32767) { rtb_Sum1 = 32767; } else { if (rtb_Sum1 < -32768) { rtb_Sum1 = -32768; } } /* Gain: '/Gain2' incorporates: * Sum: '/Add' */ rtb_Merge1 = (int16_T)(rtb_Sum1 >> 1); /* Sum: '/Add1' incorporates: * Sum: '/Sum6' */ rtb_Gain3 = (int16_T)rtb_Gain3 - rtb_Merge1; if (rtb_Gain3 > 32767) { rtb_Gain3 = 32767; } else { if (rtb_Gain3 < -32768) { rtb_Gain3 = -32768; } } /* Gain: '/Gain4' incorporates: * Sum: '/Add1' */ rtDW->Gain4_e[0] = (int16_T)((18919 * rtb_Gain3) >> 14); /* Sum: '/Add1' incorporates: * Sum: '/Sum6' */ rtb_Gain3 = (int16_T)rtb_Sum1_jt - rtb_Merge1; if (rtb_Gain3 > 32767) { rtb_Gain3 = 32767; } else { if (rtb_Gain3 < -32768) { rtb_Gain3 = -32768; } } /* Gain: '/Gain4' incorporates: * Sum: '/Add1' */ rtDW->Gain4_e[1] = (int16_T)((18919 * rtb_Gain3) >> 14); /* Sum: '/Add1' incorporates: * Sum: '/Sum2' */ rtb_Gain3 = (int16_T)rtb_Switch1 - rtb_Merge1; if (rtb_Gain3 > 32767) { rtb_Gain3 = 32767; } else { if (rtb_Gain3 < -32768) { rtb_Gain3 = -32768; } } /* Gain: '/Gain4' incorporates: * Sum: '/Add1' */ rtDW->Gain4_e[2] = (int16_T)((18919 * rtb_Gain3) >> 14); /* End of Outputs for SubSystem: '/Clarke_Park_Transform_Inverse' */ } /* End of If: '/If2' */ /* If: '/If' incorporates: * Constant: '/vec_hallToPos' * Constant: '/z_ctrlTypSel' * Constant: '/CTRL_COMM2' * Constant: '/CTRL_COMM3' * Inport: '/V_phaABC_FOC_in' * Logic: '/Logical Operator1' * Logic: '/Logical Operator2' * LookupNDDirect: '/z_commutMap_M1' * RelationalOperator: '/Relational Operator1' * RelationalOperator: '/Relational Operator2' * Selector: '/Selector' * * About '/z_commutMap_M1': * 2-dimensional Direct Look-Up returning a Column */ if (rtb_LogicalOperator && (rtP->z_ctrlTypSel == 2)) { /* Outputs for IfAction SubSystem: '/FOC_Method' incorporates: * ActionPort: '/Action Port' */ DataTypeConversion2 = rtDW->Gain4_e[0]; rtb_Saturation1 = rtDW->Gain4_e[1]; rtb_Merge1 = rtDW->Gain4_e[2]; /* End of Outputs for SubSystem: '/FOC_Method' */ } else if (rtb_LogicalOperator && (rtP->z_ctrlTypSel == 1)) { /* Outputs for IfAction SubSystem: '/SIN_Method' incorporates: * ActionPort: '/Action Port' */ /* Switch: '/Switch_PhaAdv' incorporates: * Constant: '/b_fieldWeakEna' * Product: '/Divide2' * Product: '/Divide3' * Sum: '/Sum3' */ if (rtP->b_fieldWeakEna) { /* Sum: '/Sum3' incorporates: * Product: '/Product2' */ DataTypeConversion2 = (int16_T)((int16_T)((int16_T)(rtDW->Divide3 * rtDW->Switch2_e) << 2) + rtb_Merge_m); DataTypeConversion2 -= (int16_T)((int16_T)((int16_T)div_nde_s32_floor (DataTypeConversion2, 23040) * 360) << 6); } else { DataTypeConversion2 = rtb_Merge_m; } /* End of Switch: '/Switch_PhaAdv' */ /* PreLookup: '/a_elecAngle_XA' */ Sum = plook_u8s16_evencka(DataTypeConversion2, 0, 128U, 180U); /* Product: '/Divide2' incorporates: * Interpolation_n-D: '/r_sin3PhaA_M1' * Interpolation_n-D: '/r_sin3PhaB_M1' * Interpolation_n-D: '/r_sin3PhaC_M1' */ DataTypeConversion2 = (int16_T)((rtb_Saturation * rtConstP.r_sin3PhaA_M1_Table[Sum]) >> 14); rtb_Saturation1 = (int16_T)((rtb_Saturation * rtConstP.r_sin3PhaB_M1_Table[Sum]) >> 14); rtb_Merge1 = (int16_T)((rtb_Saturation * rtConstP.r_sin3PhaC_M1_Table[Sum]) >> 14); /* End of Outputs for SubSystem: '/SIN_Method' */ } else { /* Outputs for IfAction SubSystem: '/COM_Method' incorporates: * ActionPort: '/Action Port' */ if (rtConstP.vec_hallToPos_Value[Sum] > 5) { /* LookupNDDirect: '/z_commutMap_M1' * * About '/z_commutMap_M1': * 2-dimensional Direct Look-Up returning a Column */ rtb_Sum2_h = 5; } else if (rtConstP.vec_hallToPos_Value[Sum] < 0) { /* LookupNDDirect: '/z_commutMap_M1' * * About '/z_commutMap_M1': * 2-dimensional Direct Look-Up returning a Column */ rtb_Sum2_h = 0; } else { /* LookupNDDirect: '/z_commutMap_M1' incorporates: * Constant: '/vec_hallToPos' * Selector: '/Selector' * * About '/z_commutMap_M1': * 2-dimensional Direct Look-Up returning a Column */ rtb_Sum2_h = rtConstP.vec_hallToPos_Value[Sum]; } /* LookupNDDirect: '/z_commutMap_M1' incorporates: * Constant: '/vec_hallToPos' * Selector: '/Selector' * * About '/z_commutMap_M1': * 2-dimensional Direct Look-Up returning a Column */ rtb_Sum1_jt = rtb_Sum2_h * 3; /* Product: '/Divide2' incorporates: * LookupNDDirect: '/z_commutMap_M1' * * About '/z_commutMap_M1': * 2-dimensional Direct Look-Up returning a Column */ DataTypeConversion2 = (int16_T)(rtb_Saturation * rtConstP.z_commutMap_M1_table[rtb_Sum1_jt]); rtb_Saturation1 = (int16_T)(rtConstP.z_commutMap_M1_table[1 + rtb_Sum1_jt] * rtb_Saturation); rtb_Merge1 = (int16_T)(rtConstP.z_commutMap_M1_table[2 + rtb_Sum1_jt] * rtb_Saturation); /* End of Outputs for SubSystem: '/COM_Method' */ } /* End of If: '/If' */ /* Outport: '/DC_phaA' incorporates: * DataTypeConversion: '/Data Type Conversion6' */ rtY->DC_phaA = (int16_T)(DataTypeConversion2 >> 4); /* Outport: '/DC_phaB' incorporates: * DataTypeConversion: '/Data Type Conversion6' */ rtY->DC_phaB = (int16_T)(rtb_Saturation1 >> 4); /* Update for UnitDelay: '/UnitDelay3' incorporates: * Inport: '/b_hallA ' */ rtDW->UnitDelay3_DSTATE_fy = rtU->b_hallA; /* Update for UnitDelay: '/UnitDelay1' incorporates: * Inport: '/b_hallB' */ rtDW->UnitDelay1_DSTATE = rtU->b_hallB; /* Update for UnitDelay: '/UnitDelay2' incorporates: * Inport: '/b_hallC' */ rtDW->UnitDelay2_DSTATE_f = rtU->b_hallC; /* Update for UnitDelay: '/UnitDelay3' */ rtDW->UnitDelay3_DSTATE = rtb_Switch1_l; /* Update for UnitDelay: '/UnitDelay4' */ rtDW->UnitDelay4_DSTATE_e = Abs5; /* Update for UnitDelay: '/UnitDelay2' incorporates: * UnitDelay: '/UnitDelay6' */ rtDW->UnitDelay2_DSTATE_c = rtDW->UnitDelay6_DSTATE; /* Update for UnitDelay: '/UnitDelay5' */ rtDW->UnitDelay5_DSTATE_m = rtb_RelationalOperator4_d; /* Update for UnitDelay: '/UnitDelay6' */ rtDW->UnitDelay6_DSTATE = rtb_UnitDelay5_e; /* Update for UnitDelay: '/UnitDelay4' */ rtDW->UnitDelay4_DSTATE_eu = rtb_Saturation; /* Outport: '/DC_phaC' incorporates: * DataTypeConversion: '/Data Type Conversion6' */ rtY->DC_phaC = (int16_T)(rtb_Merge1 >> 4); /* Outport: '/n_mot' incorporates: * DataTypeConversion: '/Data Type Conversion1' */ rtY->n_mot = (int16_T)(Switch2 >> 4); /* Outport: '/a_elecAngle' incorporates: * DataTypeConversion: '/Data Type Conversion3' */ rtY->a_elecAngle = (int16_T)(rtb_Merge_m >> 6); /* End of Outputs for SubSystem: '/BLDC_controller' */ /* Outport: '/iq' */ rtY->iq = rtDW->DataTypeConversion[0]; /* Outport: '/id' */ rtY->id = rtDW->DataTypeConversion[1]; } /* Model initialize function */ void BLDC_controller_initialize(RT_MODEL *const rtM) { P *rtP = ((P *) rtM->defaultParam); DW *rtDW = ((DW *) rtM->dwork); /* Start for Atomic SubSystem: '/BLDC_controller' */ /* Start for If: '/If1' */ rtDW->If1_ActiveSubsystem = -1; /* Start for IfAction SubSystem: '/Clarke_Park_Transform_Forward' */ /* Start for If: '/If2' */ rtDW->If2_ActiveSubsystem_a = -1; /* End of Start for SubSystem: '/Clarke_Park_Transform_Forward' */ /* Start for Chart: '/Task_Scheduler' incorporates: * SubSystem: '/F03_Control_Mode_Manager' */ /* Start for If: '/If2' */ rtDW->If2_ActiveSubsystem_f = -1; /* Start for Chart: '/Task_Scheduler' incorporates: * SubSystem: '/Motor_Limitations' */ /* Start for If: '/If1' */ rtDW->If1_ActiveSubsystem_o = -1; /* Start for IfAction SubSystem: '/Motor_Limitations_Enabled' */ /* Start for SwitchCase: '/Switch Case' */ rtDW->SwitchCase_ActiveSubsystem_d = -1; /* End of Start for SubSystem: '/Motor_Limitations_Enabled' */ /* Start for Chart: '/Task_Scheduler' incorporates: * SubSystem: '/FOC' */ /* Start for If: '/If1' */ rtDW->If1_ActiveSubsystem_j = -1; /* Start for IfAction SubSystem: '/FOC_Enabled' */ /* Start for SwitchCase: '/Switch Case' */ rtDW->SwitchCase_ActiveSubsystem = -1; /* Start for If: '/If1' */ rtDW->If1_ActiveSubsystem_a = -1; /* End of Start for SubSystem: '/FOC_Enabled' */ /* Start for If: '/If2' */ rtDW->If2_ActiveSubsystem = -1; /* End of Start for SubSystem: '/BLDC_controller' */ /* SystemInitialize for Atomic SubSystem: '/BLDC_controller' */ /* InitializeConditions for UnitDelay: '/UnitDelay3' */ rtDW->UnitDelay3_DSTATE = rtP->z_maxCntRst; /* InitializeConditions for UnitDelay: '/UnitDelay2' */ rtDW->UnitDelay2_DSTATE_c = true; /* SystemInitialize for IfAction SubSystem: '/Raw_Motor_Speed_Estimation' */ /* SystemInitialize for Outport: '/z_counter' */ rtDW->z_counterRawPrev = rtP->z_maxCntRst; /* End of SystemInitialize for SubSystem: '/Raw_Motor_Speed_Estimation' */ /* SystemInitialize for Atomic SubSystem: '/Counter' */ Counter_Init(&rtDW->Counter_e, rtP->z_maxCntRst); /* End of SystemInitialize for SubSystem: '/Counter' */ /* SystemInitialize for Chart: '/Task_Scheduler' incorporates: * SubSystem: '/F02_Diagnostics' */ /* SystemInitialize for IfAction SubSystem: '/Diagnostics_Enabled' */ /* SystemInitialize for Atomic SubSystem: '/Debounce_Filter' */ Debounce_Filter_Init(&rtDW->Debounce_Filter_k); /* End of SystemInitialize for SubSystem: '/Debounce_Filter' */ /* End of SystemInitialize for SubSystem: '/Diagnostics_Enabled' */ /* SystemInitialize for Chart: '/Task_Scheduler' incorporates: * SubSystem: '/F03_Control_Mode_Manager' */ /* SystemInitialize for IfAction SubSystem: '/Open_Mode' */ /* SystemInitialize for Atomic SubSystem: '/rising_edge_init' */ /* InitializeConditions for UnitDelay: '/UnitDelay' */ rtDW->UnitDelay_DSTATE_b = true; /* End of SystemInitialize for SubSystem: '/rising_edge_init' */ /* End of SystemInitialize for SubSystem: '/Open_Mode' */ /* SystemInitialize for Chart: '/Task_Scheduler' incorporates: * SubSystem: '/Motor_Limitations' */ /* SystemInitialize for IfAction SubSystem: '/Motor_Limitations_Enabled' */ /* SystemInitialize for IfAction SubSystem: '/Voltage_Mode_Protection' */ /* SystemInitialize for Atomic SubSystem: '/I_backCalc_fixdt' */ I_backCalc_fixdt_Init(&rtDW->I_backCalc_fixdt_i, 65536000); /* End of SystemInitialize for SubSystem: '/I_backCalc_fixdt' */ /* SystemInitialize for Atomic SubSystem: '/I_backCalc_fixdt1' */ I_backCalc_fixdt_Init(&rtDW->I_backCalc_fixdt1, 65536000); /* End of SystemInitialize for SubSystem: '/I_backCalc_fixdt1' */ /* End of SystemInitialize for SubSystem: '/Voltage_Mode_Protection' */ /* SystemInitialize for IfAction SubSystem: '/Torque_Mode_Protection' */ /* SystemInitialize for Atomic SubSystem: '/I_backCalc_fixdt' */ I_backCalc_fixdt_Init(&rtDW->I_backCalc_fixdt_j, 58982400); /* End of SystemInitialize for SubSystem: '/I_backCalc_fixdt' */ /* End of SystemInitialize for SubSystem: '/Torque_Mode_Protection' */ /* SystemInitialize for Outport: '/Vd_max' */ rtDW->Vd_max1 = 14400; /* SystemInitialize for Outport: '/Vd_min' */ rtDW->Gain3 = -14400; /* SystemInitialize for Outport: '/Vq_max' */ rtDW->Vq_max_M1 = 14400; /* SystemInitialize for Outport: '/Vq_min' */ rtDW->Gain5 = -14400; /* SystemInitialize for Outport: '/id_max' */ rtDW->i_max = 12000; /* SystemInitialize for Outport: '/id_min' */ rtDW->Gain4 = -12000; /* SystemInitialize for Outport: '/iq_max' */ rtDW->Divide1_n = 12000; /* SystemInitialize for Outport: '/iq_min' */ rtDW->Gain1 = -12000; /* End of SystemInitialize for SubSystem: '/Motor_Limitations_Enabled' */ /* SystemInitialize for Chart: '/Task_Scheduler' incorporates: * SubSystem: '/FOC' */ /* SystemInitialize for IfAction SubSystem: '/FOC_Enabled' */ /* SystemInitialize for IfAction SubSystem: '/Speed_Mode' */ /* SystemInitialize for Atomic SubSystem: '/PI_clamp_fixdt' */ PI_clamp_fixdt_d_Init(&rtDW->PI_clamp_fixdt_l4); /* End of SystemInitialize for SubSystem: '/PI_clamp_fixdt' */ /* End of SystemInitialize for SubSystem: '/Speed_Mode' */ /* SystemInitialize for IfAction SubSystem: '/Torque_Mode' */ /* SystemInitialize for Atomic SubSystem: '/PI_clamp_fixdt' */ PI_clamp_fixdt_f_Init(&rtDW->PI_clamp_fixdt_kh); /* End of SystemInitialize for SubSystem: '/PI_clamp_fixdt' */ /* End of SystemInitialize for SubSystem: '/Torque_Mode' */ /* SystemInitialize for IfAction SubSystem: '/Vd_Calculation' */ /* SystemInitialize for Atomic SubSystem: '/PI_clamp_fixdt' */ PI_clamp_fixdt_Init(&rtDW->PI_clamp_fixdt_i); /* End of SystemInitialize for SubSystem: '/PI_clamp_fixdt' */ /* End of SystemInitialize for SubSystem: '/Vd_Calculation' */ /* End of SystemInitialize for SubSystem: '/FOC_Enabled' */ /* End of SystemInitialize for SubSystem: '/BLDC_controller' */ } /* * File trailer for generated code. * * [EOF] */