Challenge

Project 2 Adaptive Cruise Control

As per requirement given we have design a simulink model

here 3 requirement mentioned

1.Requirement 1– Lead Vehicle:

2.Requirement 2 – Drive Vehicle:

3.Requirement 3 – Adaptive Cruise Control Algorithm:

requirement 1

here we get lead vehicle output by sum of result given by camera output+radarinput of lead vehicle

Requirement 2:

For DriveVehicle_Speed calculation we are adding CameraInput_DriveVehicle+RadarInput_DriveVehicle + Acceleration_Mode feedback from Cruise control algorithm.

The outputs from this subsystem as DriveVehicle_Speed and Lead_Vehicle_Detected by propagating RadarInput_DriveVehicle in to signal conversion block.

Requirement 3:

In this subsystem we are using a state flow logics to implement the requirements 3a,3b,3c,3c(i),3c(ii),3c(iii),3c(iv),3c(v),3c(vi).

The inputs for the state flow are,

  • CruiseSwitch.
  • SetSwitch.
  • Set_Gap.
  • Set_Speed.
  • Time_Gap.
  • LeadVehicle_Speed from Requirement 1 subsystem.
  • DriveVehicle_Speed from Requirement 2 subsystem.
  • LeadVehicle_Detected from Requirement 2 subsystem.

The output from this subsystem is,

  • Acceleration_Mode-Based on the LeadVehicle_Speed the Acceleration_Mode adjust its controlling accaleration given output to maintain constant speed

state flow logic

In this logic we had created three modes of operation as,

  1. ACC_OFF mode.
  2. ACC_STANDBY mode.
  3. ACC_ON mode.

In ACC_ON mode we have further 6 modes of operations as,

  • LeadVehicle_Detected_Follow (Default).
  • LeadVehicle_Not_Detected.
  • LeadVehicle_Detected_Resume.
  • LeadVehicle_Not_Detected_Resume.
  • LeadVehicle_Speed_lessthan_Set_Speed.
  • LeadVehicle_Speed_equal_Set_Speed.

All these modes of operations are modelled as per the given as mentioned in requirements section

SLDD file creation:

Results:

After compiling the model we are getting nil errors on model creation justifies our logic on modelling for requirements are correct.

Model advisor check:

Code generation:

*
* Code generated for Simulink model 'Cruise_control'.
*
* Model version : 1.19
* Simulink Coder version : 9.5 (R2021a) 14-Nov-2020
* C/C++ source code generated on : Fri Sep 2 17:07:00 2022
*
* Target selection: ert.tlc
* Embedded hardware selection: Intel->x86-64 (Windows64)
* Code generation objectives: Unspecified
* Validation result: Not run
*/
#include "Cruise_control.h"
#include "Cruise_control_private.h"
/* Named constants for Chart: '<S3>/Requirement 3a – ACC OFF MODE state logic' */
#define Cru_IN_LeadVehicle_Not_Detected ((uint8_T)3U)
#define Cruise_cont_IN_ACC_STANDBY_MODE ((uint8_T)3U)
#define Cruise_contr_IN_NO_ACTIVE_CHILD ((uint8_T)0U)
#define Cruise_control_IN_ACC_OFF_MODE ((uint8_T)1U)
#define Cruise_control_IN_ACC_ON_MODE ((uint8_T)2U)
#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)
/* Block states (default storage) */
DW_Cruise_control_T Cruise_control_DW;
/* Real-time model */
static RT_MODEL_Cruise_control_T Cruise_control_M_;
RT_MODEL_Cruise_control_T *const Cruise_control_M = &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 Cruise_control_step(void)
{
/* local block i/o variables */
real_T DriveVehicle_Speed;
uint8_T LeadVehicle_Speed;
uint8_T LeadVehicle_Detected;
int32_T tmp;
int32_T tmp_0;
uint8_T tmp_1;
uint8_T tmp_2;
/* Sum: '<S2>/Add' incorporates:
* Delay: '<Root>/Delay'
* Inport: '<Root>/CameraInput_DriveVehicle'
* Inport: '<Root>/RadarInput_DriveVehicle'
*/
DriveVehicle_Speed = (real_T)(CameraInput_DriveVehicle +
RadarInput_DriveVehicle) + Cruise_control_DW.Delay_DSTATE;
/* Sum: '<S1>/Add' incorporates:
* Inport: '<Root>/CameraInput_LeadVehicle '
* Inport: '<Root>/RadarInput_LeadVehicle'
*/
LeadVehicle_Speed = (uint8_T)((uint32_T)Camerainput_LeadVehicle +
Radarinput_Leadvehicle);
/* SignalConversion: '<S2>/Signal Conversion' incorporates:
* Inport: '<Root>/RadarInput_DriveVehicle'
*/
LeadVehicle_Detected = RadarInput_DriveVehicle;
/* Chart: '<S3>/Requirement 3a – ACC OFF MODE state logic' incorporates:
* Delay: '<Root>/Delay'
* Inport: '<Root>/CruiseSwitch'
* Inport: '<Root>/SetSwitch'
* Inport: '<Root>/Set_Gap'
* Inport: '<Root>/Set_Speed'
* Inport: '<Root>/Time_Gap'
*/
if (Cruise_control_DW.is_active_c3_Cruise_control == 0U) {
Cruise_control_DW.is_active_c3_Cruise_control = 1U;
Cruise_control_DW.is_c3_Cruise_control = Cruise_control_IN_ACC_OFF_MODE;
Cruise_control_DW.Delay_DSTATE = 0.0;
} else {
switch (Cruise_control_DW.is_c3_Cruise_control) {
case Cruise_control_IN_ACC_OFF_MODE:
Cruise_control_DW.Delay_DSTATE = 0.0;
if (CruiseSwitch) {
Cruise_control_DW.is_c3_Cruise_control = Cruise_cont_IN_ACC_STANDBY_MODE;
Cruise_control_DW.Delay_DSTATE = 1.0;
}
break;
case Cruise_control_IN_ACC_ON_MODE:
if (!CruiseSwitch) {
Cruise_control_DW.is_ACC_ON_MODE = Cruise_contr_IN_NO_ACTIVE_CHILD;
Cruise_control_DW.is_c3_Cruise_control = Cruise_control_IN_ACC_OFF_MODE;
Cruise_control_DW.Delay_DSTATE = 0.0;
} else if (SetSwitch) {
Cruise_control_DW.is_ACC_ON_MODE = Cruise_contr_IN_NO_ACTIVE_CHILD;
Cruise_control_DW.is_c3_Cruise_control = Cruise_cont_IN_ACC_STANDBY_MODE;
Cruise_control_DW.Delay_DSTATE = 1.0;
} else {
switch (Cruise_control_DW.is_ACC_ON_MODE) {
case IN_LeadVehicle_Detected_Follow:
Cruise_control_DW.Delay_DSTATE = 2.0;
if (((LeadVehicle_Detected == 1) && (LeadVehicle_Speed < Set_speed)) ||
(Time_Gap < Set_Gap)) {
Cruise_control_DW.is_ACC_ON_MODE = IN_LeadVehicle_Speed_lessthan_S;
Cruise_control_DW.Delay_DSTATE = 4.0;
} else if (LeadVehicle_Detected == 0) {
Cruise_control_DW.is_ACC_ON_MODE = Cru_IN_LeadVehicle_Not_Detected;
Cruise_control_DW.Delay_DSTATE = 1.0;
}
break;
case IN_LeadVehicle_Detected_Resume:
Cruise_control_DW.Delay_DSTATE = 3.0;
if ((DriveVehicle_Speed == Set_speed) && (LeadVehicle_Speed >=
Set_speed) && (Time_Gap >= Set_Gap)) {
Cruise_control_DW.is_ACC_ON_MODE = IN_LeadVehicle_Detected_Follow;
Cruise_control_DW.Delay_DSTATE = 2.0;
} else if (LeadVehicle_Detected == 0) {
Cruise_control_DW.is_ACC_ON_MODE = Cru_IN_LeadVehicle_Not_Detected;
Cruise_control_DW.Delay_DSTATE = 1.0;
} else if ((DriveVehicle_Speed < Set_speed) && (LeadVehicle_Speed >
DriveVehicle_Speed) && (Time_Gap >= Set_Gap)) {
Cruise_control_DW.is_ACC_ON_MODE = IN_LeadVehicle_Speed_equal_Set_;
Cruise_control_DW.Delay_DSTATE = 5.0;
} else if (LeadVehicle_Detected == 0) {
Cruise_control_DW.is_ACC_ON_MODE = IN_LeadVehicle_Not_Detected_Res;
Cruise_control_DW.Delay_DSTATE = 1.0;
}
break;
case Cru_IN_LeadVehicle_Not_Detected:
Cruise_control_DW.Delay_DSTATE = 1.0;
if ((DriveVehicle_Speed == Set_speed) && (LeadVehicle_Speed >=
Set_speed) && (Time_Gap >= Set_Gap)) {
Cruise_control_DW.is_ACC_ON_MODE = IN_LeadVehicle_Detected_Follow;
Cruise_control_DW.Delay_DSTATE = 2.0;
} else if (((LeadVehicle_Detected == 1) && (LeadVehicle_Speed <
Set_speed)) || (Time_Gap < Set_Gap)) {
Cruise_control_DW.is_ACC_ON_MODE = IN_LeadVehicle_Speed_lessthan_S;
Cruise_control_DW.Delay_DSTATE = 4.0;
}
break;
case IN_LeadVehicle_Not_Detected_Res:
Cruise_control_DW.Delay_DSTATE = 1.0;
break;
case IN_LeadVehicle_Speed_equal_Set_:
Cruise_control_DW.Delay_DSTATE = 5.0;
if ((LeadVehicle_Detected == 0) || (DriveVehicle_Speed <= Set_speed))
{
Cruise_control_DW.is_ACC_ON_MODE = IN_LeadVehicle_Not_Detected_Res;
Cruise_control_DW.Delay_DSTATE = 1.0;
} else if (((DriveVehicle_Speed < Set_speed) && (LeadVehicle_Speed >
DriveVehicle_Speed)) || (Time_Gap >= Set_Gap)) {
Cruise_control_DW.is_ACC_ON_MODE = IN_LeadVehicle_Detected_Resume;
Cruise_control_DW.Delay_DSTATE = 3.0;
} else if (((LeadVehicle_Speed < Set_speed) && (LeadVehicle_Speed <
DriveVehicle_Speed)) || ((int32_T)rt_roundd_snf(0.75 *
(real_T)Set_Gap) == Time_Gap)) {
Cruise_control_DW.is_ACC_ON_MODE = IN_LeadVehicle_Speed_lessthan_S;
Cruise_control_DW.Delay_DSTATE = 4.0;
}
break;
default:
/* case IN_LeadVehicle_Speed_lessthan_Set_Speed: */
Cruise_control_DW.Delay_DSTATE = 4.0;
if ((LeadVehicle_Detected == 0) && (DriveVehicle_Speed == Set_speed))
{
Cruise_control_DW.is_ACC_ON_MODE = Cru_IN_LeadVehicle_Not_Detected;
Cruise_control_DW.Delay_DSTATE = 1.0;
} 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 >= DriveVehicle_Speed) && (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))) {
Cruise_control_DW.is_ACC_ON_MODE = IN_LeadVehicle_Speed_equal_Set_;
Cruise_control_DW.Delay_DSTATE = 5.0;
}
}
break;
}
}
break;
default:
/* case IN_ACC_STANDBY_MODE: */
Cruise_control_DW.Delay_DSTATE = 1.0;
if (!CruiseSwitch) {
Cruise_control_DW.is_c3_Cruise_control = Cruise_control_IN_ACC_OFF_MODE;
Cruise_control_DW.Delay_DSTATE = 0.0;
} else if (!SetSwitch) {
Cruise_control_DW.is_c3_Cruise_control = Cruise_control_IN_ACC_ON_MODE;
Cruise_control_DW.is_ACC_ON_MODE = IN_LeadVehicle_Detected_Follow;
Cruise_control_DW.Delay_DSTATE = 2.0;
}
break;
}
}
/* End of Chart: '<S3>/Requirement 3a – ACC OFF MODE state logic' */
}
/* Model initialize function */
void Cruise_control_initialize(void)
{
/* (no initialization code required) */
}
/* Model terminate function */
void Cruise_control_terminate(void)
{
/* (no terminate code required) */
}
/*
* File trailer for generated code.
*
* [EOF]
*/
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.