Project 2 Adaptive Cruise Control
Aim :
- Developing Adaptive Cruise Control feature as per the Requirement Document using MATLAB Simulink.
- To generate the C Code for the designed model.
Here is the general overview about the Adaptive Cruise Control
General Overview (Adaptive Cruise Control (ACC) :
Adaptive Cruise Control Feature for passenger cars allows the host vehicle to adapt to the speed in line with the flow of traffic. Driving in heavy traffic or keeping a safe distance to the preceding vehicle calls for a high level of concentration. The Adaptive Cruise Control feature can reduce the stress on the driver by automatically controlling the vehicle speed & maintaining a predefined minimum distance to the preceding vehicle. As a consequence, the driver enjoys more comfort & can concentrate on the road little better.
A radar sensor is usually at the core of the Adaptive Cruise Control. Installed at the front of the vehicle, the system permanently monitors the road ahead. As long as the road ahead is clear, cruise control feature maintains the speed set by the driver. If the system spots a slower vehicle within its detection range, it gently reduces speed by releasing the accelerator or actively engaging the brake control system. If the vehicle ahead speeds up or changes lanes, the cruise control automatically accelerates to the driver’s desired speed.
Standard Adaptive Cruise Control can be activated from speeds of around 30 km/h (20 mph) upwards and supports the driver, primarily on cross-country journeys or on freeways. The cruise control stop & go variant is also active at speeds below 30 km/h (20 mph). It can maintain the set distance to the preceding vehicle even at very low speeds and can decelerate to a complete standstill. When the vehicle remains stopped longer, the driver needs only to reactivate the system, for example by briefly stepping on the gas pedal to return to cruise control mode. In this way, cruise control stop & go supports the driver even in heavy traffic and traffic jams.
Since Adaptive Cruise Control is a comfort and convenience system, brake interventions and vehicle acceleration only take place within defined limits. Even with Adaptive Cruise Control switched on, it remains the driver’s responsibility to monitor the speed and distance from the vehicle in front.
Here there are some requirements provided for the model according to which the model is to be developed :
Requirement 1– Lead Vehicle:
- Lead Vehicle is a vehicle which is driving in the road ahead of our drive vehicle. Two input signals (Signal Name: CameraInput_LeadVehicle & RadarInput_LeadVehicle).
- Ideally sensor fusion techniques will be deployed to process & analyze data from camera & radar. For complexity reasons, let’s not adapt to any such algorithms.
- We can simply add both the radar & camera inputs & the corresponding output is read as Speed profile output (Signal Name: LeadVehicle_Speed).
- Speed data of the lead vehicle is critical in implementing the Adaptive Cruise Control algorithm.
Requirement 2 – Drive Vehicle:
- Drive Vehicle is the vehicle driven by the user & this is the vehicle which has ACC algorithm in it.
- Like the Lead Vehicle, Drive Vehicle algorithm also has 2 input signals (Signal Name: CameraInput_DriveVehicle, RadarInput_DriveVehicle) & one signal coming as an Input to this subsystem (Signal Name: Acceleration_Mode) – three inputs into this requirement in total.
- Like the above requirement, sensor fusion techniques will also be deployed here, for complexity reasons we are ignoring them.
- Two output signals come from this subsystem (Signal Name: DriveVehicle_Speed & LeadVehicle_Detected).
- Signal DriveVehicle_Speed is summation of three input signals mentioned above & LeadVehicle_Detected is renamed from Input Signal RadarInput_DriveVehicle by mere use of Signal Conversion block.
Requirement 3 – Adaptive Cruise Control Algorithm:
- Adaptive Cruise Control feature has 3 major modes of operation: OFF Mode, STANDBY Mode & ON Mode. This particular requirement has to be implemented as state machine logic in Simulink.
- The input signals to this state machine system are (Signal Name: Time_Gap, Set_Speed, Set_Gap, CruiseSwitch, SetSwitch).
- Also, the output signals (Signal Name: DriveVehicle_Speed & LeadVehicle_Detected) from requirement-2 is fed back as an input signal into this state machine block.
- Additionally, output signal (Signal Name: LeadVehicle_Speed) from requirement-1 is given as an input signal to this state machine block as well.
- Output from this subsystem is a signal (Signal Name: Acceleration_Mode) which governs the vehicular speed of the drive vehicle which automatically adjusts its speed & velocity to match the lead vehicle.
Requirement 3a – ACC OFF MODE state logic:
- This is the default state inside state machine logic. Output signal Acceleration_Mode is at value 0 in this state.
- This state is governed by input signal CruiseSwitch.
- If CruiseSwitch is equal to 1, state ACC STANDBY mode will get activated. If CruiseSwitch is equal to 0, state ACC OFF mode will get activated, from either ACC ON mode or ACC STANDBY mode
Requirement 3b – ACC STANDBY MODE state logic:
- This is the second activated state inside state machine logic. Output signal Acceleration_Mode is at value 1 in this state.
- This state is governed by both input signals CruiseSwitch & SetSwitch.
- If CruiseSwitch is equal to 1, state ACC STANDBY mode will get activated. If CruiseSwitch is equal to 0, state ACC OFF mode will get activated, from either ACC ON mode or ACC STANDBY mode
- If SetSwitch is equal to 1, state ACC ON mode will get activated. If SetSwitch is equal to 0, state ACC STANDBY mode will get activated.
Requirement 3c – ACC ON MODE state logic:
This state will be activated when input signal SetSwitch is equal to 1. There are 6 sub states to this state logic: They are:
- LeadVehicle_Detected_Follow (Default)
- LeadVehicle_Not_Detected
- LeadVehicle_Detected_Resume
- LeadVehicle_Not_Detected_Resume
- LeadVehicle_Speed_lessthan_Set_Speed
- LeadVehicle_Speed_equal_Set_Speed
Requirement 3c (i) – LeadVehicle_Detected_Follow (ACC ON MODE):
- This is the default sub state inside ACC ON MODE state. Output signal Acceleration_Mode is equal to 2.
- Condition to transit from LeadVehicle_Detected_Follow to LeadVehicle_Not_Detected; Input signal condition LeadVehicle_Detected == 0.
- Condition to transit from LeadVehicle_Detected_Follow to LeadVehicle_Speed_lessthan_Set_Speed; Input Signals condition (LeadVehicle_Detected == 1) && (LeadVehicle_Speed < Set_Speed) || (Time_Gap < Set_Gap).
Requirement 3c (ii) – LeadVehicle_Not_Detected (ACC ON MODE):
- Output signal Acceleration_Mode is equal to 1.
- Condition to transit from LeadVehicle_Not_Detected to LeadVehicle_Detected_Follow; Input signals condition [(LeadVehicle_Detected==1) && (DriveVehicle_Speed == Set_Speed) && (LeadVehicle_Speed >= Set_Speed) && (Time_Gap >= Set_Gap)]
- Condition to transit from LeadVehicle_Not_Detected to LeadVehicle_Speed_lessthan_Set_Speed; Input signals condition [(LeadVehicle_Detected == 1) && (LeadVehicle_Speed < Set_Speed) || (Time_Gap < Set_Gap)]
Requirement 3c (iii) – LeadVehicle_Detected_Resume (ACC ON MODE):
- Output signal Acceleration_Mode is equal to 3.
- Condition to transit from LeadVehicle_Detected_Resume to LeadVehicle_Detected_Follow; Input signals condition [(DriveVehicle_Speed == Set_Speed) && (LeadVehicle_Speed >= Set_Speed) && (Time_Gap >= Set_Gap)]
- Condition to transit from LeadVehicle_Detected_Resume to LeadVehicle_Not_Detected_Resume; Input signal condition LeadVehicle_Detected==0.
- Condition to transit from LeadVehicle_Detected_Resume to LeadVehicle_Speed_equal_Set_Speed; Input Signal condition [(DriveVehicle_Speed < Set_Speed) && (LeadVehicle_Speed > DriveVehicle_Speed) && (Time_Gap >= Set_Gap)]
Requirement 3c (iv) - LeadVehicle_Not_Detected_Resume (ACC ON MODE):
- Output signal Acceleration_Mode is equal to 1.
Requirement 3c (v) - LeadVehicle_Speed_lessthan_Set_Speed (ACC ON MODE):
- Output signal Acceleration_Mode is equal to 4.
- Condition to transit from LeadVehicle_Speed_lessthan_Set_Speed to LeadVehicle_Not_Detected; Input signal condition [(LeadVehicle_Detected == 0) && (DriveVehicle_Speed == Set_Speed)]
- Condition to transit from LeadVehicle_Speed_lessthan_Set_Speed to LeadVehicle_Speed_equal_Set_Speed; Input signals condition [((LeadVehicle_Speed*1.25>=DriveVehicle_Speed) && (LeadVehicle_Speed * 0.75<=DriveVehicle_Speed)) && (DriveVehicle_Speed < Set_Speed) && ((Time_Gap<=1.25*Set_Gap) && (Time_Gap >=0.75*Set_Gap))]
Requirement 3c (vi) - LeadVehicle_Speed_equal_Set_Speed (ACC ON MODE):
- Output signal Acceleration_Mode is equal to 5.
- Condition to transit from LeadVehicle_Speed_equal_Set_Speed to LeadVehicle_Not_Detected_Resume; Input signal conditions is [(LeadVehicle_Detected == 0) || (DriveVehicle_Speed <= Set_Speed)]
- Condition to transit from LeadVehicle_Speed_equal_Set_Speed to LeadVehicle_Detected_Resume; Input signal conditions [(DriveVehicle_Speed < Set_Speed) && (LeadVehicle_Speed > DriveVehicle_Speed) || (Time_Gap >= Set_Gap)]
- Condition to transit from LeadVehicle_Speed_equal_Set_Speed toLeadVehicle_Speed_lessthan_Set_Speed; Input signals conditions [(LeadVehicle_Speed<Set_Speed) && (LeadVehicle_Speed<DriveVehicle_Speed) || (Time_Gap == 0.75*Set_Gap)]
Signals & Calibration Data List :
|
Signal / Calibration Name |
Signal Type |
Data Type |
Dimension |
Min |
Max |
Initial Value |
Units |
|
CameraInput_LeadVehicle |
Input |
Uint8 |
1 |
0 |
255 |
- |
- |
|
RadarInput_LeadVehicle |
Input |
Uint8 |
1 |
0 |
255 |
- |
- |
|
CameraInput_DriveVehicle |
Input |
Uint8 |
1 |
0 |
255 |
- |
- |
|
RadarInput_DriveVehicle |
Input |
Uint8 |
1 |
0 |
255 |
- |
- |
|
Time_Gap |
Input |
Uint8 |
1 |
0 |
255 |
- |
- |
|
Set_Speed |
Input |
Uint8 |
1 |
0 |
255 |
- |
- |
|
Set_Gap |
Input |
Uint8 |
1 |
0 |
255 |
- |
- |
|
CruiseSwitch |
Input |
Boolean |
1 |
0 |
1 |
- |
- |
|
SetSwitch |
Input |
Boolean |
1 |
0 |
1 |
- |
- |
|
Acceleration_Mode |
Output |
Uint8 |
1 |
0 |
255 |
- |
- |
|
LeadVehicle_Speed |
Output |
Uint8 |
1 |
0 |
255 |
- |
- |
|
DriveVehicle_Speed |
Output |
Uint8 |
1 |
0 |
255 |
- |
- |
|
LeadVehicle_Detected |
Output |
Uint8 |
1 |
0 |
255 |
- |
- |
The above tabulated values are used to create the SLDD file in the SIMULINK
So, now lets get into MATLABand create a new SLDD file in the SIMULINK. below i am attaching the image of SLDD creation.
SLDD Creation :
* at first we should open the SIMULINK page and we should go into the modeling section and in design section we should select the 'LINK TO DATA' option adn there we can create a new SLDD file and the procedure is shown in the below image

* if incase the SLDD file is created previously the go for browse option and select particular SLDD file from the particular file
* the SLDD file should contain the data which is provided by the user or the client but here in this model the following specifications are provided in above (Signals & Calibration Data List) table
* and the data is manually given in the data design, sub folder of the external data folder of the vehicle direction.slx of the model explorer.
* and make sure when ever we change any values or any changes are made in the data sheet we should do 'Save changes' in external data
* after saving all the changes we can close the model explorer tab

Model Creation :
Sub-System Creation :
* after completing the SLDD data adding the go back and on the SIMULINK page open the 'SUBSYSTEM' blcok and double click on it and inside create another three subsystems in the main subsystem
* and name that main subsystem as 'Adaptive cruise control' and open it and create another two subsystems in it

* as we known create the three subsystems in side this adaptive cruise control subsystem and name them as a 'Requirement-1, Requirement-2 & Requirement-3', as shown in the below image attached and the given requirement logics can be developed inside those subsystems

* name them as 'Lead_vehicle, Drive_vehicle & Adaptive_Cruise_Control_Algorithim',
and now lets see each requirement one-by-one
Requirement 1– Lead Vehicle:
- Lead Vehicle is a vehicle which is driving in the road ahead of our drive vehicle. Two input signals (Signal Name: CameraInput_LeadVehicle & RadarInput_LeadVehicle).
- Ideally sensor fusion techniques will be deployed to process & analyze data from camera & radar. For complexity reasons, let’s not adapt to any such algorithms.
- We can simply add both the radar & camera inputs & the corresponding output is read as Speed profile output (Signal Name: LeadVehicle_Speed).
- Speed data of the lead vehicle is critical in implementing the Adaptive Cruise Control algorithm.
* these are the following requirements for the 'Lead_vehicle' subsystem and as per these requirements the model is developed in the subsystem.
* below image represents developed model of 'Requirement_1' in the subsystem

* here the two input ports are taken and named as CameraInput_LeadVehicle & RadarInput_LeadVehicle and are connected to the addition block and the signal lines at the output and input are also resolved and propagated as shown in the below image

* and we can also tag our Requirement word file for this subsystem by right clicking on this subsystem and selecting on requirements and the link to word file as shown in the below image

Requirement 2 – Drive Vehicle:
- Drive Vehicle is the vehicle driven by the user & this is the vehicle which has ACC algorithm in it.
- Like the Lead Vehicle, Drive Vehicle algorithm also has 2 input signals (Signal Name: CameraInput_DriveVehicle, RadarInput_DriveVehicle) & one signal coming as an Input to this subsystem (Signal Name: Acceleration_Mode) – three inputs into this requirement in total.
- Like the above requirement, sensor fusion techniques will also be deployed here, for complexity reasons we are ignoring them.
- Two output signals come from this subsystem (Signal Name: DriveVehicle_Speed & LeadVehicle_Detected).
- Signal DriveVehicle_Speed is summation of three input signals mentioned above & LeadVehicle_Detected is renamed from Input Signal RadarInput_DriveVehicle by mere use of Signal Conversion block.
* these are the following requirements for the 'Drive_vehicle' subsystem and as per these requirements the model is developed in the subsystem.
* below image represents developed model of 'Requirement_2' in the subsyste

* here the three inputs are taken and named as 'CameraInput_DriveVehicle, Acceleration_Mode, &RadarInput_DriveVehicle', and are connected to the addition block and connected to output ports of 'DriveVehicle_Speed, LeadVehicle_Detected'
* and we can also tag our Requirement word file for this subsystem by right clicking on this subsystem and selecting on requirements and the link to word file as shown in the above image for requirement_1 subsystem tagging and the signal lines at the output and input are also resolved and propagated as shown in the above image of Lead_vehicle subsystem
Requirement 3 – Adaptive Cruise Control Algorithm:
- Adaptive Cruise Control feature has 3 major modes of operation: OFF Mode, STANDBY Mode & ON Mode. This particular requirement has to be implemented as state machine logic in Simulink.
- The input signals to this state machine system are (Signal Name: Time_Gap, Set_Speed, Set_Gap, CruiseSwitch, SetSwitch).
- Also, the output signals (Signal Name: DriveVehicle_Speed & LeadVehicle_Detected) from requirement-2 is fed back as an input signal into this state machine block.
- Additionally, output signal (Signal Name: LeadVehicle_Speed) from requirement-1 is given as an input signal to this state machine block as well.
- Output from this subsystem is a signal (Signal Name: Acceleration_Mode) which governs the vehicular speed of the drive vehicle which automatically adjusts its speed & velocity to match the lead vehicle.
Requirement 3a – ACC OFF MODE state logic:
- This is the default state inside state machine logic. Output signal Acceleration_Mode is at value 0 in this state.
- This state is governed by input signal CruiseSwitch.
- If CruiseSwitch is equal to 1, state ACC STANDBY mode will get activated. If CruiseSwitch is equal to 0, state ACC OFF mode will get activated, from either ACC ON mode or ACC STANDBY mode
Requirement 3b – ACC STANDBY MODE state logic:
- This is the second activated state inside state machine logic. Output signal Acceleration_Mode is at value 1 in this state.
- This state is governed by both input signals CruiseSwitch & SetSwitch.
- If CruiseSwitch is equal to 1, state ACC STANDBY mode will get activated. If CruiseSwitch is equal to 0, state ACC OFF mode will get activated, from either ACC ON mode or ACC STANDBY mode
- If SetSwitch is equal to 1, state ACC ON mode will get activated. If SetSwitch is equal to 0, state ACC STANDBY mode will get activated.
Requirement 3c – ACC ON MODE state logic:
This state will be activated when input signal SetSwitch is equal to 1. There are 6 sub states to this state logic: They are:
- LeadVehicle_Detected_Follow (Default)
- LeadVehicle_Not_Detected
- LeadVehicle_Detected_Resume
- LeadVehicle_Not_Detected_Resume
- LeadVehicle_Speed_lessthan_Set_Speed
- LeadVehicle_Speed_equal_Set_Speed
* these requirements are to be designed in a Adaptive_Cruise_Control_Algorithim subsystem by takind a chart in it and first basic three requirements are given in a chart as shown in the below image

* and now lets see the further requirements which should be modeled in the chart and below the image is attached if it
Requirement 3c (i) – LeadVehicle_Detected_Follow (ACC ON MODE):
- This is the default sub state inside ACC ON MODE state. Output signal Acceleration_Mode is equal to 2.
- Condition to transit from LeadVehicle_Detected_Follow to LeadVehicle_Not_Detected; Input signal condition LeadVehicle_Detected == 0.
- Condition to transit from LeadVehicle_Detected_Follow to LeadVehicle_Speed_lessthan_Set_Speed; Input Signals condition (LeadVehicle_Detected == 1) && (LeadVehicle_Speed < Set_Speed) || (Time_Gap < Set_Gap).
Requirement 3c (ii) – LeadVehicle_Not_Detected (ACC ON MODE):
- Output signal Acceleration_Mode is equal to 1.
- Condition to transit from LeadVehicle_Not_Detected to LeadVehicle_Detected_Follow; Input signals condition [(LeadVehicle_Detected==1) && (DriveVehicle_Speed == Set_Speed) && (LeadVehicle_Speed >= Set_Speed) && (Time_Gap >= Set_Gap)]
- Condition to transit from LeadVehicle_Not_Detected to LeadVehicle_Speed_lessthan_Set_Speed; Input signals condition [(LeadVehicle_Detected == 1) && (LeadVehicle_Speed < Set_Speed) || (Time_Gap < Set_Gap)]
Requirement 3c (iii) – LeadVehicle_Detected_Resume (ACC ON MODE):
- Output signal Acceleration_Mode is equal to 3.
- Condition to transit from LeadVehicle_Detected_Resume to LeadVehicle_Detected_Follow; Input signals condition [(DriveVehicle_Speed == Set_Speed) && (LeadVehicle_Speed >= Set_Speed) && (Time_Gap >= Set_Gap)]
- Condition to transit from LeadVehicle_Detected_Resume to LeadVehicle_Not_Detected_Resume; Input signal condition LeadVehicle_Detected==0.
- Condition to transit from LeadVehicle_Detected_Resume to LeadVehicle_Speed_equal_Set_Speed; Input Signal condition [(DriveVehicle_Speed < Set_Speed) && (LeadVehicle_Speed > DriveVehicle_Speed) && (Time_Gap >= Set_Gap)]
Requirement 3c (iv) - LeadVehicle_Not_Detected_Resume (ACC ON MODE):
- Output signal Acceleration_Mode is equal to 1.
Requirement 3c (v) - LeadVehicle_Speed_lessthan_Set_Speed (ACC ON MODE):
- Output signal Acceleration_Mode is equal to 4.
- Condition to transit from LeadVehicle_Speed_lessthan_Set_Speed to LeadVehicle_Not_Detected; Input signal condition [(LeadVehicle_Detected == 0) && (DriveVehicle_Speed == Set_Speed)]
- Condition to transit from LeadVehicle_Speed_lessthan_Set_Speed to LeadVehicle_Speed_equal_Set_Speed; Input signals condition [((LeadVehicle_Speed*1.25>=DriveVehicle_Speed) && (LeadVehicle_Speed * 0.75<=DriveVehicle_Speed)) && (DriveVehicle_Speed < Set_Speed) && ((Time_Gap<=1.25*Set_Gap) && (Time_Gap >=0.75*Set_Gap))]
Requirement 3c (vi) - LeadVehicle_Speed_equal_Set_Speed (ACC ON MODE):
- Output signal Acceleration_Mode is equal to 5.
- Condition to transit from LeadVehicle_Speed_equal_Set_Speed to LeadVehicle_Not_Detected_Resume; Input signal conditions is [(LeadVehicle_Detected == 0) || (DriveVehicle_Speed <= Set_Speed)]
- Condition to transit from LeadVehicle_Speed_equal_Set_Speed to LeadVehicle_Detected_Resume; Input signal conditions [(DriveVehicle_Speed < Set_Speed) && (LeadVehicle_Speed > DriveVehicle_Speed) || (Time_Gap >= Set_Gap)]
- Condition to transit from LeadVehicle_Speed_equal_Set_Speed toLeadVehicle_Speed_lessthan_Set_Speed; Input signals conditions [(LeadVehicle_Speed<Set_Speed) && (LeadVehicle_Speed<DriveVehicle_Speed) || (Time_Gap == 0.75*Set_Gap)]

* as there are six kind of requirements the six state blocks are taken and implemented the logic of the requirements as per the given
* below i am attaching the complete image of the modeled chart according to the total requirements

* after creating the chart the inputports are connected to the chart and single output port is connected to the chart as shown in the below image

* and we can also tag our Requirement word file for this subsystem by right clicking on this subsystem and selecting on requirements and the link to word file as shown in the above image for requirement_1 subsystem tagging and the signal lines at the output and input are also resolved and propagated as shown in the above image of Lead_vehicle subsystem
Modeling Settings :
* after finishing the subsystems modeling we should change the solver and code generation settings in the modeling section of the SIMULINK
* now first look into the solver setting & code generation settings

* we can see the model settings option in the above ribbion of the SIMULINK page as shown in the above image and the below image shows the solver model settings

* keep solver type as Fixed-step and solver as discrete (no continuous states) and keep fixed step size as 0.01
* after completing the solver settings go into the code generation settings in the same modeling section of the SIMULINK
* now look into the code generation setting and the below image shows the code generation model settings

* here if we select browse option in system target file we will get number of options in that we should select 'ert.tlc Embedded coder' and keep remianing as it is and there is no need to change.
Model Advisor Check :
* after completing with modeling settings change now we shouls perform the model advisor check fot the whole system
* now look into the model advisor check and the below image shows the selection of model advisor check

* as we observe there will be a 'model advisor' icon at the top left side of the modeling section and after clicking on that icon we will get hierarchy window in that we should select the vehicle_direction system to perform the check for whole system. and the below image shows the selection of model to perform checks
* after selecting the whole system in hierarchy window then press ok and the we will get check list page

and the window is opend after loading the checks as shown in the below image

* we should deselect all and we should only select 'modeling standards for MAB' option and with that only all the sub folders are selected for the advisor check

* MathWorks Advisory Board (MAB) Guidelines are a set of modeling guidelines developed by an independent industry working group for the usage of MATLAB, Simulink, Stateflow and Embedded Coder.

* after selecting a particular MAB folder there will be an option at the top right of the page 'Run selected checks' by clicking it the advisor check will start and the obtained check results are shown in the below image

* if we observe the summary of the results there is pass, fail, warnings and not run. these are the parameters of the results
* if we observe my test reults there is no fail cases and warnings are 14 and pass cases are 130 and not run is zero
* those warnings are not considered, as 10 - 15 warnings are negligible we can avoid them and we should only consider fail cases if any.
C-code generation for the model :
* after finishing the model advisor check and if there are no fail cases then go to APPS section in the above options ribbion for the process of code generation as shown in the below image

* as we see the abobe ribbon if we go into the APPS the particular ribbon will be opened and the code generation option will appear as shown in the below image

* in this C Code generation we can see the build block and if we click on that Build block the C Code for the entire model will be generated in C Language
* as we click the build button the C code is generated at the right side window in the SIMULINK page itself and we can observe it in below image

* see as we discussed the C CODE for the entire model is generated and with this the 'Adaptive_Cruise_Control_ert_rtw' file is also automatically created in the folder where the model path is exsisting in the folder in our system
* and we can aslo open that .C file in MATLAB script window as it is shown in the below attached image

* for opening the C CODE in the MATLAB go into the vechile_direction_ert_rtw file and select the .C file which is named as 'Adaptive_Cruise_Control.c' and the C CODE of the model is opend in MATLAB
* below i am inserting the C CODE of the model for the detailed clarification
/*
* File: Adaptive_Cruise_Control.c
*
* Code generated for Simulink model 'Adaptive_Cruise_Control'.
*
* Model version : 1.28
* Simulink Coder version : 9.5 (R2021a) 14-Nov-2020
* C/C++ source code generated on : Mon May 16 21:14:04 2022
*
* Target selection: ert.tlc
* Embedded hardware selection: Intel->x86-64 (Windows64)
* Code generation objectives: Unspecified
* Validation result: Not run
*/
#include "Adaptive_Cruise_Control.h"
#include "Adaptive_Cruise_Control_private.h"
/* Named constants for Chart: '<S2>/Chart' */
#define Ada_IN_LeadVehicle_Not_Detected ((uint8_T)3U)
#define Adaptive_Cr_IN_ACC_STANDBY_MODE ((uint8_T)3U)
#define Adaptive_Cru_IN_NO_ACTIVE_CHILD ((uint8_T)0U)
#define Adaptive_Cruise_IN_ACC_OFF_MODE ((uint8_T)1U)
#define Adaptive_Cruise__IN_ACC_ON_MODE ((uint8_T)2U)
#define IN_LeadVehicle_Detected_Resume ((uint8_T)1U)
#define IN_LeadVehicle_Detected_follow ((uint8_T)2U)
#define IN_LeadVehicle_Not_Detected_Res ((uint8_T)4U)
#define IN_LeadVehicle_Speed_equal_Set_ ((uint8_T)5U)
#define IN_LeadVehicle_Speed_lessthan_S ((uint8_T)6U)
/* Exported data definition */
/* Definition for custom storage class: ExportToFile */
uint8_T Acceleration_Mode; /* '<S1>/Unit Delay' */
/* Block states (default storage) */
DW_Adaptive_Cruise_Control_T Adaptive_Cruise_Control_DW;
/* External outputs (root outports fed by signals with default storage) */
ExtY_Adaptive_Cruise_Control_T Adaptive_Cruise_Control_Y;
/* Real-time model */
static RT_MODEL_Adaptive_Cruise_Cont_T Adaptive_Cruise_Control_M_;
RT_MODEL_Adaptive_Cruise_Cont_T *const Adaptive_Cruise_Control_M =
&Adaptive_Cruise_Control_M_;
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 Adaptive_Cruise_Control_step(void)
{
/* local block i/o variables */
uint8_T LeadVehicle_Speed;
uint8_T LeadVehicle_Detected;
int32_T tmp;
int32_T tmp_0;
uint8_T rtb_DriveVehicle_Speed;
uint8_T tmp_1;
uint8_T tmp_2;
/* Sum: '<S4>/Add' incorporates:
* Inport: '<Root>/CameraInput_LeadVehicle'
* Inport: '<Root>/RadarInput_LeadVehicle'
*/
LeadVehicle_Speed = (uint8_T)((uint32_T)CameraInput_LeadVehicle +
*RadarInput_LeadVehicle);
/* UnitDelay: '<S1>/Unit Delay' */
Acceleration_Mode = Adaptive_Cruise_Control_Y.Acceleration_Mode_h;
/* Sum: '<S3>/Add1' incorporates:
* Inport: '<Root>/CameraInput_DriveVehicle'
* Inport: '<Root>/RadarInput_DriveVehicle'
* Sum: '<S3>/Add'
*/
rtb_DriveVehicle_Speed = (uint8_T)((uint32_T)(uint8_T)((uint32_T)
CameraInput_DriveVehicle + Acceleration_Mode) + RadarInput_DriveVehicle);
/* SignalConversion: '<S3>/Signal Conversion' incorporates:
* Inport: '<Root>/RadarInput_DriveVehicle'
*/
LeadVehicle_Detected = RadarInput_DriveVehicle;
/* Chart: '<S2>/Chart' incorporates:
* Inport: '<Root>/CruiseSwitch'
* Inport: '<Root>/SetSwitch'
* Inport: '<Root>/Set_Gap'
* Inport: '<Root>/Set_Speed'
* Inport: '<Root>/Time_Gap'
* UnitDelay: '<S1>/Unit Delay'
*/
if (Adaptive_Cruise_Control_DW.is_active_c3_Adaptive_Cruise_Co == 0U) {
Adaptive_Cruise_Control_DW.is_active_c3_Adaptive_Cruise_Co = 1U;
Adaptive_Cruise_Control_DW.is_c3_Adaptive_Cruise_Control =
Adaptive_Cruise_IN_ACC_OFF_MODE;
Adaptive_Cruise_Control_Y.Acceleration_Mode_h = 0U;
} else {
switch (Adaptive_Cruise_Control_DW.is_c3_Adaptive_Cruise_Control) {
case Adaptive_Cruise_IN_ACC_OFF_MODE:
Adaptive_Cruise_Control_Y.Acceleration_Mode_h = 0U;
if (CruiseSwitch) {
Adaptive_Cruise_Control_DW.is_c3_Adaptive_Cruise_Control =
Adaptive_Cr_IN_ACC_STANDBY_MODE;
Adaptive_Cruise_Control_Y.Acceleration_Mode_h = 1U;
}
break;
case Adaptive_Cruise__IN_ACC_ON_MODE:
if (!CruiseSwitch) {
Adaptive_Cruise_Control_DW.is_ACC_ON_MODE =
Adaptive_Cru_IN_NO_ACTIVE_CHILD;
Adaptive_Cruise_Control_DW.is_c3_Adaptive_Cruise_Control =
Adaptive_Cruise_IN_ACC_OFF_MODE;
Adaptive_Cruise_Control_Y.Acceleration_Mode_h = 0U;
} else if (!SetSwitch) {
Adaptive_Cruise_Control_DW.is_ACC_ON_MODE =
Adaptive_Cru_IN_NO_ACTIVE_CHILD;
Adaptive_Cruise_Control_DW.is_c3_Adaptive_Cruise_Control =
Adaptive_Cr_IN_ACC_STANDBY_MODE;
Adaptive_Cruise_Control_Y.Acceleration_Mode_h = 1U;
} else {
switch (Adaptive_Cruise_Control_DW.is_ACC_ON_MODE) {
case IN_LeadVehicle_Detected_Resume:
if (LeadVehicle_Detected == 0) {
Adaptive_Cruise_Control_DW.is_ACC_ON_MODE =
IN_LeadVehicle_Not_Detected_Res;
Adaptive_Cruise_Control_Y.Acceleration_Mode_h = 1U;
} else if ((rtb_DriveVehicle_Speed < Set_Speed) && (LeadVehicle_Speed >
rtb_DriveVehicle_Speed) && (Time_Gap >= Set_Gap)) {
Adaptive_Cruise_Control_DW.is_ACC_ON_MODE =
IN_LeadVehicle_Speed_equal_Set_;
Adaptive_Cruise_Control_Y.Acceleration_Mode_h = 5U;
} else {
Adaptive_Cruise_Control_DW.is_ACC_ON_MODE =
IN_LeadVehicle_Detected_follow;
Adaptive_Cruise_Control_Y.Acceleration_Mode_h = 2U;
}
break;
case IN_LeadVehicle_Detected_follow:
Adaptive_Cruise_Control_Y.Acceleration_Mode_h = 2U;
if (LeadVehicle_Detected == 0) {
Adaptive_Cruise_Control_DW.is_ACC_ON_MODE =
Ada_IN_LeadVehicle_Not_Detected;
Adaptive_Cruise_Control_Y.Acceleration_Mode_h = 1U;
} else if (((LeadVehicle_Detected == 1) && (LeadVehicle_Speed <
Set_Speed)) || (Time_Gap < Set_Gap)) {
Adaptive_Cruise_Control_DW.is_ACC_ON_MODE =
IN_LeadVehicle_Speed_lessthan_S;
Adaptive_Cruise_Control_Y.Acceleration_Mode_h = 4U;
}
break;
case Ada_IN_LeadVehicle_Not_Detected:
Adaptive_Cruise_Control_Y.Acceleration_Mode_h = 1U;
if ((LeadVehicle_Detected == 1) && (rtb_DriveVehicle_Speed ==
Set_Speed) && (LeadVehicle_Speed >= Set_Speed) && (Time_Gap >=
Set_Gap)) {
Adaptive_Cruise_Control_DW.is_ACC_ON_MODE =
IN_LeadVehicle_Detected_follow;
Adaptive_Cruise_Control_Y.Acceleration_Mode_h = 2U;
} else if (((LeadVehicle_Detected == 1) && (LeadVehicle_Speed <
Set_Speed)) || (Time_Gap < Set_Gap)) {
Adaptive_Cruise_Control_DW.is_ACC_ON_MODE =
IN_LeadVehicle_Speed_lessthan_S;
Adaptive_Cruise_Control_Y.Acceleration_Mode_h = 4U;
}
break;
case IN_LeadVehicle_Not_Detected_Res:
Adaptive_Cruise_Control_Y.Acceleration_Mode_h = 1U;
break;
case IN_LeadVehicle_Speed_equal_Set_:
Adaptive_Cruise_Control_Y.Acceleration_Mode_h = 5U;
if (((LeadVehicle_Speed < Set_Speed) && (LeadVehicle_Speed <
rtb_DriveVehicle_Speed)) || ((int32_T)rt_roundd_snf(0.75 *
(real_T)Set_Gap) == Time_Gap)) {
Adaptive_Cruise_Control_DW.is_ACC_ON_MODE =
IN_LeadVehicle_Speed_lessthan_S;
Adaptive_Cruise_Control_Y.Acceleration_Mode_h = 4U;
} else if (((rtb_DriveVehicle_Speed < Set_Speed) && (LeadVehicle_Speed
> rtb_DriveVehicle_Speed)) || (Time_Gap >= Set_Gap)) {
Adaptive_Cruise_Control_DW.is_ACC_ON_MODE =
IN_LeadVehicle_Detected_Resume;
Adaptive_Cruise_Control_Y.Acceleration_Mode_h = 3U;
} else if ((LeadVehicle_Detected == 0) || (rtb_DriveVehicle_Speed <=
Set_Speed)) {
Adaptive_Cruise_Control_DW.is_ACC_ON_MODE =
IN_LeadVehicle_Not_Detected_Res;
Adaptive_Cruise_Control_Y.Acceleration_Mode_h = 1U;
}
break;
default:
/* case IN_LeadVehicle_Speed_lessthan_Set_Speed: */
Adaptive_Cruise_Control_Y.Acceleration_Mode_h = 4U;
if ((LeadVehicle_Detected == 0) && (rtb_DriveVehicle_Speed ==
Set_Speed)) {
Adaptive_Cruise_Control_DW.is_ACC_ON_MODE =
Ada_IN_LeadVehicle_Not_Detected;
Adaptive_Cruise_Control_Y.Acceleration_Mode_h = 1U;
} else {
tmp = (int32_T)rt_roundd_snf((real_T)LeadVehicle_Speed * 1.25);
tmp_0 = (int32_T)rt_roundd_snf(1.25 * (real_T)Set_Gap);
if (tmp < 256) {
tmp_1 = (uint8_T)tmp;
} else {
tmp_1 = MAX_uint8_T;
}
if (tmp_0 < 256) {
tmp_2 = (uint8_T)tmp_0;
} else {
tmp_2 = MAX_uint8_T;
}
if ((tmp_1 >= rtb_DriveVehicle_Speed) && ((int32_T)rt_roundd_snf
((real_T)LeadVehicle_Speed * 0.75) <= rtb_DriveVehicle_Speed) &&
(rtb_DriveVehicle_Speed < Set_Speed) && (Time_Gap <= tmp_2) &&
(Time_Gap >= (int32_T)rt_roundd_snf(0.75 * (real_T)Set_Gap))) {
Adaptive_Cruise_Control_DW.is_ACC_ON_MODE =
IN_LeadVehicle_Speed_equal_Set_;
Adaptive_Cruise_Control_Y.Acceleration_Mode_h = 5U;
}
}
break;
}
}
break;
default:
/* case IN_ACC_STANDBY_MODE: */
Adaptive_Cruise_Control_Y.Acceleration_Mode_h = 1U;
if (SetSwitch) {
Adaptive_Cruise_Control_DW.is_c3_Adaptive_Cruise_Control =
Adaptive_Cruise__IN_ACC_ON_MODE;
Adaptive_Cruise_Control_DW.is_ACC_ON_MODE =
IN_LeadVehicle_Detected_follow;
Adaptive_Cruise_Control_Y.Acceleration_Mode_h = 2U;
} else if (!CruiseSwitch) {
Adaptive_Cruise_Control_DW.is_c3_Adaptive_Cruise_Control =
Adaptive_Cruise_IN_ACC_OFF_MODE;
Adaptive_Cruise_Control_Y.Acceleration_Mode_h = 0U;
}
break;
}
}
/* End of Chart: '<S2>/Chart' */
}
/* Model initialize function */
void Adaptive_Cruise_Control_initialize(void)
{
/* (no initialization code required) */
}
/* Model terminate function */
void Adaptive_Cruise_Control_terminate(void)
{
/* (no terminate code required) */
}
/*
* File trailer for generated code.
*
* [EOF]
*/
Conclusion :
* The SLDD file creation and the model building according to the given requirements is done.
* The Model Advisor check is also done for the model after changing the model settings.
* The C CODE generation for the model is also generated.
* The wanted images of the model and the reults are also attached.
Note :
below i am attaching the ZIP file in which the .SLX file, .C file of the C CODE, requirements word file, vechile_direction_ert_rtw file, MAB_MODEL_REPORT and test case are attached for the reference. please conside it.
Thank you ;
B. V. N. SANDEEP.