Project 2 Adaptive Cruise Control
To Develop an MBD-based Adaptive Cruise Control Features as per given requirements using Matlab Simulink.
Objective:
- Developing Adaptive Cruise Control feature as per the Requirement Document using MATLAB Simulink.
- Follow all the MBD-related processes: Requirement Tagging & Traceability, SLDD creation, Configuration Parameter changes, Model Advisor check & Code Generation.
- In Configuration Parameters: enable “Support Floating Numbers” under Code Generation settings.
- Use Embedded Coder to generate the code.
- If choosing code generation, the Storage class for Input signals: ImportedExtern; the Storage class for Output signal: Export to File; the Storage class for local signals: localizable; the Storage class for calibration signals: Const.
- Choose sample time for all signals as 0.01s
Modeling:
Create SLDD file
- Create a blank model and save it and create a sldd by linking to Dictionary.
- Add Signals and parameters as provided in the data list.

Simulink Model for Adaptive Cruise Control:
We create modeling by creating a subsystem with nine input parameters and one output parameter for acceleration response.

Three Subsystems are created for the requirement names Lead_Vehicel, Drive_Vehicle, and ACC_Algorithm.

Lead_Vehcle Subsystem:
The camera and radar input values are taken as inputs and vehicle speed will be the Output.

Drive_Vehicle Subsystem:
This subsystem is based on requirement 2 and takes 3 input values cameraInput,Radar Input and Acceleration Mode and 2 outputs as Vehicle Speed and Vehicle Detection

Acc Algorithm Subsystem:
This Subsystem is made using the concept of Stateflow. It takes 8 inputs and gives acceleration as output.

ACC Algorithm StateFlow Diagram
The State flow Chart is developed based on the Requirement 3 and Sub requirements.

StateFlow Symbols:

Signal Resolving And propagation:
Signal to resolve: Right Click on the signal>>Properties>>Enter a valid signal name on suggestion>>Click OK.
- Accelertion_mode is resolved and given as feedback.

model Advisor Check:
- Model Advisor checks are done to check compliance of the model with different guidelines
- Run the model and check for any errors.
- Goto modeladvisor>>Select the whole>>ok

Code Generation:
Select the Subsystem then rightClick Code>>Build Code>>ok.

| * | |
| 2 | * File: Acc.c |
| 3 | * |
| 4 | * Code generated for Simulink model 'Acc'. |
| 5 | * |
| 6 | * Model version : 1.26 |
| 7 | * Simulink Coder version : 9.3 (R2020a) 18-Nov-2019 |
| 8 | * C/C++ source code generated on : Thu Apr 20 21:21:49 2023 |
| 9 | * |
| 10 | * Target selection: ert.tlc |
| 11 | * Embedded hardware selection: Intel->x86-64 (Windows64) |
| 12 | * Code generation objectives: Unspecified |
| 13 | * Validation result: Not run |
| 14 | */ |
| 15 | |
| 16 | #include "Acc.h" |
| 17 | #include "Acc_private.h" |
| 18 | |
| 19 | /* Named constants for Chart: ' |
| 20 | #define Acc_IN_ACC_OFF_MODE ((uint8_T)1U) |
| 21 | #define Acc_IN_ACC_ON_MODE ((uint8_T)2U) |
| 22 | #define Acc_IN_ACC_STANDBY_MODE ((uint8_T)3U) |
| 23 | #define Acc_IN_LeadVehicle_Detected ((uint8_T)1U) |
| 24 | #define Acc_IN_LeadVehicle_Not_Detected ((uint8_T)3U) |
| 25 | #define Acc_IN_NO_ACTIVE_CHILD ((uint8_T)0U) |
| 26 | #define IN_LeadVehicle_Detected_Resume ((uint8_T)2U) |
| 27 | #define IN_LeadVehicle_Not_Detected_Res ((uint8_T)4U) |
| 28 | #define IN_LeadVehicle_Speed_Equal_SetS ((uint8_T)5U) |
| 29 | #define IN_Lead_Vehicle_Speed_islesstha ((uint8_T)6U) |
| 30 | |
| 31 | /* Exported data definition */ |
| 32 | |
| 33 | /* Definition for custom storage class: ExportToFile */ |
| 34 | uint8_T Acceleration_Mode; /* ' |
| 35 | uint8_T DriveVehicle_Speed; /* ' |
| 36 | uint8_T LeadVehicle_Detected; /* ' |
| 37 | uint8_T LeadVehicle_Speed; /* ' |
| 38 | |
| 39 | /* Block states (default storage) */ |
| 40 | DW_Acc_T Acc_DW; |
| 41 | |
| 42 | /* Real-time model */ |
| 43 | RT_MODEL_Acc_T Acc_M_; |
| 44 | RT_MODEL_Acc_T *const Acc_M = &Acc_M_; |
| 45 | |
| 46 | /* Model step function */ |
| 47 | void Acc_step(void) |
| 48 | { |
| 49 | real_T tmp; |
| 50 | |
| 51 | /* Sum: ' |
| 52 | * Inport: ' |
| 53 | * Inport: ' |
| 54 | */ |
| 55 | LeadVehicle_Speed = (uint8_T)((uint32_T)CameraInput_LeadVehicle + |
| 56 | RadarInput_LeadVehicle); |
| 57 | |
| 58 | /* Sum: ' |
| 59 | * Inport: ' |
| 60 | * Inport: ' |
| 61 | * UnitDelay: ' |
| 62 | */ |
| 63 | DriveVehicle_Speed = (uint8_T)((uint32_T)(uint8_T)((uint32_T) |
| 64 | CameraInput_DriveVehicle + Acceleration_Mode) + RadarInput_DriveVehicle); |
| 65 | |
| 66 | /* SignalConversion: ' |
| 67 | * Inport: ' |
| 68 | */ |
| 69 | LeadVehicle_Detected = RadarInput_DriveVehicle; |
| 70 | |
| 71 | /* Chart: ' |
| 72 | * Inport: ' |
| 73 | * Inport: ' |
| 74 | * Inport: ' |
| 75 | * Inport: ' |
| 76 | * Inport: ' |
| 77 | */ |
| 78 | if (Acc_DW.is_active_c3_Acc == 0U) { |
| 79 | Acc_DW.is_active_c3_Acc = 1U; |
| 80 | Acc_DW.is_c3_Acc = Acc_IN_ACC_OFF_MODE; |
| 81 | Acceleration_Mode = 0U; |
| 82 | } else { |
| 83 | switch (Acc_DW.is_c3_Acc) { |
| 84 | case Acc_IN_ACC_OFF_MODE: |
| 85 | if (!CruiseSwitch) { |
| 86 | Acc_DW.is_c3_Acc = Acc_IN_ACC_ON_MODE; |
| 87 | tmp = 0.75 * (real_T)Set_Gap; |
| 88 | if (((LeadVehicle_Speed < Set_Speed) && (LeadVehicle_Speed < |
| 89 | DriveVehicle_Speed)) || (tmp == Time_Gap)) { |
| 90 | Acc_DW.is_ACC_ON_MODE = IN_Lead_Vehicle_Speed_islesstha; |
| 91 | Acceleration_Mode = 4U; |
| 92 | } else if (((real_T)LeadVehicle_Speed * 1.25 >= DriveVehicle_Speed) && |
| 93 | ((real_T)LeadVehicle_Speed * 0.75 <= DriveVehicle_Speed) && |
| 94 | (DriveVehicle_Speed < Set_Speed) && (Time_Gap <= 1.25 * |
| 95 | (real_T)Set_Gap) && (Time_Gap >= tmp)) { |
| 96 | Acc_DW.is_ACC_ON_MODE = IN_LeadVehicle_Speed_Equal_SetS; |
| 97 | Acceleration_Mode = 5U; |
| 98 | } else { |
| 99 | Acc_DW.is_ACC_ON_MODE = Acc_IN_LeadVehicle_Detected; |
| 100 | Acceleration_Mode = 2U; |
| 101 | } |
| 102 | } else { |
| 103 | Acc_DW.is_c3_Acc = Acc_IN_ACC_STANDBY_MODE; |
| 104 | Acceleration_Mode = 1U; |
| 105 | } |
| 106 | break; |
| 107 | |
| 108 | case Acc_IN_ACC_ON_MODE: |
| 109 | if (!SetSwitch) { |
| 110 | Acc_DW.is_ACC_ON_MODE = Acc_IN_NO_ACTIVE_CHILD; |
| 111 | Acc_DW.is_c3_Acc = Acc_IN_ACC_STANDBY_MODE; |
| 112 | Acceleration_Mode = 1U; |
| 113 | } else { |
| 114 | switch (Acc_DW.is_ACC_ON_MODE) { |
| 115 | case Acc_IN_LeadVehicle_Detected: |
| 116 | if (((LeadVehicle_Detected == 1) && (LeadVehicle_Speed < Set_Speed)) || |
| 117 | (Time_Gap < Set_Gap)) { |
| 118 | Acc_DW.is_ACC_ON_MODE = IN_Lead_Vehicle_Speed_islesstha; |
| 119 | Acceleration_Mode = 4U; |
| 120 | } else { |
| 121 | Acc_DW.is_ACC_ON_MODE = Acc_IN_LeadVehicle_Not_Detected; |
| 122 | Acceleration_Mode = 1U; |
| 123 | } |
| 124 | break; |
| 125 | |
| 126 | case IN_LeadVehicle_Detected_Resume: |
| 127 | Acceleration_Mode = 3U; |
| 128 | if ((DriveVehicle_Speed == Set_Speed) && (LeadVehicle_Speed >= |
| 129 | Set_Speed) && (Time_Gap >= Set_Gap)) { |
| 130 | Acc_DW.is_ACC_ON_MODE = Acc_IN_LeadVehicle_Detected; |
| 131 | Acceleration_Mode = 2U; |
| 132 | } else { |
| 133 | if ((DriveVehicle_Speed < Set_Speed) && (LeadVehicle_Speed > |
| 134 | DriveVehicle_Speed) && (Time_Gap >= Set_Gap)) { |
| 135 | Acc_DW.is_ACC_ON_MODE = IN_LeadVehicle_Speed_Equal_SetS; |
| 136 | Acceleration_Mode = 5U; |
| 137 | } |
| 138 | } |
| 139 | break; |
| 140 | |
| 141 | case Acc_IN_LeadVehicle_Not_Detected: |
| 142 | Acceleration_Mode = 1U; |
| 143 | if (((LeadVehicle_Detected == 1) && (LeadVehicle_Speed < Set_Speed)) || |
| 144 | (Time_Gap < Set_Gap)) { |
| 145 | Acc_DW.is_ACC_ON_MODE = IN_Lead_Vehicle_Speed_islesstha; |
| 146 | Acceleration_Mode = 4U; |
| 147 | } else { |
| 148 | if ((LeadVehicle_Detected == 1) && (DriveVehicle_Speed == Set_Speed) |
| 149 | && (LeadVehicle_Speed >= Set_Speed) && (Time_Gap >= Set_Gap)) { |
| 150 | Acc_DW.is_ACC_ON_MODE = Acc_IN_LeadVehicle_Detected; |
| 151 | Acceleration_Mode = 2U; |
| 152 | } |
| 153 | } |
| 154 | break; |
| 155 | |
| 156 | case IN_LeadVehicle_Not_Detected_Res: |
| 157 | Acceleration_Mode = 1U; |
| 158 | if (LeadVehicle_Detected == 0) { |
| 159 | Acc_DW.is_ACC_ON_MODE = IN_LeadVehicle_Detected_Resume; |
| 160 | Acceleration_Mode = 3U; |
| 161 | } |
| 162 | break; |
| 163 | |
| 164 | case IN_LeadVehicle_Speed_Equal_SetS: |
| 165 | Acceleration_Mode = 5U; |
| 166 | if ((DriveVehicle_Speed < Set_Speed) && (LeadVehicle_Speed > |
| 167 | DriveVehicle_Speed) && (Time_Gap >= Set_Gap)) { |
| 168 | Acc_DW.is_ACC_ON_MODE = IN_LeadVehicle_Detected_Resume; |
| 169 | Acceleration_Mode = 3U; |
| 170 | } else { |
| 171 | if ((LeadVehicle_Detected == 0) || (DriveVehicle_Speed <= Set_Speed)) |
| 172 | { |
| 173 | Acc_DW.is_ACC_ON_MODE = IN_LeadVehicle_Not_Detected_Res; |
| 174 | Acceleration_Mode = 1U; |
| 175 | } |
| 176 | } |
| 177 | break; |
| 178 | |
| 179 | default: |
| 180 | /* case IN_Lead_Vehicle_Speed_islessthan_SetSpeed: */ |
| 181 | Acceleration_Mode = 4U; |
| 182 | if ((LeadVehicle_Detected == 0) && (DriveVehicle_Speed == Set_Speed)) |
| 183 | { |
| 184 | Acc_DW.is_ACC_ON_MODE = Acc_IN_LeadVehicle_Not_Detected; |
| 185 | Acceleration_Mode = 1U; |
| 186 | } |
| 187 | break; |
| 188 | } |
| 189 | } |
| 190 | break; |
| 191 | |
| 192 | default: |
| 193 | /* case IN_ACC_STANDBY_MODE: */ |
| 194 | if (SetSwitch) { |
| 195 | Acc_DW.is_c3_Acc = Acc_IN_ACC_ON_MODE; |
| 196 | tmp = 0.75 * (real_T)Set_Gap; |
| 197 | if (((LeadVehicle_Speed < Set_Speed) && (LeadVehicle_Speed < |
| 198 | DriveVehicle_Speed)) || (tmp == Time_Gap)) { |
| 199 | Acc_DW.is_ACC_ON_MODE = IN_Lead_Vehicle_Speed_islesstha; |
| 200 | Acceleration_Mode = 4U; |
| 201 | } else if (((real_T)LeadVehicle_Speed * 1.25 >= DriveVehicle_Speed) && |
| 202 | ((real_T)LeadVehicle_Speed * 0.75 <= DriveVehicle_Speed) && |
| 203 | (DriveVehicle_Speed < Set_Speed) && (Time_Gap <= 1.25 * |
| 204 | (real_T)Set_Gap) && (Time_Gap >= tmp)) { |
| 205 | Acc_DW.is_ACC_ON_MODE = IN_LeadVehicle_Speed_Equal_SetS; |
| 206 | Acceleration_Mode = 5U; |
| 207 | } else { |
| 208 | Acc_DW.is_ACC_ON_MODE = Acc_IN_LeadVehicle_Detected; |
| 209 | Acceleration_Mode = 2U; |
| 210 | } |
| 211 | } else { |
| 212 | Acc_DW.is_c3_Acc = Acc_IN_ACC_OFF_MODE; |
| 213 | Acceleration_Mode = 0U; |
| 214 | } |
| 215 | break; |
| 216 | } |
| 217 | } |
| 218 | |
| 219 | /* End of Chart: ' |
| 220 | } |
| 221 | |
| 222 | /* Model initialize function */ |
| 223 | void Acc_initialize(void) |
| 224 | { |
| 225 | /* (no initialization code required) */ |
| 226 | } |
| 227 | |
| 228 | /* Model terminate function */ |
| 229 | void Acc_terminate(void) |
| 230 | { |
| 231 | /* (no terminate code required) */ |
| 232 | } |
| 233 | |
| 234 | /* |
| 235 | * File trailer for generated code. |
| 236 | * |
| 237 | * [EOF] |
| 238 | */ |
| 239 |
Result:
- The Adaptive Cruise Control is Modelled in Simulink as per the given requirements. If the model is running without any error it works as per requirement.
- Solver and Code generation are configured.
- SLDD file is created and linked to the model.
- Model advisor report is generated.
- C-code for the model is generated.
Conclusion:
Hence the Adaptive Cruise Control Model is Developed as per Requirement.