/* * File: PMSM_Controller.c * * Code generated for Simulink model 'PMSM_Controller'. * * Model version : 1.885 * Simulink Coder version : 9.4 (R2020b) 29-Jul-2020 * C/C++ source code generated on : Sat Jan 8 15:44:11 2022 * * Target selection: ert.tlc * Embedded hardware selection: ARM Compatible->ARM Cortex-M * Code generation objectives: * 1. Execution efficiency * 2. RAM efficiency * Validation result: Not run */ #include "PMSM_Controller.h" #include "PMSM_Controller_private.h" static void rate_scheduler(RT_MODEL *const rtM); uint16_T plook_u16u16_evencka(uint16_T u, uint16_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)((uint32_T)u - bp0) / bpSpace); if (bpIndex < maxIndex) { } else { bpIndex = (uint16_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; } /* * This function updates active task flag for each subrate. * The function is called at model base rate, hence the * generated code self-manages all its subrates. */ static void rate_scheduler(RT_MODEL *const rtM) { /* Compute which subrates run during the next base time step. Subrates * are an integer multiple of the base rate counter. Therefore, the subtask * counter is reset when it reaches its limit (zero means run). */ (rtM->Timing.TaskCounters.TID[1])++; if ((rtM->Timing.TaskCounters.TID[1]) > 9) {/* Sample time: [6.2E-5s, 0.0s] */ rtM->Timing.TaskCounters.TID[1] = 0; } } real_T rt_modd_snf(real_T u0, real_T u1) { real_T q; real_T y; boolean_T yEq; y = u0; if (u1 == 0.0) { if (u0 == 0.0) { y = u1; } } else if (rtIsNaN(u0) || rtIsNaN(u1) || rtIsInf(u0)) { y = (rtNaN); } else if (u0 == 0.0) { y = 0.0 / u1; } else if (rtIsInf(u1)) { if ((u1 < 0.0) != (u0 < 0.0)) { y = u1; } } else { y = fmod(u0, u1); yEq = (y == 0.0); if ((!yEq) && (u1 > floor(u1))) { q = fabs(u0 / u1); yEq = !(fabs(q - floor(q + 0.5)) > DBL_EPSILON * q); } if (yEq) { y = u1 * 0.0; } else { if ((u0 < 0.0) != (u1 < 0.0)) { y += u1; } } } return y; } real_T rt_roundd_snf(real_T u) { real_T y; if (fabs(u) < 4.503599627370496E+15) { if (u >= 0.5) { y = floor(u + 0.5); } else if (u > -0.5) { y = u * 0.0; } else { y = ceil(u - 0.5); } } else { y = u; } return y; } /* Model step function */ void PMSM_Controller_step(RT_MODEL *const rtM, int16_T rtU_Vdc, uint16_T rtU_Ts, int16_T rtU_adc_a, int16_T rtU_adc_b, real_T rtU_rotor_angle, int16_T rtU_rotor_speed, int16_T rtU_input_target, uint16_T rtY_pwm_counts[8], uint8_T *rtY_sector) { DW *rtDW = rtM->dwork; int32_T rtb_Sum1_tmp; int32_T rtb_Sum3_idx_0; int32_T rtb_Sum3_idx_1; int32_T tmp; int32_T tmp_0; int16_T rtb_Divide; int16_T rtb_Divide4; int16_T rtb_Divide7; int16_T rtb_Multiply_idx_0; int16_T rtb_Multiply_idx_1; int16_T rtb_SignPreIntegrator; int16_T rtb_SignPreSat; int16_T rtb_SignPreSat_k; int16_T rtb_Sum1; int16_T rtb_Sum2; int16_T rtb_Sum3_l; uint16_T rtb_DataTypeConversion3; uint16_T rtb_MultiportSwitch_idx_0; uint16_T rtb_MultiportSwitch_idx_1; uint16_T rtb_o_samp_p1; uint8_T rtb_DataTypeConversion_a; boolean_T rtb_NotEqual; /* Gain: '/Multiply' incorporates: * Inport: '/adc_a' * Inport: '/adc_b' */ rtb_Multiply_idx_0 = (int16_T)((19761 * rtU_adc_a) >> 17); rtb_Multiply_idx_1 = (int16_T)((19761 * rtU_adc_b) >> 17); /* Outputs for Atomic SubSystem: '/controller' */ /* PreLookup: '/a_elecAngle_XA' incorporates: * Constant: '/Constant1' * Gain: '/Gain' * Inport: '/rotor_angle' * Math: '/Math Function' */ rtb_o_samp_p1 = plook_u16u16_evencka((uint16_T)(57.295779513082323 * rt_modd_snf(rtU_rotor_angle, 6.2831853071795862)), 0U, 1U, 360U); /* Sum: '/Add1' incorporates: * Product: '/Divide4' * Sum: '/Add' */ rtb_Divide4 = (int16_T)-(rtb_Multiply_idx_0 + rtb_Multiply_idx_1); /* Gain: '/Gain1' incorporates: * Gain: '/Gain' * Product: '/Divide' * Product: '/Divide4' * Sum: '/Add' * Sum: '/Add1' */ rtb_Divide = (int16_T)(((((rtb_Multiply_idx_0 << 1) - rtb_Multiply_idx_1) - rtb_Divide4) * 21845) >> 16); /* Gain: '/Gain2' incorporates: * Product: '/Divide4' * Sum: '/Add2' */ rtb_Divide4 = (int16_T)(((rtb_Multiply_idx_1 - rtb_Divide4) * 18919) >> 15); /* Sum: '/Sum1' incorporates: * Interpolation_n-D: '/r_cos_M1' * Interpolation_n-D: '/r_sin_M1' * Product: '/Divide' * Product: '/Divide4' * Product: '/Divide2' * Product: '/Divide3' */ rtb_Sum1_tmp = ((rtb_Divide * rtConstP.r_cos_M1_Table[rtb_o_samp_p1]) >> 14) + ((rtb_Divide4 * rtConstP.r_sin_M1_Table[rtb_o_samp_p1]) >> 14); if (rtb_Sum1_tmp > 32767) { rtb_Sum1_tmp = 32767; } else { if (rtb_Sum1_tmp < -32768) { rtb_Sum1_tmp = -32768; } } /* Sum: '/Sum2' incorporates: * Sum: '/Sum1' * UnitDelay: '/UnitDelay1' */ rtb_Sum1_tmp -= rtDW->UnitDelay1_DSTATE[0] >> 16; if (rtb_Sum1_tmp > 32767) { rtb_Sum1_tmp = 32767; } else { if (rtb_Sum1_tmp < -32768) { rtb_Sum1_tmp = -32768; } } /* Sum: '/Sum3' incorporates: * Constant: '/Constant' * Product: '/Divide3' * Sum: '/Sum2' * UnitDelay: '/UnitDelay1' */ rtb_Sum3_idx_0 = 13107 * rtb_Sum1_tmp + rtDW->UnitDelay1_DSTATE[0]; /* Sum: '/Sum6' incorporates: * Interpolation_n-D: '/r_cos_M1' * Interpolation_n-D: '/r_sin_M1' * Product: '/Divide' * Product: '/Divide4' * Product: '/Divide1' * Product: '/Divide4' */ rtb_Sum1_tmp = ((rtb_Divide4 * rtConstP.r_cos_M1_Table[rtb_o_samp_p1]) >> 14) - ((rtb_Divide * rtConstP.r_sin_M1_Table[rtb_o_samp_p1]) >> 14); if (rtb_Sum1_tmp > 32767) { rtb_Sum1_tmp = 32767; } else { if (rtb_Sum1_tmp < -32768) { rtb_Sum1_tmp = -32768; } } /* Sum: '/Sum2' incorporates: * Sum: '/Sum6' * UnitDelay: '/UnitDelay1' */ rtb_Sum1_tmp -= rtDW->UnitDelay1_DSTATE[1] >> 16; if (rtb_Sum1_tmp > 32767) { rtb_Sum1_tmp = 32767; } else { if (rtb_Sum1_tmp < -32768) { rtb_Sum1_tmp = -32768; } } /* Sum: '/Sum3' incorporates: * Constant: '/Constant' * Product: '/Divide3' * Sum: '/Sum2' * UnitDelay: '/UnitDelay1' */ rtb_Sum3_idx_1 = 13107 * rtb_Sum1_tmp + rtDW->UnitDelay1_DSTATE[1]; /* DataTypeConversion: '/Data Type Conversion' incorporates: * Sum: '/Sum3' */ rtb_Multiply_idx_0 = (int16_T)(rtb_Sum3_idx_0 >> 16); /* Sum: '/Sum' incorporates: * DiscreteIntegrator: '/Integrator' * Gain: '/Proportional Gain' * Signum: '/SignPreSat' * Sum: '/Sum1' */ rtb_Multiply_idx_1 = (int16_T)((((int16_T)(9 * (int16_T)-rtb_Multiply_idx_0) << 15) + (int32_T)((rtDW->Integrator_DSTATE * 1704243LL) >> 23)) >> 15); /* Saturate: '/Saturation' incorporates: * Product: '/Divide' * Signum: '/SignPreSat' */ if (rtb_Multiply_idx_1 > 8960) { rtb_Divide = 8960; } else if (rtb_Multiply_idx_1 < -8960) { rtb_Divide = -8960; } else { rtb_Divide = rtb_Multiply_idx_1; } /* End of Saturate: '/Saturation' */ /* Sum: '/Sum3' incorporates: * Inport: '/input_target' * Inport: '/rotor_speed' */ rtb_Sum3_l = (int16_T)(rtU_input_target - rtU_rotor_speed); /* Sum: '/Sum' incorporates: * DiscreteIntegrator: '/Integrator' * Gain: '/Proportional Gain' * Signum: '/SignPreSat' */ rtb_SignPreSat = (int16_T)((rtDW->Integrator_DSTATE_i * 26629 < 0 ? -1 : 0) + (rtb_Sum3_l << 4)); /* Saturate: '/Saturation' incorporates: * Signum: '/SignPreSat' */ if (rtb_SignPreSat > 800) { rtb_Divide4 = 800; } else if (rtb_SignPreSat < -800) { rtb_Divide4 = -800; } else { rtb_Divide4 = rtb_SignPreSat; } /* End of Saturate: '/Saturation' */ /* Sum: '/Sum2' incorporates: * DataTypeConversion: '/Data Type Conversion' * Sum: '/Sum3' */ rtb_Sum2 = (int16_T)(rtb_Divide4 - (int16_T)(rtb_Sum3_idx_1 >> 16)); /* Sum: '/Sum' incorporates: * DiscreteIntegrator: '/Integrator' * Gain: '/Proportional Gain' * Signum: '/SignPreSat' * Sum: '/Sum2' */ rtb_SignPreSat_k = (int16_T)((((int16_T)(10 * rtb_Sum2) << 15) + (int32_T) ((rtDW->Integrator_DSTATE_p * 1704243LL) >> 23)) >> 15); /* Saturate: '/Saturation' incorporates: * Signum: '/SignPreSat' * Signum: '/SignPreIntegrator' */ if (rtb_SignPreSat_k > 8960) { rtb_SignPreIntegrator = 8960; } else if (rtb_SignPreSat_k < -8960) { rtb_SignPreIntegrator = -8960; } else { rtb_SignPreIntegrator = rtb_SignPreSat_k; } /* End of Saturate: '/Saturation' */ /* Sum: '/Sum1' incorporates: * Interpolation_n-D: '/r_cos_M1' * Interpolation_n-D: '/r_sin_M1' * Product: '/Divide' * Product: '/Divide2' * Product: '/Divide3' * Signum: '/SignPreIntegrator' */ rtb_Sum1_tmp = ((rtb_Divide * rtConstP.r_sin_M1_Table[rtb_o_samp_p1]) >> 14) + ((rtb_SignPreIntegrator * rtConstP.r_cos_M1_Table[rtb_o_samp_p1]) >> 14); if (rtb_Sum1_tmp > 32767) { rtb_Sum1_tmp = 32767; } else { if (rtb_Sum1_tmp < -32768) { rtb_Sum1_tmp = -32768; } } /* Sum: '/Sum6' incorporates: * Interpolation_n-D: '/r_cos_M1' * Interpolation_n-D: '/r_sin_M1' * Product: '/Divide' * Product: '/Divide1' * Product: '/Divide4' * Signum: '/SignPreIntegrator' */ tmp_0 = ((rtb_Divide * rtConstP.r_cos_M1_Table[rtb_o_samp_p1]) >> 14) - ((rtb_SignPreIntegrator * rtConstP.r_sin_M1_Table[rtb_o_samp_p1]) >> 14); if (tmp_0 > 32767) { tmp_0 = 32767; } else { if (tmp_0 < -32768) { tmp_0 = -32768; } } /* Product: '/Divide7' incorporates: * Constant: '/Constant3' * Sum: '/Sum1' */ rtb_Divide7 = (int16_T)((2365 * (int16_T)rtb_Sum1_tmp) >> 10); /* MATLAB Function: '/sector_select' incorporates: * Product: '/Divide7' * Sum: '/Sum1' * Sum: '/Sum6' */ if ((int16_T)rtb_Sum1_tmp >= 0) { if ((int16_T)tmp_0 >= 0) { if (rtb_Divide7 > ((int16_T)tmp_0 << 2)) { /* DataTypeConversion: '/Data Type Conversion' */ rtb_DataTypeConversion_a = 2U; } else { /* DataTypeConversion: '/Data Type Conversion' */ rtb_DataTypeConversion_a = 1U; } } else { tmp = -rtb_Divide7; if (-rtb_Divide7 > 32767) { tmp = 32767; } if (tmp > ((int16_T)tmp_0 << 2)) { /* DataTypeConversion: '/Data Type Conversion' */ rtb_DataTypeConversion_a = 3U; } else { /* DataTypeConversion: '/Data Type Conversion' */ rtb_DataTypeConversion_a = 2U; } } } else if ((int16_T)tmp_0 >= 0) { tmp = -rtb_Divide7; if (-rtb_Divide7 > 32767) { tmp = 32767; } if (tmp > ((int16_T)tmp_0 << 2)) { /* DataTypeConversion: '/Data Type Conversion' */ rtb_DataTypeConversion_a = 5U; } else { /* DataTypeConversion: '/Data Type Conversion' */ rtb_DataTypeConversion_a = 6U; } } else if (rtb_Divide7 > ((int16_T)tmp_0 << 2)) { /* DataTypeConversion: '/Data Type Conversion' */ rtb_DataTypeConversion_a = 4U; } else { /* DataTypeConversion: '/Data Type Conversion' */ rtb_DataTypeConversion_a = 5U; } /* End of MATLAB Function: '/sector_select' */ /* Product: '/Divide' incorporates: * DataTypeConversion: '/Data Type Conversion6' * Inport: '/Ts' * Inport: '/Vdc' */ rtb_Divide = (int16_T)div_nde_s32_floor((int16_T)rtU_Ts << 10, rtU_Vdc); /* Product: '/Divide8' incorporates: * Constant: '/Constant' * Product: '/Divide2' * Product: '/Divide4' * Sum: '/Sum1' */ rtb_Sum1_tmp = 2365 * (int16_T)((3547 * (int16_T)rtb_Sum1_tmp) >> 10); /* Product: '/Divide1' incorporates: * Product: '/Divide' * Product: '/Divide8' */ rtb_Sum1 = (int16_T)(((int16_T)(rtb_Sum1_tmp >> 11) * rtb_Divide) >> 12); /* Product: '/Divide3' incorporates: * Constant: '/Constant1' * Signum: '/SignPreIntegrator' * Sum: '/Sum6' */ rtb_SignPreIntegrator = (int16_T)((3547 * (int16_T)tmp_0) >> 10); /* Product: '/Divide4' */ rtb_Divide4 = (int16_T)(rtb_Sum1_tmp >> 12); /* Product: '/Divide5' incorporates: * Product: '/Divide' * Product: '/Divide4' * Signum: '/SignPreIntegrator' * Sum: '/Add' */ rtb_Divide7 = (int16_T)(((int16_T)(rtb_SignPreIntegrator + rtb_Divide4) * rtb_Divide) >> 12); /* Product: '/Divide6' incorporates: * Product: '/Divide' * Product: '/Divide4' * Signum: '/SignPreIntegrator' * Sum: '/Add1' */ rtb_SignPreIntegrator = (int16_T)(((int16_T)(rtb_Divide4 - rtb_SignPreIntegrator) * rtb_Divide) >> 12); /* MATLAB Function: '/phase_time' incorporates: * DataTypeConversion: '/Data Type Conversion1' * DataTypeConversion: '/Data Type Conversion2' * Inport: '/Ts' */ switch ((int8_T)rtb_DataTypeConversion_a) { case 1: rtb_Sum1_tmp = -rtb_SignPreIntegrator; if (-rtb_SignPreIntegrator > 32767) { rtb_Sum1_tmp = 32767; } tmp_0 = (int16_T)rtU_Ts - (int16_T)rtb_Sum1_tmp; if (tmp_0 > 32767) { tmp_0 = 32767; } else { if (tmp_0 < -32768) { tmp_0 = -32768; } } tmp_0 -= rtb_Sum1; if (tmp_0 > 32767) { tmp_0 = 32767; } else { if (tmp_0 < -32768) { tmp_0 = -32768; } } rtb_Divide = (int16_T)rt_roundd_snf((real_T)tmp_0 / 4.0); rtb_Sum1 = (int16_T)((int32_T)rt_roundd_snf((real_T)rtb_Sum1 / 2.0) + rtb_Divide); rtb_Sum1_tmp = (int32_T)rt_roundd_snf((real_T)(int16_T)rtb_Sum1_tmp / 2.0) + rtb_Sum1; if (rtb_Sum1_tmp > 32767) { rtb_Sum1_tmp = 32767; } else { if (rtb_Sum1_tmp < -32768) { rtb_Sum1_tmp = -32768; } } rtb_Divide7 = (int16_T)rtb_Sum1_tmp; break; case 2: rtb_Sum1_tmp = (int16_T)rtU_Ts - rtb_Divide7; if (rtb_Sum1_tmp > 32767) { rtb_Sum1_tmp = 32767; } else { if (rtb_Sum1_tmp < -32768) { rtb_Sum1_tmp = -32768; } } rtb_Sum1_tmp -= rtb_SignPreIntegrator; if (rtb_Sum1_tmp > 32767) { rtb_Sum1_tmp = 32767; } else { if (rtb_Sum1_tmp < -32768) { rtb_Sum1_tmp = -32768; } } rtb_Divide = (int16_T)rt_roundd_snf((real_T)rtb_Sum1_tmp / 4.0); rtb_Divide7 = (int16_T)((int32_T)rt_roundd_snf((real_T)rtb_Divide7 / 2.0) + rtb_Divide); rtb_Sum1_tmp = (int32_T)rt_roundd_snf((real_T)rtb_SignPreIntegrator / 2.0) + rtb_Divide7; if (rtb_Sum1_tmp > 32767) { rtb_Sum1_tmp = 32767; } else { if (rtb_Sum1_tmp < -32768) { rtb_Sum1_tmp = -32768; } } rtb_Sum1 = (int16_T)rtb_Sum1_tmp; break; case 3: rtb_Sum1_tmp = -rtb_Divide7; if (-rtb_Divide7 > 32767) { rtb_Sum1_tmp = 32767; } tmp_0 = (int16_T)rtU_Ts - rtb_Sum1; if (tmp_0 > 32767) { tmp_0 = 32767; } else { if (tmp_0 < -32768) { tmp_0 = -32768; } } tmp_0 -= (int16_T)rtb_Sum1_tmp; if (tmp_0 > 32767) { tmp_0 = 32767; } else { if (tmp_0 < -32768) { tmp_0 = -32768; } } rtb_Divide7 = (int16_T)rt_roundd_snf((real_T)tmp_0 / 4.0); rtb_Divide = (int16_T)((int32_T)rt_roundd_snf((real_T)(int16_T)rtb_Sum1_tmp / 2.0) + rtb_Divide7); rtb_Sum1_tmp = (int32_T)rt_roundd_snf((real_T)rtb_Sum1 / 2.0) + rtb_Divide; if (rtb_Sum1_tmp > 32767) { rtb_Sum1_tmp = 32767; } else { if (rtb_Sum1_tmp < -32768) { rtb_Sum1_tmp = -32768; } } rtb_Sum1 = (int16_T)rtb_Sum1_tmp; break; case 4: rtb_Sum1_tmp = -rtb_Sum1; if (-rtb_Sum1 > 32767) { rtb_Sum1_tmp = 32767; } tmp_0 = (int16_T)rtU_Ts - (int16_T)rtb_Sum1_tmp; if (tmp_0 > 32767) { tmp_0 = 32767; } else { if (tmp_0 < -32768) { tmp_0 = -32768; } } tmp_0 -= rtb_SignPreIntegrator; if (tmp_0 > 32767) { tmp_0 = 32767; } else { if (tmp_0 < -32768) { tmp_0 = -32768; } } rtb_Divide7 = (int16_T)rt_roundd_snf((real_T)tmp_0 / 4.0); rtb_Sum1 = (int16_T)((int32_T)rt_roundd_snf((real_T)rtb_SignPreIntegrator / 2.0) + rtb_Divide7); rtb_Sum1_tmp = (int32_T)rt_roundd_snf((real_T)(int16_T)rtb_Sum1_tmp / 2.0) + rtb_Sum1; if (rtb_Sum1_tmp > 32767) { rtb_Sum1_tmp = 32767; } else { if (rtb_Sum1_tmp < -32768) { rtb_Sum1_tmp = -32768; } } rtb_Divide = (int16_T)rtb_Sum1_tmp; break; case 5: rtb_Sum1_tmp = -rtb_Divide7; if (-rtb_Divide7 > 32767) { rtb_Sum1_tmp = 32767; } tmp_0 = -rtb_SignPreIntegrator; if (-rtb_SignPreIntegrator > 32767) { tmp_0 = 32767; } tmp = (int16_T)rtU_Ts - (int16_T)rtb_Sum1_tmp; if (tmp > 32767) { tmp = 32767; } else { if (tmp < -32768) { tmp = -32768; } } tmp -= (int16_T)tmp_0; if (tmp > 32767) { tmp = 32767; } else { if (tmp < -32768) { tmp = -32768; } } rtb_Sum1 = (int16_T)rt_roundd_snf((real_T)tmp / 4.0); rtb_Divide7 = (int16_T)((int32_T)rt_roundd_snf((real_T)(int16_T)tmp_0 / 2.0) + rtb_Sum1); rtb_Sum1_tmp = (int32_T)rt_roundd_snf((real_T)(int16_T)rtb_Sum1_tmp / 2.0) + rtb_Divide7; if (rtb_Sum1_tmp > 32767) { rtb_Sum1_tmp = 32767; } else { if (rtb_Sum1_tmp < -32768) { rtb_Sum1_tmp = -32768; } } rtb_Divide = (int16_T)rtb_Sum1_tmp; break; default: rtb_Sum1_tmp = -rtb_Sum1; if (-rtb_Sum1 > 32767) { rtb_Sum1_tmp = 32767; } tmp_0 = (int16_T)rtU_Ts - rtb_Divide7; if (tmp_0 > 32767) { tmp_0 = 32767; } else { if (tmp_0 < -32768) { tmp_0 = -32768; } } tmp_0 -= (int16_T)rtb_Sum1_tmp; if (tmp_0 > 32767) { tmp_0 = 32767; } else { if (tmp_0 < -32768) { tmp_0 = -32768; } } rtb_Sum1 = (int16_T)rt_roundd_snf((real_T)tmp_0 / 4.0); rtb_Divide = (int16_T)((int32_T)rt_roundd_snf((real_T)(int16_T)rtb_Sum1_tmp / 2.0) + rtb_Sum1); rtb_Sum1_tmp = (int32_T)rt_roundd_snf((real_T)rtb_Divide7 / 2.0) + rtb_Divide; if (rtb_Sum1_tmp > 32767) { rtb_Sum1_tmp = 32767; } else { if (rtb_Sum1_tmp < -32768) { rtb_Sum1_tmp = -32768; } } rtb_Divide7 = (int16_T)rtb_Sum1_tmp; break; } /* DataTypeConversion: '/Data Type Conversion3' incorporates: * MATLAB Function: '/phase_time' */ rtb_DataTypeConversion3 = (uint16_T)rtb_Divide7; /* MultiPortSwitch: '/Multiport Switch' incorporates: * DataTypeConversion: '/Data Type Conversion3' * DataTypeConversion: '/Data Type Conversion4' * DataTypeConversion: '/Data Type Conversion5' * MATLAB Function: '/phase_time' */ switch (rtb_DataTypeConversion_a) { case 1: rtb_MultiportSwitch_idx_0 = (uint16_T)rtb_Divide7; rtb_MultiportSwitch_idx_1 = (uint16_T)rtb_Sum1; break; case 2: rtb_MultiportSwitch_idx_0 = (uint16_T)rtb_Sum1; rtb_MultiportSwitch_idx_1 = (uint16_T)rtb_Divide7; break; case 3: rtb_MultiportSwitch_idx_0 = (uint16_T)rtb_Sum1; rtb_MultiportSwitch_idx_1 = (uint16_T)rtb_Divide; break; case 4: rtb_MultiportSwitch_idx_0 = (uint16_T)rtb_Divide; rtb_MultiportSwitch_idx_1 = (uint16_T)rtb_Sum1; break; case 5: rtb_MultiportSwitch_idx_0 = (uint16_T)rtb_Divide; rtb_MultiportSwitch_idx_1 = (uint16_T)rtb_Divide7; break; default: rtb_MultiportSwitch_idx_0 = (uint16_T)rtb_Divide7; rtb_MultiportSwitch_idx_1 = (uint16_T)rtb_Divide; break; } /* End of MultiPortSwitch: '/Multiport Switch' */ /* Outport: '/pwm_counts' incorporates: * Constant: '/Constant' * Constant: '/Constant1' * Constant: '/Constant2' * Constant: '/Constant3' * MATLAB Function: '/Shunt_Three_Sample_Point' * Outport: '/sector' */ Shunt_Three_Sample_Point(rtb_MultiportSwitch_idx_0, rtb_MultiportSwitch_idx_1, rtb_DataTypeConversion_a, 4000, 10, 10, 10, &rtb_o_samp_p1, &rtY_pwm_counts [7], rtY_sector); /* DeadZone: '/DeadZone' incorporates: * Signum: '/SignPreSat' */ if (rtb_SignPreSat_k > 8960) { rtb_SignPreSat_k = (int16_T)(rtb_SignPreSat_k - 8960); } else if (rtb_SignPreSat_k >= -8960) { rtb_SignPreSat_k = 0; } else { rtb_SignPreSat_k = (int16_T)(rtb_SignPreSat_k - -8960); } /* End of DeadZone: '/DeadZone' */ /* RelationalOperator: '/NotEqual' incorporates: * Gain: '/ZeroGain' * Signum: '/SignPreSat' */ rtb_NotEqual = (0 != rtb_SignPreSat_k); /* Signum: '/SignPreSat' */ if (rtb_SignPreSat_k < 0) { rtb_SignPreSat_k = -1; } else { rtb_SignPreSat_k = (int16_T)(rtb_SignPreSat_k > 0); } /* End of Signum: '/SignPreSat' */ /* Gain: '/Integral Gain' incorporates: * Gain: '/Integral Gain' * Sum: '/Sum2' */ rtb_Divide7 = (int16_T)(1080 * rtb_Sum2); /* Signum: '/SignPreIntegrator' incorporates: * Gain: '/Integral Gain' */ if (rtb_Divide7 < 0) { rtb_Divide4 = -1; } else { rtb_Divide4 = (int16_T)(rtb_Divide7 > 0); } /* End of Signum: '/SignPreIntegrator' */ /* Switch: '/Switch' incorporates: * Constant: '/Constant1' * DataTypeConversion: '/DataTypeConv1' * DataTypeConversion: '/DataTypeConv2' * Gain: '/Integral Gain' * Logic: '/AND3' * RelationalOperator: '/Equal1' */ if (rtb_NotEqual && (rtb_SignPreSat_k == rtb_Divide4)) { rtb_Sum2 = 0; } else { rtb_Sum2 = rtb_Divide7; } /* End of Switch: '/Switch' */ /* DeadZone: '/DeadZone' incorporates: * Signum: '/SignPreSat' */ if (rtb_SignPreSat > 800) { rtb_SignPreSat = (int16_T)(rtb_SignPreSat - 800); } else if (rtb_SignPreSat >= -800) { rtb_SignPreSat = 0; } else { rtb_SignPreSat = (int16_T)(rtb_SignPreSat - -800); } /* End of DeadZone: '/DeadZone' */ /* RelationalOperator: '/NotEqual' incorporates: * Gain: '/ZeroGain' * Signum: '/SignPreSat' */ rtb_NotEqual = (0 != rtb_SignPreSat); /* Signum: '/SignPreSat' */ if (rtb_SignPreSat < 0) { rtb_SignPreSat = -1; } else { rtb_SignPreSat = (int16_T)(rtb_SignPreSat > 0); } /* End of Signum: '/SignPreSat' */ /* Gain: '/Integral Gain' incorporates: * Gain: '/Integral Gain' */ rtb_Divide7 = (int16_T)((int16_T)(200 * rtb_Sum3_l) << 4); /* Signum: '/SignPreIntegrator' incorporates: * Gain: '/Integral Gain' */ if (rtb_Divide7 < 0) { rtb_Divide4 = -1; } else { rtb_Divide4 = (int16_T)(rtb_Divide7 > 0); } /* End of Signum: '/SignPreIntegrator' */ /* Switch: '/Switch' incorporates: * Constant: '/Constant1' * DataTypeConversion: '/DataTypeConv1' * DataTypeConversion: '/DataTypeConv2' * Gain: '/Integral Gain' * Logic: '/AND3' * RelationalOperator: '/Equal1' */ if (rtb_NotEqual && (rtb_SignPreSat == rtb_Divide4)) { rtb_Sum3_l = 0; } else { rtb_Sum3_l = rtb_Divide7; } /* End of Switch: '/Switch' */ /* DeadZone: '/DeadZone' incorporates: * Signum: '/SignPreSat' */ if (rtb_Multiply_idx_1 > 8960) { rtb_Multiply_idx_1 = (int16_T)(rtb_Multiply_idx_1 - 8960); } else if (rtb_Multiply_idx_1 >= -8960) { rtb_Multiply_idx_1 = 0; } else { rtb_Multiply_idx_1 = (int16_T)(rtb_Multiply_idx_1 - -8960); } /* End of DeadZone: '/DeadZone' */ /* RelationalOperator: '/NotEqual' incorporates: * Gain: '/ZeroGain' * Signum: '/SignPreSat' */ rtb_NotEqual = (0 != rtb_Multiply_idx_1); /* Signum: '/SignPreSat' */ if (rtb_Multiply_idx_1 < 0) { rtb_Multiply_idx_1 = -1; } else { rtb_Multiply_idx_1 = (int16_T)(rtb_Multiply_idx_1 > 0); } /* End of Signum: '/SignPreSat' */ /* Gain: '/Integral Gain' incorporates: * Sum: '/Sum1' */ rtb_Divide7 = (int16_T)(1071 * (int16_T)-rtb_Multiply_idx_0); /* Update for UnitDelay: '/UnitDelay1' incorporates: * Sum: '/Sum3' */ rtDW->UnitDelay1_DSTATE[0] = rtb_Sum3_idx_0; rtDW->UnitDelay1_DSTATE[1] = rtb_Sum3_idx_1; /* Signum: '/SignPreIntegrator' incorporates: * Gain: '/Integral Gain' */ if (rtb_Divide7 < 0) { rtb_Divide4 = -1; } else { rtb_Divide4 = (int16_T)(rtb_Divide7 > 0); } /* End of Signum: '/SignPreIntegrator' */ /* Switch: '/Switch' incorporates: * Constant: '/Constant1' * DataTypeConversion: '/DataTypeConv1' * DataTypeConversion: '/DataTypeConv2' * Logic: '/AND3' * RelationalOperator: '/Equal1' */ if (rtb_NotEqual && (rtb_Multiply_idx_1 == rtb_Divide4)) { rtb_Divide7 = 0; } /* End of Switch: '/Switch' */ /* Update for DiscreteIntegrator: '/Integrator' */ rtDW->Integrator_DSTATE += rtb_Divide7; /* Update for DiscreteIntegrator: '/Integrator' incorporates: * Switch: '/Switch' */ rtDW->Integrator_DSTATE_i += rtb_Sum3_l; /* Update for DiscreteIntegrator: '/Integrator' incorporates: * Switch: '/Switch' */ rtDW->Integrator_DSTATE_p += rtb_Sum2; /* End of Outputs for SubSystem: '/controller' */ /* Outport: '/pwm_counts' incorporates: * DataTypeConversion: '/Data Type Conversion4' * DataTypeConversion: '/Data Type Conversion5' * MATLAB Function: '/phase_time' */ rtY_pwm_counts[0] = rtb_DataTypeConversion3; /* Outputs for Atomic SubSystem: '/controller' */ rtY_pwm_counts[1] = (uint16_T)rtb_Sum1; rtY_pwm_counts[2] = (uint16_T)rtb_Divide; /* End of Outputs for SubSystem: '/controller' */ rtY_pwm_counts[3] = rtb_DataTypeConversion3; /* Outputs for Atomic SubSystem: '/controller' */ rtY_pwm_counts[4] = (uint16_T)rtb_Sum1; rtY_pwm_counts[5] = (uint16_T)rtb_Divide; /* End of Outputs for SubSystem: '/controller' */ rtY_pwm_counts[6] = rtb_o_samp_p1; rate_scheduler(rtM); } /* Model initialize function */ void PMSM_Controller_initialize(RT_MODEL *const rtM) { /* Registration code */ /* initialize non-finites */ rt_InitInfAndNaN(sizeof(real_T)); UNUSED_PARAMETER(rtM); } /* * File trailer for generated code. * * [EOF] */