/******************************************************************************
* ファイル名: 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;
}
コメント
コメントを投稿