Project 2 Adaptive Cruise Control
Hi,
I have attached the answers.
Input and output Signal:
All input signal has created as Imported Extern with uint8 datatype except cruise switch and set switch. They are as
Imported Extern with Boolean data type.
All output signals have created as Export To File with uint8 datatype.
Aim:
1. Developing Adaptive Cruise Control feature as per the Requirement Document using MATLAB Simulink.
2. 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.
Description:
Step :1
Design/ Create the model as per the requirements given in the question.
The top layer of the model is given below.

Inner layer:

State chart:

State flow chart:

Step 2:
Create the data dictionary of the model(.sldd).

Step 3:
After Model developing, go to the Modelling which is presents on the top screen. Go to model settings -->Solver
--> In solver selection, please select the type is to Fixed- Step and the Solver is to discrete(no-continuous states).

Step 4:
Then go to Code Generation --> In system target file, select Embedded Coder(ert.tlc). Choose the language as C.

Step 5:
Then Go to Modelling and go to the Model advisor.


Then run the model adivsor. After successfully running, it will show the report about the model. do resolve the error and warning.
Step 6:
Code Generation part. Go to the APPS --> Embedded Coder --> Build --> Code will be generated likes given below.
/*
* File: Adaptive_Cruise_Control.c
*
* Code generated for Simulink model 'Adaptive_Cruise_Control'.
*
* Model version : 1.67
* Simulink Coder version : 9.9 (R2023a) 19-Nov-2022
* C/C++ source code generated on : Wed Dec 6 19:27:19 2023
*
* Target selection: ert.tlc
* Embedded hardware selection: Intel->x86-64 (Windows64)
* Code generation objectives: Unspecified
* Validation result: Not run
*/
#include "Adaptive_Cruise_Control.h"
#include "rtwtypes.h"
#include "Adaptive_Cruise_Control_private.h"
#include
/* Named constants for Chart: '/Chart' */
#define Ada_IN_LeadVehicle_Not_Detected ((uint8_T)3U)
#define Adaptive_Cru_IN_NO_ACTIVE_CHILD ((uint8_T)0U)
#define Adaptive_Crui_IN_NO_ACTIVE_LEAF ((uint8_T)0U)
#define Adaptive_Cruise_Cont_CALL_EVENT (-1)
#define Adaptive_Cruise_Cont_IN_ACC_OFF ((uint8_T)1U)
#define Adaptive_Cruise_Contr_IN_ACC_ON ((uint8_T)2U)
#define Adaptive_Cruise__IN_ACC_STANDBY ((uint8_T)3U)
#define IN_LeadVechile_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_aLeadVehicle_Speed_equal_Set ((uint8_T)6U)
/* Block signals (default storage) */
B_Adaptive_Cruise_Control_T Adaptive_Cruise_Control_B;
/* Block states (default storage) */
DW_Adaptive_Cruise_Control_T Adaptive_Cruise_Control_DW;
/* External outputs (root outports fed by signals with default storage) */
ExtY_Adaptive_Cruise_Control_T Adaptive_Cruise_Control_Y;
/* Model step function */
void Adaptive_Cruise_Control_step(void)
{
real_T rtb_DriveVehicle_Speed;
uint32_T tmp;
/* Sum: '/Add' incorporates:
* Inport: '/CameraInput_LeadVehicle'
* Inport: '/RadarInput_LeadVehicle'
*
* Block requirements for '/Add':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:1
*/
tmp = (uint32_T)CameraInput_LeadVehicle + (uint32_T)RadarInput_LeadVehicle;
if (tmp > 255U) {
tmp = 255U;
}
/* Sum: '/Add1' incorporates:
* Inport: '/CameraInput_DriveVehicle'
* Inport: '/RadarInput_DriveVehicle'
* UnitDelay: '/Unit Delay'
*
* Block requirements for '/Add1':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:2
*/
rtb_DriveVehicle_Speed = (real_T)CameraInput_DriveVehicle +
Adaptive_Cruise_Control_DW.UnitDelay_DSTATE + (real_T)
RadarInput_DriveVehicle;
/* Chart: '/Chart' incorporates:
* Inport: '/Cruise_Switch'
* Inport: '/RadarInput_DriveVehicle'
* Inport: '/Set_Gap'
* Inport: '/Set_Speed'
* Inport: '/Set_Switch'
* Inport: '/Time_Gap'
* Sum: '/Add'
*
* Block requirements for '/Chart':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:3
*
* Block requirements for '/Add':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:1
*/
/* Gateway: Adaptive_Cruise_Control/Chart
* Requirements for Gateway: Adaptive_Cruise_Control/Chart:
* 1. Adaptive_Cruise_Control_Requirement.slreqx:3
*/
/* During: Adaptive_Cruise_Control/Chart
* Requirements for During: Adaptive_Cruise_Control/Chart:
* 1. Adaptive_Cruise_Control_Requirement.slreqx:3
*/
if ((uint32_T)Adaptive_Cruise_Control_DW.is_active_c3_Adaptive_Cruise_Co == 0U)
{
/* Entry: Adaptive_Cruise_Control/Chart
* Requirements for Entry: Adaptive_Cruise_Control/Chart:
* 1. Adaptive_Cruise_Control_Requirement.slreqx:3
*/
Adaptive_Cruise_Control_DW.is_active_c3_Adaptive_Cruise_Co = 1;
/* Entry Internal: Adaptive_Cruise_Control/Chart
* Requirements for Entry Internal: Adaptive_Cruise_Control/Chart:
* 1. Adaptive_Cruise_Control_Requirement.slreqx:3
*/
/* Transition: ':7' */
Adaptive_Cruise_Control_DW.is_c3_Adaptive_Cruise_Control =
Adaptive_Cruise_Cont_IN_ACC_OFF;
/* Entry 'ACC_OFF': ':6':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:4
*/
Adaptive_Cruise_Control_B.Acceleration_Mode = 0.0;
} else {
switch (Adaptive_Cruise_Control_DW.is_c3_Adaptive_Cruise_Control) {
case Adaptive_Cruise_Cont_IN_ACC_OFF:
/* During 'ACC_OFF': ':6':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:4
*/
if (Cruise_Switch) {
/* Transition: ':10' */
Adaptive_Cruise_Control_DW.is_c3_Adaptive_Cruise_Control =
Adaptive_Cruise__IN_ACC_STANDBY;
/* Entry 'ACC_STANDBY': ':9':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:5
*/
Adaptive_Cruise_Control_B.Acceleration_Mode = 1.0;
}
break;
case Adaptive_Cruise_Contr_IN_ACC_ON:
/* During 'ACC_ON': ':12':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:6
*/
if (!Cruise_Switch) {
/* Transition: ':38' */
/* Exit Internal 'ACC_ON': ':12':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:6
*/
Adaptive_Cruise_Control_DW.is_ACC_ON = Adaptive_Cru_IN_NO_ACTIVE_CHILD;
Adaptive_Cruise_Control_DW.is_c3_Adaptive_Cruise_Control =
Adaptive_Cruise_Cont_IN_ACC_OFF;
/* Entry 'ACC_OFF': ':6':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:4
*/
Adaptive_Cruise_Control_B.Acceleration_Mode = 0.0;
} else if (!Set_Switch) {
/* Transition: ':42' */
/* Exit Internal 'ACC_ON': ':12':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:6
*/
Adaptive_Cruise_Control_DW.is_ACC_ON = Adaptive_Cru_IN_NO_ACTIVE_CHILD;
Adaptive_Cruise_Control_DW.is_c3_Adaptive_Cruise_Control =
Adaptive_Cruise__IN_ACC_STANDBY;
/* Entry 'ACC_STANDBY': ':9':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:5
*/
Adaptive_Cruise_Control_B.Acceleration_Mode = 1.0;
} else {
switch (Adaptive_Cruise_Control_DW.is_ACC_ON) {
case IN_LeadVechile_Detected_Follow:
/* During 'LeadVechile_Detected_Follow': ':13':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:7
*/
/* */
if ((((int16_T)RadarInput_DriveVehicle == 1) && ((uint8_T)tmp <
Set_Speed)) || (Time_Gap < Set_Gap)) {
/* Transition: ':25' */
Adaptive_Cruise_Control_DW.is_ACC_ON =
IN_LeadVehicle_Speed_lessthan_S;
/* Entry 'LeadVehicle_Speed_lessthan_Set_Speed': ':18':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:11
*/
Adaptive_Cruise_Control_B.Acceleration_Mode = 4.0;
} else if ((int16_T)RadarInput_DriveVehicle == 0) {
/* Transition: ':24' */
Adaptive_Cruise_Control_DW.is_ACC_ON =
Ada_IN_LeadVehicle_Not_Detected;
/* Entry 'LeadVehicle_Not_Detected': ':15':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:8
*/
Adaptive_Cruise_Control_B.Acceleration_Mode = 1.0;
} else {
/* no actions */
}
break;
case IN_LeadVehicle_Detected_Resume:
/* During 'LeadVehicle_Detected_Resume': ':16':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:9
*/
if ((rtb_DriveVehicle_Speed == (real_T)Set_Speed) && ((uint8_T)tmp >=
Set_Speed) && (Time_Gap >= Set_Gap)) {
/* Transition: ':30' */
Adaptive_Cruise_Control_DW.is_ACC_ON =
IN_LeadVechile_Detected_Follow;
/* Entry 'LeadVechile_Detected_Follow': ':13':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:7
*/
Adaptive_Cruise_Control_B.Acceleration_Mode = 2.0;
} else if ((int16_T)RadarInput_DriveVehicle == 0) {
/* Transition: ':31' */
Adaptive_Cruise_Control_DW.is_ACC_ON =
IN_LeadVehicle_Not_Detected_Res;
/* Entry 'LeadVehicle_Not_Detected_Resume': ':17':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:10
*/
Adaptive_Cruise_Control_B.Acceleration_Mode = 1.0;
} else if ((rtb_DriveVehicle_Speed < (real_T)Set_Speed) && ((real_T)
((uint8_T)tmp) > rtb_DriveVehicle_Speed) && (Time_Gap >=
Set_Gap)) {
/* Transition: ':32' */
Adaptive_Cruise_Control_DW.is_ACC_ON =
IN_aLeadVehicle_Speed_equal_Set;
/* Entry 'aLeadVehicle_Speed_equal_Set_Speed': ':19':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:12
*/
Adaptive_Cruise_Control_B.Acceleration_Mode = 5.0;
} else {
/* no actions */
}
break;
case Ada_IN_LeadVehicle_Not_Detected:
/* During 'LeadVehicle_Not_Detected': ':15':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:8
*/
if (((int16_T)RadarInput_DriveVehicle == 1) && (rtb_DriveVehicle_Speed
== (real_T)Set_Speed) && ((uint8_T)tmp >= Set_Speed) && (Time_Gap
>= Set_Gap)) {
/* Transition: ':26' */
Adaptive_Cruise_Control_DW.is_ACC_ON =
IN_LeadVechile_Detected_Follow;
/* Entry 'LeadVechile_Detected_Follow': ':13':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:7
*/
Adaptive_Cruise_Control_B.Acceleration_Mode = 2.0;
} else if ((((int16_T)RadarInput_DriveVehicle == 1) && ((uint8_T)tmp <
Set_Speed)) || (Time_Gap < Set_Gap)) {
/* Transition: ':27' */
Adaptive_Cruise_Control_DW.is_ACC_ON =
IN_LeadVehicle_Speed_lessthan_S;
/* Entry 'LeadVehicle_Speed_lessthan_Set_Speed': ':18':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:11
*/
Adaptive_Cruise_Control_B.Acceleration_Mode = 4.0;
} else {
/* no actions */
}
break;
case IN_LeadVehicle_Not_Detected_Res:
/* During 'LeadVehicle_Not_Detected_Resume': ':17':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:10
*/
break;
case IN_LeadVehicle_Speed_lessthan_S:
/* During 'LeadVehicle_Speed_lessthan_Set_Speed': ':18':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:11
*/
if (((int16_T)RadarInput_DriveVehicle == 0) && (rtb_DriveVehicle_Speed
== (real_T)Set_Speed)) {
/* Transition: ':34' */
Adaptive_Cruise_Control_DW.is_ACC_ON =
Ada_IN_LeadVehicle_Not_Detected;
/* Entry 'LeadVehicle_Not_Detected': ':15':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:8
*/
Adaptive_Cruise_Control_B.Acceleration_Mode = 1.0;
} else if ((((real_T)((uint8_T)tmp) * 1.25) >= rtb_DriveVehicle_Speed)
&& (((real_T)((uint8_T)tmp) * 0.75) <=
rtb_DriveVehicle_Speed) && (rtb_DriveVehicle_Speed <
(real_T)Set_Speed) && ((((real_T)Set_Gap * 1.25) >=
(real_T)Time_Gap) && (((real_T)Set_Gap * 0.75) <= (real_T)
Time_Gap))) {
/* Transition: ':37' */
Adaptive_Cruise_Control_DW.is_ACC_ON =
IN_aLeadVehicle_Speed_equal_Set;
/* Entry 'aLeadVehicle_Speed_equal_Set_Speed': ':19':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:12
*/
Adaptive_Cruise_Control_B.Acceleration_Mode = 5.0;
} else {
/* no actions */
}
break;
default:
/* During 'aLeadVehicle_Speed_equal_Set_Speed': ':19':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:12
*/
if (((int16_T)RadarInput_DriveVehicle == 0) || (rtb_DriveVehicle_Speed
<= (real_T)Set_Speed)) {
/* Transition: ':43' */
Adaptive_Cruise_Control_DW.is_ACC_ON =
IN_LeadVehicle_Not_Detected_Res;
/* Entry 'LeadVehicle_Not_Detected_Resume': ':17':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:10
*/
Adaptive_Cruise_Control_B.Acceleration_Mode = 1.0;
} else if (((rtb_DriveVehicle_Speed < (real_T)Set_Speed) && ((real_T)
((uint8_T)tmp) > rtb_DriveVehicle_Speed)) || (Time_Gap >=
Set_Gap)) {
/* Transition: ':44' */
Adaptive_Cruise_Control_DW.is_ACC_ON =
IN_LeadVehicle_Detected_Resume;
/* Entry 'LeadVehicle_Detected_Resume': ':16':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:9
*/
Adaptive_Cruise_Control_B.Acceleration_Mode = 3.0;
} else {
/* no actions */
}
break;
}
}
break;
default:
/* During 'ACC_STANDBY': ':9':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:5
*/
if (!Cruise_Switch) {
/* Transition: ':11' */
Adaptive_Cruise_Control_DW.is_c3_Adaptive_Cruise_Control =
Adaptive_Cruise_Cont_IN_ACC_OFF;
/* Entry 'ACC_OFF': ':6':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:4
*/
Adaptive_Cruise_Control_B.Acceleration_Mode = 0.0;
} else if (Set_Switch) {
/* Transition: ':39' */
Adaptive_Cruise_Control_DW.is_c3_Adaptive_Cruise_Control =
Adaptive_Cruise_Contr_IN_ACC_ON;
/* Entry Internal 'ACC_ON': ':12':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:6
*/
/* Transition: ':14' */
Adaptive_Cruise_Control_DW.is_ACC_ON = IN_LeadVechile_Detected_Follow;
/* Entry 'LeadVechile_Detected_Follow': ':13':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:7
*/
Adaptive_Cruise_Control_B.Acceleration_Mode = 2.0;
} else {
/* no actions */
}
break;
}
}
/* End of Chart: '/Chart' */
/* Outport: '/Acceleration_Mode' */
Adaptive_Cruise_Control_Y.Acceleration_Mode =
Adaptive_Cruise_Control_B.Acceleration_Mode;
/* Update for UnitDelay: '/Unit Delay' */
Adaptive_Cruise_Control_DW.UnitDelay_DSTATE =
Adaptive_Cruise_Control_B.Acceleration_Mode;
}
/* Model initialize function */
void Adaptive_Cruise_Control_initialize(void)
{
/* Registration code */
/* block I/O */
(void) memset(((void *) &Adaptive_Cruise_Control_B), 0,
sizeof(B_Adaptive_Cruise_Control_T));
/* states (dwork) */
(void) memset((void *)&Adaptive_Cruise_Control_DW, 0,
sizeof(DW_Adaptive_Cruise_Control_T));
/* external outputs */
Adaptive_Cruise_Control_Y.Acceleration_Mode = 0.0;
/* SystemInitialize for Chart: '/Chart'
*
Block requirements for '/Chart':
* 1. Adaptive_Cruise_Control_Requirement.slreqx:3
*/
Adaptive_Cruise_Control_DW.is_ACC_ON = Adaptive_Cru_IN_NO_ACTIVE_CHILD;
Adaptive_Cruise_Control_DW.is_active_c3_Adaptive_Cruise_Co = 0;
Adaptive_Cruise_Control_DW.is_c3_Adaptive_Cruise_Control =
Adaptive_Cru_IN_NO_ACTIVE_CHILD;
Adaptive_Cruise_Control_B.Acceleration_Mode = 0.0;
}
/*
* File trailer for generated code.
*
* [EOF]
*/