Challenge

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:

  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

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]
 */

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.