ECU加速制御AUTOSARソースコード

/******************************************************************************

 * ファイル名: Swc_AccelControl.c

 * 説明: ECU加速制御 AUTOSAR Software Component実装

 * AUTOSAR仕様準拠のアクセルペダル信号処理と加速制御

 ******************************************************************************/

#include "Rte_Swc_AccelControl.h"

#include "Std_Types.h"

/* 定数定義 */

#define ACCEL_PEDAL_MIN         0u      /* アクセルペダル最小値 (%) */

#define ACCEL_PEDAL_MAX         100u    /* アクセルペダル最大値 (%) */

#define THROTTLE_MIN            0u      /* スロットル開度最小値 (%) */

#define THROTTLE_MAX            100u    /* スロットル開度最大値 (%) */

#define VEHICLE_SPEED_MAX       180u    /* 最大車速 (km/h) */

#define ENGINE_RPM_MAX          7000u   /* 最大エンジン回転数 (rpm) */

#define ACCEL_RATE_LIMIT        50u     /* 加速度制限 (%/100ms) */

/* 加速制御モード */

typedef enum {

    ACCEL_MODE_NORMAL = 0,

    ACCEL_MODE_ECO,

    ACCEL_MODE_SPORT,

    ACCEL_MODE_MANUAL

} AccelModeType;

/* 内部状態管理構造体 */

typedef struct {

    uint8 previousThrottle;

    uint8 currentMode;

    boolean kickdownActive;

    uint16 rpmLimiterActive;

} AccelControlStateType;

/* グローバル変数 */

static AccelControlStateType AccelState = {

    .previousThrottle = 0u,

    .currentMode = ACCEL_MODE_NORMAL,

    .kickdownActive = FALSE,

    .rpmLimiterActive = 0u

};

/******************************************************************************

 * 関数名: Swc_AccelControl_Init

 * 説明: 加速制御コンポーネントの初期化

 ******************************************************************************/

FUNC(void, RTE_CODE) Swc_AccelControl_Init(void)

{

    AccelState.previousThrottle = 0u;

    AccelState.currentMode = ACCEL_MODE_NORMAL;

    AccelState.kickdownActive = FALSE;

    AccelState.rpmLimiterActive = 0u;

    

    /* RTE Write初期値設定 */

    (void)Rte_Write_PP_ThrottlePosition_ThrottlePos(0u);

    (void)Rte_Write_PP_AccelStatus_Mode(ACCEL_MODE_NORMAL);

}

/******************************************************************************

 * 関数名: CalculateThrottlePosition

 * 説明: アクセルペダル位置からスロットル開度を計算

 ******************************************************************************/

static uint8 CalculateThrottlePosition(

    uint8 pedalPos,

    AccelModeType mode,

    uint16 vehicleSpeed,

    uint16 engineRpm

)

{

    uint16 targetThrottle = 0u;

    uint8 finalThrottle = 0u;

    

    /* 入力値検証 */

    if (pedalPos > ACCEL_PEDAL_MAX) {

        pedalPos = ACCEL_PEDAL_MAX;

    }

    

    /* モード別スロットルマッピング */

    switch (mode) {

        case ACCEL_MODE_ECO:

            /* エコモード: 応答を緩やかに */

            targetThrottle = (uint16)((pedalPos * 80u) / 100u);

            break;

            

        case ACCEL_MODE_SPORT:

            /* スポーツモード: 応答を鋭く */

            targetThrottle = (uint16)pedalPos;

            if (pedalPos > 70u) {

                targetThrottle = (uint16)((pedalPos * 110u) / 100u);

            }

            break;

            

        case ACCEL_MODE_MANUAL:

            /* マニュアルモード: リニア特性 */

            targetThrottle = (uint16)pedalPos;

            break;

            

        case ACCEL_MODE_NORMAL:

        default:

            /* ノーマルモード: 標準特性 */

            targetThrottle = (uint16)((pedalPos * 90u) / 100u);

            break;

    }

    

    /* 車速制限チェック */

    if (vehicleSpeed >= VEHICLE_SPEED_MAX) {

        targetThrottle = (targetThrottle * 50u) / 100u;

    }

    

    /* エンジン回転数制限 */

    if (engineRpm >= ENGINE_RPM_MAX) {

        AccelState.rpmLimiterActive = 1u;

        targetThrottle = 0u;

    } else if (engineRpm >= (ENGINE_RPM_MAX - 500u)) {

        targetThrottle = (targetThrottle * 70u) / 100u;

    } else {

        AccelState.rpmLimiterActive = 0u;

    }

    

    /* スロットル上限チェック */

    if (targetThrottle > THROTTLE_MAX) {

        targetThrottle = THROTTLE_MAX;

    }

    

    finalThrottle = (uint8)targetThrottle;

    

    /* レート制限適用 */

    if (finalThrottle > AccelState.previousThrottle) {

        if ((finalThrottle - AccelState.previousThrottle) > ACCEL_RATE_LIMIT) {

            finalThrottle = AccelState.previousThrottle + ACCEL_RATE_LIMIT;

        }

    }

    

    return finalThrottle;

}

/******************************************************************************

 * 関数名: CheckKickdownCondition

 * 説明: キックダウン条件チェック

 ******************************************************************************/

static boolean CheckKickdownCondition(

    uint8 pedalPos,

    uint8 pedalRate,

    uint16 vehicleSpeed

)

{

    boolean kickdown = FALSE;

    

    /* キックダウン判定 */

    if ((pedalPos >= 90u) && (pedalRate > 30u) && (vehicleSpeed < 120u)) {

        kickdown = TRUE;

    }

    

    return kickdown;

}

/******************************************************************************

 * 関数名: Swc_AccelControl_MainFunction

 * 説明: 加速制御メイン周期実行関数 (10ms周期)

 ******************************************************************************/

FUNC(void, RTE_CODE) Swc_AccelControl_MainFunction(void)

{

    /* RTE入力の読み込み */

    uint8 pedalPosition = 0u;

    uint8 pedalRate = 0u;

    uint16 vehicleSpeed = 0u;

    uint16 engineRpm = 0u;

    uint8 driverMode = 0u;

    uint8 calculatedThrottle = 0u;

    

    /* センサー値取得 */

    (void)Rte_Read_RP_AccelPedal_Position(&pedalPosition);

    (void)Rte_Read_RP_AccelPedal_Rate(&pedalRate);

    (void)Rte_Read_RP_VehicleSpeed_Speed(&vehicleSpeed);

    (void)Rte_Read_RP_EngineStatus_Rpm(&engineRpm);

    (void)Rte_Read_RP_DriverInput_Mode(&driverMode);

    

    /* モード更新 */

    if (driverMode < 4u) {

        AccelState.currentMode = (AccelModeType)driverMode;

    }

    

    /* キックダウンチェック */

    AccelState.kickdownActive = CheckKickdownCondition(

        pedalPosition,

        pedalRate,

        vehicleSpeed

    );

    

    /* スロットル開度計算 */

    calculatedThrottle = CalculateThrottlePosition(

        pedalPosition,

        AccelState.currentMode,

        vehicleSpeed,

        engineRpm

    );

    

    /* キックダウン時の補正 */

    if (AccelState.kickdownActive == TRUE) {

        calculatedThrottle = THROTTLE_MAX;

    }

    

    /* 前回値更新 */

    AccelState.previousThrottle = calculatedThrottle;

    

    /* RTE出力書き込み */

    (void)Rte_Write_PP_ThrottlePosition_ThrottlePos(calculatedThrottle);

    (void)Rte_Write_PP_AccelStatus_Mode(AccelState.currentMode);

    (void)Rte_Write_PP_AccelStatus_KickdownActive(AccelState.kickdownActive);

    (void)Rte_Write_PP_AccelStatus_RpmLimiter(AccelState.rpmLimiterActive);

}

/******************************************************************************

 * 関数名: Swc_AccelControl_SetMode

 * 説明: 加速モード設定(RTE Server Operation)

 ******************************************************************************/

FUNC(Std_ReturnType, RTE_CODE) Swc_AccelControl_SetMode(uint8 mode)

{

    Std_ReturnType retVal = E_OK;

    

    if (mode < 4u) {

        AccelState.currentMode = (AccelModeType)mode;

    } else {

        retVal = E_NOT_OK;

    }

    

    return retVal;

}

/******************************************************************************

 * 関数名: Swc_AccelControl_GetStatus

 * 説明: 加速制御ステータス取得(RTE Server Operation)

 ******************************************************************************/

FUNC(Std_ReturnType, RTE_CODE) Swc_AccelControl_GetStatus(

    P2VAR(uint8, AUTOMATIC, RTE_APPL_DATA) mode,

    P2VAR(uint8, AUTOMATIC, RTE_APPL_DATA) throttle,

    P2VAR(boolean, AUTOMATIC, RTE_APPL_DATA) kickdown

)

{

    *mode = (uint8)AccelState.currentMode;

    *throttle = AccelState.previousThrottle;

    *kickdown = AccelState.kickdownActive;

    

    return E_OK;

}

コメント

このブログの人気の投稿

最高裁での上告理由書受理・却下の判断基準について

訴えの変更(追加的変更)申立

裁判官の忌避申立書の作成例