Project 2 Adaptive Cruise Control
Aim:Adaptive Cruise Control Feature for passenger cars allows the host vehicle to adapt to the speed in line with the flow of traffic
Overview:
- 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, Storage class for Input signals: ImportedExtern; Storage class for Output signal: Export to File; Storage class for local signals: localizable; Storage class for calibration signals: Const.
- Choose sample time for all signals as 0.01s
Data dictionary:


Reqiurments:
Requirement 1– Lead Vehicle:

Requirement 2 – Drive Vehicle:

Requirement 3 – Adaptive Cruise Control Algorithm:





zip file contains all the data




Result:
/*
* File: finalacc.c
*
* Code generated for Simulink model 'finalacc'.
*
* Model version : 1.18
* Simulink Coder version : 9.5 (R2021a) 14-Nov-2020
* C/C++ source code generated on : Sat May 28 13:49:24 2022
*
* Target selection: ert.tlc
* Embedded hardware selection: Intel->x86-64 (Windows64)
* Code generation objectives: Unspecified
* Validation result: Not run
*/
#include "finalacc.h"
#include "finalacc_private.h"
/* Named constants for Chart: '<S2>/acc_logic' */
#define IN_LeadVehicle_Detected_Follow ((uint8_T)1U)
#define IN_LeadVehicle_Detected_Resume ((uint8_T)2U)
#define IN_LeadVehicle_Not_Detected_Res ((uint8_T)4U)
#define IN_LeadVehicle_Speed_lessthan_S ((uint8_T)5U)
#define IN_LeadVehivcle_Speed_equal_Set ((uint8_T)6U)
#define fin_IN_LeadVehicle_Not_Detected ((uint8_T)3U)
#define finalacc_IN_ACC_OFF_MODE ((uint8_T)1U)
#define finalacc_IN_ACC_ON_MODE ((uint8_T)2U)
#define finalacc_IN_ACC_STANDBY_MODE ((uint8_T)3U)
#define finalacc_IN_NO_ACTIVE_CHILD ((uint8_T)0U)
/* Block states (default storage) */
DW_finalacc_T finalacc_DW;
/* External inputs (root inport signals with default storage) */
ExtU_finalacc_T finalacc_U;
/* External outputs (root outports fed by signals with default storage) */
ExtY_finalacc_T finalacc_Y;
/* Real-time model */
static RT_MODEL_finalacc_T finalacc_M_;
RT_MODEL_finalacc_T *const finalacc_M = &finalacc_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 finalacc_step(void)
{
int32_T tmp;
int32_T tmp_0;
uint8_T rtb_DriveVehicle_Speed;
uint8_T rtb_LeadVehicle_Speed;
uint8_T tmp_1;
/* Outputs for Atomic SubSystem: '<Root>/Adaptive_Cruise_Control' */
/* Sum: '<S4>/Add' incorporates:
* Inport: '<Root>/CameraInput_LeadVehicle'
* Inport: '<Root>/RadarInput_LeadVehicle'
*/
rtb_LeadVehicle_Speed = (uint8_T)((uint32_T)finalacc_U.CameraInput_LeadVehicle
+ finalacc_U.RadarInput_LeadVehicle);
/* Sum: '<S3>/Add1' incorporates:
* Inport: '<Root>/CameraInput_DriveVehicle'
* Inport: '<Root>/RadarInput_DriveVehicle'
*/
rtb_DriveVehicle_Speed = (uint8_T)((uint32_T)
finalacc_U.CameraInput_DriveVehicle + finalacc_U.RadarInput_DriveVehicle);
/* Chart: '<S2>/acc_logic' incorporates:
* Inport: '<Root>/CruiseSwitch'
* Inport: '<Root>/RadarInput_DriveVehicle'
* Inport: '<Root>/SetSwitch'
* Inport: '<Root>/Set_Gap'
* Inport: '<Root>/Set_Speed'
* Inport: '<Root>/Time_Gap'
*/
if (finalacc_DW.is_active_c3_finalacc == 0U) {
finalacc_DW.is_active_c3_finalacc = 1U;
finalacc_DW.is_c3_finalacc = finalacc_IN_ACC_OFF_MODE;
/* Outport: '<Root>/Acceleration_Mode' */
finalacc_Y.Acceleration_Mode = 0U;
} else {
switch (finalacc_DW.is_c3_finalacc) {
case finalacc_IN_ACC_OFF_MODE:
/* Outport: '<Root>/Acceleration_Mode' */
finalacc_Y.Acceleration_Mode = 0U;
if (finalacc_U.CruiseSwitch) {
finalacc_DW.is_c3_finalacc = finalacc_IN_ACC_STANDBY_MODE;
/* Outport: '<Root>/Acceleration_Mode' */
finalacc_Y.Acceleration_Mode = 1U;
}
break;
case finalacc_IN_ACC_ON_MODE:
if (!finalacc_U.CruiseSwitch) {
finalacc_DW.is_ACC_ON_MODE = finalacc_IN_NO_ACTIVE_CHILD;
finalacc_DW.is_c3_finalacc = finalacc_IN_ACC_OFF_MODE;
/* Outport: '<Root>/Acceleration_Mode' */
finalacc_Y.Acceleration_Mode = 0U;
} else if (!finalacc_U.SetSwitch) {
finalacc_DW.is_ACC_ON_MODE = finalacc_IN_NO_ACTIVE_CHILD;
finalacc_DW.is_c3_finalacc = finalacc_IN_ACC_STANDBY_MODE;
/* Outport: '<Root>/Acceleration_Mode' */
finalacc_Y.Acceleration_Mode = 1U;
} else {
switch (finalacc_DW.is_ACC_ON_MODE) {
case IN_LeadVehicle_Detected_Follow:
/* Outport: '<Root>/Acceleration_Mode' */
finalacc_Y.Acceleration_Mode = 2U;
if (((rtb_DriveVehicle_Speed == 1) &&
(finalacc_U.RadarInput_DriveVehicle < finalacc_U.Set_Speed)) ||
(finalacc_U.Time_Gap < finalacc_U.Set_Gap)) {
finalacc_DW.is_ACC_ON_MODE = IN_LeadVehicle_Speed_lessthan_S;
/* Outport: '<Root>/Acceleration_Mode' */
finalacc_Y.Acceleration_Mode = 4U;
} else if (rtb_DriveVehicle_Speed == 0) {
finalacc_DW.is_ACC_ON_MODE = fin_IN_LeadVehicle_Not_Detected;
/* Outport: '<Root>/Acceleration_Mode' */
finalacc_Y.Acceleration_Mode = 1U;
}
break;
case IN_LeadVehicle_Detected_Resume:
/* Outport: '<Root>/Acceleration_Mode' */
finalacc_Y.Acceleration_Mode = 3U;
if ((rtb_LeadVehicle_Speed == finalacc_U.Set_Speed) &&
(finalacc_U.RadarInput_DriveVehicle >= finalacc_U.Set_Speed) &&
(finalacc_U.Time_Gap >= finalacc_U.Set_Gap)) {
finalacc_DW.is_ACC_ON_MODE = IN_LeadVehicle_Detected_Follow;
/* Outport: '<Root>/Acceleration_Mode' */
finalacc_Y.Acceleration_Mode = 2U;
} else if (rtb_DriveVehicle_Speed == 0) {
finalacc_DW.is_ACC_ON_MODE = IN_LeadVehicle_Not_Detected_Res;
/* Outport: '<Root>/Acceleration_Mode' */
finalacc_Y.Acceleration_Mode = 1U;
} else if ((rtb_LeadVehicle_Speed < finalacc_U.Set_Speed) &&
(finalacc_U.RadarInput_DriveVehicle > rtb_LeadVehicle_Speed)
&& (finalacc_U.Time_Gap >= finalacc_U.Set_Gap)) {
finalacc_DW.is_ACC_ON_MODE = IN_LeadVehivcle_Speed_equal_Set;
/* Outport: '<Root>/Acceleration_Mode' */
finalacc_Y.Acceleration_Mode = 5U;
}
break;
case fin_IN_LeadVehicle_Not_Detected:
/* Outport: '<Root>/Acceleration_Mode' */
finalacc_Y.Acceleration_Mode = 1U;
if ((rtb_DriveVehicle_Speed == 1) && (rtb_LeadVehicle_Speed ==
finalacc_U.Set_Speed) && (finalacc_U.RadarInput_DriveVehicle >=
finalacc_U.Set_Speed) && (finalacc_U.Time_Gap >=
finalacc_U.Set_Gap)) {
finalacc_DW.is_ACC_ON_MODE = IN_LeadVehicle_Detected_Follow;
/* Outport: '<Root>/Acceleration_Mode' */
finalacc_Y.Acceleration_Mode = 2U;
} else if (((rtb_DriveVehicle_Speed == 1) &&
(finalacc_U.RadarInput_DriveVehicle < finalacc_U.Set_Speed))
|| (finalacc_U.Time_Gap < finalacc_U.Set_Gap)) {
finalacc_DW.is_ACC_ON_MODE = IN_LeadVehicle_Speed_lessthan_S;
/* Outport: '<Root>/Acceleration_Mode' */
finalacc_Y.Acceleration_Mode = 4U;
}
break;
case IN_LeadVehicle_Not_Detected_Res:
/* Outport: '<Root>/Acceleration_Mode' */
finalacc_Y.Acceleration_Mode = 1U;
break;
case IN_LeadVehicle_Speed_lessthan_S:
/* Outport: '<Root>/Acceleration_Mode' */
finalacc_Y.Acceleration_Mode = 4U;
if ((rtb_DriveVehicle_Speed == 0) && (rtb_LeadVehicle_Speed ==
finalacc_U.Set_Speed)) {
finalacc_DW.is_ACC_ON_MODE = fin_IN_LeadVehicle_Not_Detected;
/* Outport: '<Root>/Acceleration_Mode' */
finalacc_Y.Acceleration_Mode = 1U;
} else {
tmp = (int32_T)rt_roundd_snf((real_T)
finalacc_U.RadarInput_DriveVehicle * 1.25);
tmp_0 = (int32_T)rt_roundd_snf(1.25 * (real_T)finalacc_U.Set_Gap);
if (tmp < 256) {
rtb_DriveVehicle_Speed = (uint8_T)tmp;
} else {
rtb_DriveVehicle_Speed = MAX_uint8_T;
}
if (tmp_0 < 256) {
tmp_1 = (uint8_T)tmp_0;
} else {
tmp_1 = MAX_uint8_T;
}
if ((rtb_DriveVehicle_Speed >= rtb_LeadVehicle_Speed) && ((int32_T)
rt_roundd_snf((real_T)finalacc_U.RadarInput_DriveVehicle * 0.75)
<= rtb_LeadVehicle_Speed) && (rtb_LeadVehicle_Speed <
finalacc_U.Set_Speed) && (finalacc_U.Time_Gap <= tmp_1) &&
(finalacc_U.Time_Gap >= (int32_T)rt_roundd_snf(0.75 * (real_T)
finalacc_U.Set_Gap))) {
finalacc_DW.is_ACC_ON_MODE = IN_LeadVehivcle_Speed_equal_Set;
/* Outport: '<Root>/Acceleration_Mode' */
finalacc_Y.Acceleration_Mode = 5U;
}
}
break;
default:
/* Outport: '<Root>/Acceleration_Mode' */
/* case IN_LeadVehivcle_Speed_equal_Set_Speed: */
finalacc_Y.Acceleration_Mode = 5U;
if ((rtb_DriveVehicle_Speed == 0) || (rtb_LeadVehicle_Speed <=
finalacc_U.Set_Speed)) {
finalacc_DW.is_ACC_ON_MODE = IN_LeadVehicle_Not_Detected_Res;
/* Outport: '<Root>/Acceleration_Mode' */
finalacc_Y.Acceleration_Mode = 1U;
} else if (((finalacc_U.RadarInput_DriveVehicle < finalacc_U.Set_Speed)
&& (finalacc_U.RadarInput_DriveVehicle <
rtb_LeadVehicle_Speed)) || ((int32_T)rt_roundd_snf
(0.75 * (real_T)finalacc_U.Set_Gap) == finalacc_U.Time_Gap))
{
finalacc_DW.is_ACC_ON_MODE = IN_LeadVehicle_Speed_lessthan_S;
/* Outport: '<Root>/Acceleration_Mode' */
finalacc_Y.Acceleration_Mode = 4U;
} else if (((rtb_LeadVehicle_Speed < finalacc_U.Set_Speed) &&
(finalacc_U.RadarInput_DriveVehicle >
rtb_LeadVehicle_Speed)) || (finalacc_U.Time_Gap >=
finalacc_U.Set_Gap)) {
finalacc_DW.is_ACC_ON_MODE = IN_LeadVehicle_Detected_Resume;
/* Outport: '<Root>/Acceleration_Mode' */
finalacc_Y.Acceleration_Mode = 3U;
}
break;
}
}
break;
default:
/* Outport: '<Root>/Acceleration_Mode' */
/* case IN_ACC_STANDBY_MODE: */
finalacc_Y.Acceleration_Mode = 1U;
if (!finalacc_U.CruiseSwitch) {
finalacc_DW.is_c3_finalacc = finalacc_IN_ACC_OFF_MODE;
/* Outport: '<Root>/Acceleration_Mode' */
finalacc_Y.Acceleration_Mode = 0U;
} else if (finalacc_U.SetSwitch) {
finalacc_DW.is_c3_finalacc = finalacc_IN_ACC_ON_MODE;
finalacc_DW.is_ACC_ON_MODE = IN_LeadVehicle_Detected_Follow;
/* Outport: '<Root>/Acceleration_Mode' */
finalacc_Y.Acceleration_Mode = 2U;
}
break;
}
}
/* End of Chart: '<S2>/acc_logic' */
/* End of Outputs for SubSystem: '<Root>/Adaptive_Cruise_Control' */
}
/* Model initialize function */
void finalacc_initialize(void)
{
/* (no initialization code required) */
}
/* Model terminate function */
void finalacc_terminate(void)
{
/* (no terminate code required) */
}
/*
* File trailer for generated code.
*
* [EOF]
*/