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