Challenge

Project 2 Adaptive Cruise Control

PORJECT :

Main Project Adaptive Cruise Control ( ACC ) :

AIM :

Developing Adaptive Cruise Control feature as per the Requirement Document using MATLAB Simulink.

General Overview :

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 a 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 , the 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 acceleration 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 stops & 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 stops & 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.

The objective of the Main Project :

1. Developing Adaptive Cruise Control feature as per the Requirement Document using MATLAB Simulink .

2. Follow all the MBD related processes : Requirement Tagging & Traceability , SLDD creation , Configuration Parameter changes , Model Advisor check & Code Generation .

3. In Configuration Parameters : enable " Support Floating Numbers " under Code Generation settings .

4. Use Embedded Coder to generate the code .

5. 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 .

6. Choose sample time for all signals as 0.01s.

Requirement 1- Lead Vehicle :

  • A lead vehicle is a vehicle that is driving in the road ahead of our drive vehicle . Two input signals ( Signal Name : Cameralnput_Lead Vehicle & Radarinput_LeadVehicle ) .
  • Ideally , sensor fusion techniques will be deployed to process & analyze data from cameras & 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 algorithum.

Requirement 2 - Drive Vehicle :

  • Drive Vehicle is the vehicle driven by the user & this is the vehicle that has ACC algorithm in it .
  • Like the Lead Vehicle , the Driver Vehicle algorithm also has 2 input signals ( Signal Name : Cameralnput_Drive Vehicle , Radarinput_Drive Vehicle ) & 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 Drive Vehicle_Speed is the summation of three input signals mentioned above & LeadVehicle_Detected is renamed from Input Signal Radarinput_DriveVehicle by more 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 , the 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 ) that 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 the 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 the 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

Requirement 3c ( i ) - LoadVehicle_Detected_Follow(ACC ON MODE) :

  • This is the default substate inside the 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 ) - Lead Vehicle 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 [ ( Lead Vehicle_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 ) II ( Time_Gap < Set_Gap ) ] .

Requirement 3c ( iii ) - Lead Vehicle Detected Resume ( ACC ON MODE ) :

  • Output signal Acceleration_Mode is equal to 3 .
  • Condition to transit from LeadVehicle_Detected_Resume to Lead Vehicle Detected_Follow , Input signals condition [ ( Drive Vehicle_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 [ ( Drive Vehicle_Speed < Set Speed ) && ( LeadVehicle_Speed > DriveVehicle_Speed ) && ( Time_Gap > = Set_Gap ) ] .

Requirement 3c ( iv ) - Lead Vehicle 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_Spee to LeadVehicle_Not_Detected ; Input signal condition [ ( LeadVehicle_Detected == 0) && ( DriveVehicle_Speed == Set_Speed)].
  • Condition to transit == ( 0 ) Set_Speed ) ] from LeadVehicle_Speed_lessthan_Set_Speed to LeadVehicle_Speed_equal_Set_Speed ; Input signals condition [ ( ( Lead Vehicle_Speed * 1.25 > = Drive Vehicle_Speed ) && ( LeadVehicle_Speed * 0.75 < = Drive Vehicle_Speed ) ) && ( Drive Vehicle_Speed < Set_Speed ) && ( ( Time_Gap < = 1.25 * Set_Gap ) && ( Time_Gap > = 0.75 * Set_Gap ) ) ].

Requirement 3c ( vi ) - Lead Vehicle_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_Spee <= Set_Speed)].
  • Condition to transit from LeadVehicle_Speed_equal_Set_Speed to LeadVehicle_Detected_Resume ; Input signal conditions [ ( Drive Vehicle_Speed < Set_Speed ) && ( LeadVehicle_Speed > Drive Vehicle_Speed ) II ( Time_Gap > = Set_Gap ) ] . Condition to transit from LeadVehicle_Speed_equal_Set_Speed to LeadVehicle_Speed_lessthan_Set_Speed ; Input signals conditions [ ( LeadVehicle_Speed < set_speed ) && = " " ( leadvehicle_speed < drivevehicle_speed ) = " " || = " " ( time_gap = " = 0.75 * Set_Gap ) ] < / em " > < / set_speed ) >.

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

-

-

Procedure :

As per the Requirement document , implemented the Adaptive Cruise Control feature .

Lead vehicle

To detect the lead vehicle speed , simply added both the radar & camera inputs & the corresponding output is read as Speed profile output .

Drive Vehicle

To regulate the " Drive Vehicle speed , as per the Requirement Document added Cameralnput . Radarinput & Acceleration Mode feedback from ACC Algorithm .

  • To detect the Lead vehicle . Radarinput is converted using " Signal Conversion Block
  • To avoid the algebraic error " Unit delay block is used for the Acceleration Mode feedback .

ACC 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 the state machine system are ( Signal Name Time Gap . Set Speed Set Gap , CruiseSwitch SetSwitch ) Also , the output signals ( Signal Name Drive Vehicle Speed & LeadVehicle Detected ) from requirement - 2 is fed back as an input signal into this state machine block .
  • Additionally , the output signal ( Signal Name LeadVehicle Speed ) from requirement - 1 is given as an input signal to this state machine .
  • Output from this subsystem a signal ( Signal Name Acceleration Model which governs the vehicular speed of the drive vehicle which automatically adjust to speed & velocity to match the lead vehicle .
  • The rest of the signal developed as per the Requirement

DEVELOPMENT OF MATLAB MODEL :

This is the main model subsystem that having 9 inputs

Cameralnput_LeadVehicle , Radarinput_Lead Vehicle , Cameralnput_DriveVehicle , Radarinp ut_DriveVehi , Time_Gap , Set Speed , Set_Gap , CruiseSwitch and SetSwitch entering into the Adaptive Cruise Control subsystem and 4 outputs Acceleration_Mode , LeadVehicle_Speed , Vehicle Detected

There are 3 requirements are designed in 2 subsystems and one state machine flow chart .

Requirement 1- Lead Vehicle :

  • A lead vehicle is a vehicle that is driving in the road ahead of our drive vehicle . Two input signals ( Signal Name : Cameralnput_LeadVehicle & Radarinput_LeadVehicle ) .
  • Ideally , sensor fusion techniques will be deployed to process & analyze data from cameras & 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 that has ACC algorithm in it . .
  • Like the Lead Vehicle , the Driver Vehicle algorithm also has 2 input signals ( Signal Name : Cameralnput_Drive Vehicle , Radarinput_Drive Vehicle ) & 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 : Drive Vehicle_Speed & LeadVehicle_Detected ) .
  • Signal Drive Vehicle_Speed is the 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 :

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 the 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 ON mode or ACC STABDBY 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 the 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

Requirement 3c ( i ) - Lead Vehicle Detected Follow ( ACC ON MODE ) :

  • This is the default substate inside the ACC ON MODE state . Output signal Acceleration_Mode is equal to 2 .
  • Condition to transit from LeadVehicle_Detected_Follow to Lead Vehicle_Not_Detected ; Input signal condition LeadVehicle_Detected == 0 .
  • Condition to transit from LeadVehicle_Detected_Follow to Lead Vehicle_Speed_lessthan_Set_Speed ; Input Signals condition ( LeadVehicle_Detected == 1 ) && ( LeadVehicle_Speed < Set_Speed ) || ( Time_Gap < Set_Gap ) .

Requirement 3c ( ii ) - Lead Vehicle 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 [ ( Lead Vehicle_Detected == 1 ) && ( DriveVehicle_Speed == Set_Speed ) && ( LeadVehicle_Speed > = Set_Speed ) && ( Time_Gap > = Set_Gap ) ] .
  • Condition to transit from LeadVehicle_Not_Detected to Lead Vehicle_Speed_lessthan_Set_Speed ; Input signals condition [ ( LeadVehicle_Detected == 1 ) && ( LeadVehicle_Speed < Set_Speed ) II ( 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 [ ( Drive Vehicle_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 [ ( Drive Vehicle_Speed < Set_Speed ) && ( LeadVehicle_Speed > DriveVehicle_Speed ) && ( Time_Gap > = Set_Gap ) ]

Requirement 3c ( iv ) - Lead Vehicle 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 [ ( Lead Vehicle_Detected = 0 ) && ( Drive Vehicle_Speed == Set_Speed ) ] .
  • Condition to transit from LeadVehicle_Speed_lessthan_Set_Speed to LeadVehicle_Speed_equal_Set_Speed ; Input signals condition [ ( ( Lead Vehicle_Speed * 1.25 > = DriveVehic && ( LeadVehicle_Speed * 0.75 < = DriveVehicle_Speed ) ) && ( Drive Vehicle_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 ) II ( Drive Vehicle_Speed < = Set_Speed ) ] .
  • Condition to transit from LeadVehicle_Speed_equal_Set_Speed to LeadVehicle_Detected_Resume ; Input signal conditions [ ( Drive Vehicle_Speed < Set_Speed ) && ( LeadVehicle_Speed > DriveVehicle_Speed ) II ( Time_Gap > = Set_Gap ) ] .
  • Condition to transit from LeadVehicle_Speed_equal_Set_Speed to LeadVehicle_Speed_lessthan_Set_Speed ; Inpu signals conditions [ ( Lead Vehicle_Speed < set_speed ) && = ( leadvehicle_speed < drivevehicle_speed ) = ' || = " " ( time_gap = " = 0.75 * Set_Gap ) ] < / em " > < / set_speed ).

Requirement Tagging :

All the requirements are tagged for better understandability , anyone who is reviewing the model or who is trying to update the model can get a clear idea of what logic is used in the system . from the requirement manager , we can see what are all are tagged and the description.

Developing SLDD :

All the inputs , outputs, calibration parameters are saved in SLDD so while simulation the model takes all the values and its parameters from the simulink data dictionary.

Configuration Parameter Update :

Various configuration parameters are updated as per the code generation the solver type should be fixed for code egeneration.

Model Advisory Report :

By running the model advisor tool. We can see commonly made modeling errors.

Code generation :

Build a model after go to app and select embedded coder and select build and our code is generated .

Code :

/*
 * File: ACCProject.c
 *
 * Code generated for Simulink model 'ACCProject'.
 *
 * Model version                  : 1.9
 * Simulink Coder version         : 9.7 (R2022a) 13-Nov-2021
 * C/C++ source code generated on : Tue Jun 14 16:14:41 2022
 *
 * Target selection: ert.tlc
 * Embedded hardware selection: Intel->x86-64 (Windows64)
 * Code generation objectives: Unspecified
 * Validation result: Not run
 */

#include "ACCProject.h"
#include "rtwtypes.h"
#include "ACCProject_private.h"
#include <math.h>

/* Named constants for Chart: '<S2>/ACC_Logic' */
#define ACCProject_IN_ACC_OFF_MODE     ((uint8_T)1U)
#define ACCProject_IN_ACC_ON_MODE      ((uint8_T)2U)
#define ACCProject_IN_ACC_STANDBY_MODE ((uint8_T)3U)
#define ACCProject_IN_NO_ACTIVE_CHILD  ((uint8_T)0U)
#define ACC_IN_LeadVehicle_Not_Detected ((uint8_T)3U)
#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_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_ACCProject_T ACCProject_DW;

/* External outputs (root outports fed by signals with default storage) */
ExtY_ACCProject_T ACCProject_Y;

/* Real-time model */
static RT_MODEL_ACCProject_T ACCProject_M_;
RT_MODEL_ACCProject_T *const ACCProject_M = &ACCProject_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 ACCProject_step(void)
{
  /* local block i/o variables */
  uint8_T LeadVehicle_Speed;
  uint8_T DriveVehicle_Speed;
  uint8_T LeadVehicle_Detected;

  /* Sum: '<S4>/Add' incorporates:
   *  Inport: '<Root>/CameraInput_LeadVehicle'
   *  Inport: '<Root>/RadarInput_LeadVehicle'
   */
  LeadVehicle_Speed = (uint8_T)(CameraInput_LeadVehicle + RadarInput_LeadVehicle);

  /* UnitDelay: '<S1>/Unit Delay' */
  Acceleration_Mode = ACCProject_Y.Acceleration_Mode_h;

  /* Sum: '<S3>/Add' incorporates:
   *  Inport: '<Root>/CameraInput_DriveVehicle'
   *  Inport: '<Root>/RadarInput_DriveVehicle'
   */
  DriveVehicle_Speed = (uint8_T)((uint8_T)(CameraInput_DriveVehicle +
    Acceleration_Mode) + RadarInput_DriveVehicle);

  /* SignalConversion: '<S3>/Signal Conversion' incorporates:
   *  Inport: '<Root>/RadarInput_DriveVehicle'
   */
  LeadVehicle_Detected = RadarInput_DriveVehicle;

  /* Chart: '<S2>/ACC_Logic' incorporates:
   *  Inport: '<Root>/CruiseSwitch'
   *  Inport: '<Root>/SetSwitch'
   *  Inport: '<Root>/Set_Gap'
   *  Inport: '<Root>/Set_Speed'
   *  Inport: '<Root>/Time_Gap'
   *  UnitDelay: '<S1>/Unit Delay'
   */
  if (ACCProject_DW.is_active_c3_ACCProject == 0U) {
    ACCProject_DW.is_active_c3_ACCProject = 1U;
    ACCProject_DW.is_c3_ACCProject = ACCProject_IN_ACC_OFF_MODE;
    ACCProject_Y.Acceleration_Mode_h = 0U;
  } else {
    switch (ACCProject_DW.is_c3_ACCProject) {
     case ACCProject_IN_ACC_OFF_MODE:
      ACCProject_Y.Acceleration_Mode_h = 0U;
      if (CruiseSwitch) {
        ACCProject_DW.is_c3_ACCProject = ACCProject_IN_ACC_STANDBY_MODE;
        ACCProject_Y.Acceleration_Mode_h = 1U;
      }
      break;

     case ACCProject_IN_ACC_ON_MODE:
      {
        if (!SetSwitch) {
          ACCProject_DW.is_ACC_ON_MODE = ACCProject_IN_NO_ACTIVE_CHILD;
          ACCProject_DW.is_c3_ACCProject = ACCProject_IN_ACC_STANDBY_MODE;
          ACCProject_Y.Acceleration_Mode_h = 1U;
        } else if (!CruiseSwitch) {
          ACCProject_DW.is_ACC_ON_MODE = ACCProject_IN_NO_ACTIVE_CHILD;
          ACCProject_DW.is_c3_ACCProject = ACCProject_IN_ACC_OFF_MODE;
          ACCProject_Y.Acceleration_Mode_h = 0U;
        } else {
          switch (ACCProject_DW.is_ACC_ON_MODE) {
           case IN_LeadVehicle_Detected_Follow:
            ACCProject_Y.Acceleration_Mode_h = 2U;
            if (LeadVehicle_Detected == 0) {
              ACCProject_DW.is_ACC_ON_MODE = ACC_IN_LeadVehicle_Not_Detected;
              ACCProject_Y.Acceleration_Mode_h = 1U;
            } else if ((LeadVehicle_Detected == 1) && (LeadVehicle_Speed <
                        Set_Speed) && (Time_Gap < Set_Speed)) {
              ACCProject_DW.is_ACC_ON_MODE = IN_LeadVehicle_Speed_lessthan_S;
              ACCProject_Y.Acceleration_Mode_h = 4U;
            }
            break;

           case IN_LeadVehicle_Detected_Resume:
            ACCProject_Y.Acceleration_Mode_h = 3U;
            if ((DriveVehicle_Speed == Set_Speed) && (LeadVehicle_Speed >=
                 Set_Speed) && (Time_Gap >= Set_Speed)) {
              ACCProject_DW.is_ACC_ON_MODE = IN_LeadVehicle_Detected_Follow;
              ACCProject_Y.Acceleration_Mode_h = 2U;
            } else if (LeadVehicle_Detected == 0) {
              ACCProject_DW.is_ACC_ON_MODE = IN_LeadVehicle_Not_Detected_Res;
              ACCProject_Y.Acceleration_Mode_h = 1U;
            } else if ((DriveVehicle_Speed < Set_Speed) && (LeadVehicle_Speed >
                        DriveVehicle_Speed) && (Time_Gap >= Set_Gap)) {
              ACCProject_DW.is_ACC_ON_MODE = IN_LeadVehicle_Speed_equal_Set_;
              ACCProject_Y.Acceleration_Mode_h = 5U;
            }
            break;

           case ACC_IN_LeadVehicle_Not_Detected:
            ACCProject_Y.Acceleration_Mode_h = 1U;
            if ((LeadVehicle_Detected == 1) && (DriveVehicle_Speed == Set_Speed)
                && (LeadVehicle_Speed >= Set_Speed) && (Time_Gap >= Set_Speed))
            {
              ACCProject_DW.is_ACC_ON_MODE = IN_LeadVehicle_Detected_Follow;
              ACCProject_Y.Acceleration_Mode_h = 2U;
            } else if ((LeadVehicle_Detected == 1) && (LeadVehicle_Speed <
                        Set_Speed) && (Time_Gap < Set_Speed)) {
              ACCProject_DW.is_ACC_ON_MODE = IN_LeadVehicle_Speed_lessthan_S;
              ACCProject_Y.Acceleration_Mode_h = 4U;
            }
            break;

           case IN_LeadVehicle_Not_Detected_Res:
            ACCProject_Y.Acceleration_Mode_h = 1U;
            break;

           case IN_LeadVehicle_Speed_equal_Set_:
            ACCProject_Y.Acceleration_Mode_h = 5U;
            if ((LeadVehicle_Speed < Set_Speed) && (LeadVehicle_Speed <
                 DriveVehicle_Speed) && ((int32_T)rt_roundd_snf(0.75 * (real_T)
                  Set_Speed) == Time_Gap)) {
              ACCProject_DW.is_ACC_ON_MODE = IN_LeadVehicle_Speed_lessthan_S;
              ACCProject_Y.Acceleration_Mode_h = 4U;
            } else if (((DriveVehicle_Speed < Set_Speed) && (LeadVehicle_Speed >
              DriveVehicle_Speed)) || (Time_Gap >= Set_Gap)) {
              ACCProject_DW.is_ACC_ON_MODE = IN_LeadVehicle_Detected_Resume;
              ACCProject_Y.Acceleration_Mode_h = 3U;
            } else if ((LeadVehicle_Detected == 0) || (DriveVehicle_Speed <=
                        Set_Speed)) {
              ACCProject_DW.is_ACC_ON_MODE = IN_LeadVehicle_Not_Detected_Res;
              ACCProject_Y.Acceleration_Mode_h = 1U;
            }
            break;

           default:
            {
              /* case IN_LeadVehicle_Speed_lessthan_Set_Speed: */
              ACCProject_Y.Acceleration_Mode_h = 4U;
              if ((LeadVehicle_Detected == 0) && (DriveVehicle_Speed ==
                   Set_Speed)) {
                ACCProject_DW.is_ACC_ON_MODE = ACC_IN_LeadVehicle_Not_Detected;
                ACCProject_Y.Acceleration_Mode_h = 1U;
              } else {
                int32_T tmp;
                int32_T tmp_0;
                uint8_T tmp_1;
                uint8_T tmp_2;
                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 >= DriveVehicle_Speed) && ((int32_T)rt_roundd_snf
                     ((real_T)LeadVehicle_Speed * 0.75) <= DriveVehicle_Speed) &&
                    (DriveVehicle_Speed < Set_Speed) && (Time_Gap <= tmp_2) &&
                    (Time_Gap >= (int32_T)rt_roundd_snf(0.75 * (real_T)Set_Gap)))
                {
                  ACCProject_DW.is_ACC_ON_MODE = IN_LeadVehicle_Speed_equal_Set_;
                  ACCProject_Y.Acceleration_Mode_h = 5U;
                }
              }
            }
            break;
          }
        }
      }
      break;

     default:
      /* case IN_ACC_STANDBY_MODE: */
      ACCProject_Y.Acceleration_Mode_h = 1U;
      if (!CruiseSwitch) {
        ACCProject_DW.is_c3_ACCProject = ACCProject_IN_ACC_OFF_MODE;
        ACCProject_Y.Acceleration_Mode_h = 0U;
      } else if (SetSwitch) {
        ACCProject_DW.is_c3_ACCProject = ACCProject_IN_ACC_ON_MODE;
        ACCProject_DW.is_ACC_ON_MODE = IN_LeadVehicle_Detected_Follow;
        ACCProject_Y.Acceleration_Mode_h = 2U;
      }
      break;
    }
  }

  /* End of Chart: '<S2>/ACC_Logic' */
}

/* Model initialize function */
void ACCProject_initialize(void)
{
  /* (no initialization code required) */
}

/* Model terminate function */
void ACCProject_terminate(void)
{
  /* (no terminate code required) */
}

/*
 * File trailer for generated code.
 *
 * [EOF]

Results :

After implementing the ACC model run the simulation . So the model is running successfully without any errors then the Adaptive Cruise Control works as per the requirement .

The model is running successfully without any error .

Conclusion :

Hence . The Adaptive Cruise Control feature is developed as per the Requirement Document using MATLAB Simulink

Your portfolio, next

Ship work like this
in your own course.

Talk to a career counsellor

Free 20-minute call. We'll map the right course to where you want to work.

By submitting you agree to our Terms and Privacy Policy.

Talk to a career counsellor

Free 20-minute call. We'll map the right course to where you want to work.

By submitting you agree to our Terms and Privacy Policy.