Project 2 Adaptive Cruise Control
ANSWER : model
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.
All the Requirement 3a,b,c in this block :
SLDD :
model advisor :
Generated code:

/*
* File: MBDMAINPROJECT.c
*
* Code generated for Simulink model 'MBDMAINPROJECT'.
*
* Model version : 1.18
* Simulink Coder version : 9.5 (R2021a) 14-Nov-2020
* C/C++ source code generated on : Sat Apr 8 10:38:36 2023
*
* Target selection: ert.tlc
* Embedded hardware selection: Intel->x86-64 (Windows64)
* Code generation objectives: Unspecified
* Validation result: Not run
*/
#include "MBDMAINPROJECT.h"
#include "MBDMAINPROJECT_private.h"
/* Named constants for Chart: '/Chart' */
#define IN_LeadVehicle_Detected_Follow1 ((uint8_T)1U)
#define IN_LeadVehicle_Detected_Resume ((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)
#define MBDMAINPROJECT_IN_OFF_Mode ((uint8_T)1U)
#define MBDMAINPROJECT_IN_ON_Mode ((uint8_T)2U)
#define MBDMAINPROJECT_IN_STANDBY_Mode ((uint8_T)3U)
#define MBDMAINPROJE_IN_NO_ACTIVE_CHILD ((uint8_T)0U)
#define MB_IN_LeadVehicle_Not_Detected1 ((uint8_T)3U)
/* Block signals (default storage) */
B_MBDMAINPROJECT_T MBDMAINPROJECT_B;
/* Block states (default storage) */
DW_MBDMAINPROJECT_T MBDMAINPROJECT_DW;
/* External inputs (root inport signals with default storage) */
ExtU_MBDMAINPROJECT_T MBDMAINPROJECT_U;
/* Real-time model */
static RT_MODEL_MBDMAINPROJECT_T MBDMAINPROJECT_M_;
RT_MODEL_MBDMAINPROJECT_T *const MBDMAINPROJECT_M = &MBDMAINPROJECT_M_;
/* Model step function */
void MBDMAINPROJECT_step(void)
{
real_T rtb_Add;
real_T rtb_Add_f;
/* Sum: '/Add' incorporates:
* Delay: '/Delay'
* Inport: '/CameraInput_DriveVehicle'
* Inport: '/RadarInput_DriveVehicle'
*/
rtb_Add = (MBDMAINPROJECT_U.CameraInput_DriveVehicle +
MBDMAINPROJECT_U.RadarInput_DriveVehicle) +
MBDMAINPROJECT_B.Acceleration_Mode;
/* Sum: '/Add' incorporates:
* Inport: '/CameraInput_LeadVehicle'
* Inport: '/RadarInput_LeadVehicle'
*/
rtb_Add_f = MBDMAINPROJECT_U.CameraInput_LeadVehicle +
MBDMAINPROJECT_U.RadarInput_LeadVehicle;
/* Chart: '/Chart' incorporates:
* Inport: '/CruiseSwitch'
* Inport: '/RadarInput_DriveVehicle'
* Inport: '/SetSwitch'
* Inport: '/Set_Gap'
* Inport: '/Set_Speed'
* Inport: '/Time_Gap'
*/
if (MBDMAINPROJECT_DW.is_active_c3_MBDMAINPROJECT == 0U) {
MBDMAINPROJECT_DW.is_active_c3_MBDMAINPROJECT = 1U;
MBDMAINPROJECT_DW.is_c3_MBDMAINPROJECT = MBDMAINPROJECT_IN_OFF_Mode;
MBDMAINPROJECT_B.Acceleration_Mode = 0.0;
} else {
switch (MBDMAINPROJECT_DW.is_c3_MBDMAINPROJECT) {
case MBDMAINPROJECT_IN_OFF_Mode:
MBDMAINPROJECT_B.Acceleration_Mode = 0.0;
if (MBDMAINPROJECT_U.CruiseSwitch == 1.0) {
MBDMAINPROJECT_DW.is_c3_MBDMAINPROJECT = MBDMAINPROJECT_IN_STANDBY_Mode;
MBDMAINPROJECT_B.Acceleration_Mode = 1.0;
}
break;
case MBDMAINPROJECT_IN_ON_Mode:
if (MBDMAINPROJECT_U.SetSwitch == 0.0) {
MBDMAINPROJECT_DW.is_ON_Mode = MBDMAINPROJE_IN_NO_ACTIVE_CHILD;
MBDMAINPROJECT_DW.is_c3_MBDMAINPROJECT = MBDMAINPROJECT_IN_STANDBY_Mode;
MBDMAINPROJECT_B.Acceleration_Mode = 1.0;
} else if (MBDMAINPROJECT_U.CruiseSwitch == 0.0) {
MBDMAINPROJECT_DW.is_ON_Mode = MBDMAINPROJE_IN_NO_ACTIVE_CHILD;
MBDMAINPROJECT_DW.is_c3_MBDMAINPROJECT = MBDMAINPROJECT_IN_OFF_Mode;
MBDMAINPROJECT_B.Acceleration_Mode = 0.0;
} else {
switch (MBDMAINPROJECT_DW.is_ON_Mode) {
case IN_LeadVehicle_Detected_Follow1:
MBDMAINPROJECT_B.Acceleration_Mode = 2.0;
if (MBDMAINPROJECT_U.RadarInput_DriveVehicle == 0.0) {
MBDMAINPROJECT_DW.is_ON_Mode = MB_IN_LeadVehicle_Not_Detected1;
} else if (((MBDMAINPROJECT_U.RadarInput_DriveVehicle == 1.0) &&
(rtb_Add_f < MBDMAINPROJECT_U.Set_Speed)) ||
(MBDMAINPROJECT_U.Time_Gap < MBDMAINPROJECT_U.Set_Gap)) {
MBDMAINPROJECT_DW.is_ON_Mode = IN_LeadVehicle_Speed_lessthan_S;
MBDMAINPROJECT_B.Acceleration_Mode = 4.0;
}
break;
case IN_LeadVehicle_Detected_Resume:
MBDMAINPROJECT_B.Acceleration_Mode = 3.0;
if ((rtb_Add == MBDMAINPROJECT_U.Set_Speed) && (rtb_Add_f >=
MBDMAINPROJECT_U.Set_Speed) && (MBDMAINPROJECT_U.Time_Gap >=
MBDMAINPROJECT_U.Set_Gap)) {
MBDMAINPROJECT_DW.is_ON_Mode = IN_LeadVehicle_Detected_Follow1;
MBDMAINPROJECT_B.Acceleration_Mode = 2.0;
} else if (MBDMAINPROJECT_U.RadarInput_DriveVehicle == 0.0) {
MBDMAINPROJECT_DW.is_ON_Mode = IN_LeadVehicle_Not_Detected_Res;
MBDMAINPROJECT_B.Acceleration_Mode = 1.0;
} else if ((rtb_Add < MBDMAINPROJECT_U.Set_Speed) && (rtb_Add_f >
rtb_Add) && (MBDMAINPROJECT_U.Time_Gap >=
MBDMAINPROJECT_U.Set_Gap)) {
MBDMAINPROJECT_DW.is_ON_Mode = IN_LeadVehicle_Speed_equal_Set_;
MBDMAINPROJECT_B.Acceleration_Mode = 5.0;
}
break;
case MB_IN_LeadVehicle_Not_Detected1:
if ((MBDMAINPROJECT_U.RadarInput_DriveVehicle == 1.0) && (rtb_Add ==
MBDMAINPROJECT_U.Set_Speed) && (rtb_Add_f >=
MBDMAINPROJECT_U.Set_Speed) && (MBDMAINPROJECT_U.Time_Gap >=
MBDMAINPROJECT_U.Set_Gap)) {
MBDMAINPROJECT_DW.is_ON_Mode = IN_LeadVehicle_Detected_Follow1;
MBDMAINPROJECT_B.Acceleration_Mode = 2.0;
} else if (((MBDMAINPROJECT_U.RadarInput_DriveVehicle == 1.0) &&
(rtb_Add_f < MBDMAINPROJECT_U.Set_Speed)) ||
(MBDMAINPROJECT_U.Time_Gap < MBDMAINPROJECT_U.Set_Gap)) {
MBDMAINPROJECT_DW.is_ON_Mode = IN_LeadVehicle_Speed_lessthan_S;
MBDMAINPROJECT_B.Acceleration_Mode = 4.0;
}
break;
case IN_LeadVehicle_Not_Detected_Res:
MBDMAINPROJECT_B.Acceleration_Mode = 1.0;
break;
case IN_LeadVehicle_Speed_equal_Set_:
MBDMAINPROJECT_B.Acceleration_Mode = 5.0;
if ((MBDMAINPROJECT_U.RadarInput_DriveVehicle == 0.0) || (rtb_Add <=
MBDMAINPROJECT_U.Set_Speed)) {
MBDMAINPROJECT_DW.is_ON_Mode = IN_LeadVehicle_Not_Detected_Res;
MBDMAINPROJECT_B.Acceleration_Mode = 1.0;
} else if (((rtb_Add < MBDMAINPROJECT_U.Set_Speed) && (rtb_Add_f >
rtb_Add)) || (MBDMAINPROJECT_U.Time_Gap >=
MBDMAINPROJECT_U.Set_Gap)) {
MBDMAINPROJECT_DW.is_ON_Mode = IN_LeadVehicle_Detected_Resume;
MBDMAINPROJECT_B.Acceleration_Mode = 3.0;
} else if (((rtb_Add_f < MBDMAINPROJECT_U.Set_Speed) && (rtb_Add_f <
rtb_Add)) || (0.75 * MBDMAINPROJECT_U.Set_Gap ==
MBDMAINPROJECT_U.Time_Gap)) {
MBDMAINPROJECT_DW.is_ON_Mode = IN_LeadVehicle_Speed_lessthan_S;
MBDMAINPROJECT_B.Acceleration_Mode = 4.0;
}
break;
default:
/* case IN_LeadVehicle_Speed_lessthan_Set_Speed1: */
MBDMAINPROJECT_B.Acceleration_Mode = 4.0;
if ((MBDMAINPROJECT_U.RadarInput_DriveVehicle == 0.0) && (rtb_Add ==
MBDMAINPROJECT_U.Set_Speed)) {
MBDMAINPROJECT_DW.is_ON_Mode = MB_IN_LeadVehicle_Not_Detected1;
} else if ((rtb_Add_f * 1.25 >= rtb_Add) && (rtb_Add_f * 0.75 <=
rtb_Add) && (rtb_Add < MBDMAINPROJECT_U.Set_Speed) &&
(MBDMAINPROJECT_U.Time_Gap <= 1.25 *
MBDMAINPROJECT_U.Set_Gap) && (MBDMAINPROJECT_U.Time_Gap >=
0.75 * MBDMAINPROJECT_U.Set_Gap)) {
MBDMAINPROJECT_DW.is_ON_Mode = IN_LeadVehicle_Speed_equal_Set_;
MBDMAINPROJECT_B.Acceleration_Mode = 5.0;
}
break;
}
}
break;
default:
/* case IN_STANDBY_Mode: */
MBDMAINPROJECT_B.Acceleration_Mode = 1.0;
if (MBDMAINPROJECT_U.SetSwitch == 1.0) {
MBDMAINPROJECT_DW.is_c3_MBDMAINPROJECT = MBDMAINPROJECT_IN_ON_Mode;
MBDMAINPROJECT_DW.is_ON_Mode = IN_LeadVehicle_Detected_Follow1;
MBDMAINPROJECT_B.Acceleration_Mode = 2.0;
} else if (MBDMAINPROJECT_U.CruiseSwitch == 0.0) {
MBDMAINPROJECT_DW.is_c3_MBDMAINPROJECT = MBDMAINPROJECT_IN_OFF_Mode;
MBDMAINPROJECT_B.Acceleration_Mode = 0.0;
}
break;
}
}
/* End of Chart: '/Chart' */
}
/* Model initialize function */
void MBDMAINPROJECT_initialize(void)
{
/* (no initialization code required) */
}
/* Model terminate function */
void MBDMAINPROJECT_terminate(void)
{
/* (no terminate code required) */
}
/*
* File trailer for generated code.
*
* [EOF]
*/