Engine idle, Generating 시퀀스 수정

This commit is contained in:
2026-04-15 09:40:00 +09:00
parent ac74d913e9
commit ecb0c5477d
2 changed files with 16 additions and 37 deletions

42
Oper.c
View File

@@ -11,9 +11,7 @@
#define ENGINE_DIFF_SPEED (400U) // 2800 - 2400 #define ENGINE_DIFF_SPEED (400U) // 2800 - 2400
// IDLE_SEQ_MOD // IDLE_SEQ_MOD
#define RPM_RAMP_START (1500U)
#define RPM_RAMP_END (2400U) #define RPM_RAMP_END (2400U)
#define RPM_RAMP_RANGE (RPM_RAMP_END - RPM_RAMP_START) // 900
#define TIME_RAMP_UP (TIME_1SEC * 3UL) // 3초 #define TIME_RAMP_UP (TIME_1SEC * 3UL) // 3초
#define LED_OFF (0U) #define LED_OFF (0U)
@@ -123,40 +121,18 @@ static void CProcessApuStateRetryCranking(void)
static void CProcessApuStateEngineIdle(void) static void CProcessApuStateEngineIdle(void)
{ {
#if 0 // '0' - 기존 코드, '1' - IDLE_SEQ_MOD
if (((Rx301.State >> 1U) & 0x07U) == (Uint16)IDX_ECU_STAT_OPERATION)
{
// 보조엔진제어기의 상태가 OPERATION이고 보조엔진의 속도가 2300 RPM 이상 5초 유지 시 발전상태로 전환
if (CGetEngineActualRpm() >= (ENGINE_OPERATION_SPEED - 100U)) // 2300 RPM
{
if (CSoftWaitCountProcedure(SOFTTIMER_WAIT_OPERATION, TIME_5SEC) == (Uint16)TIME_OVER)
{
GeneralOperValue.uiApuState = (Uint16)IDX_APU_OPER_GENERATING;
}
}
else
{
CSoftWaitCountClear(SOFTTIMER_WAIT_OPERATION);
}
}
#else
if (((Rx301.State >> 1U) & 0x07U) == (Uint16)IDX_ECU_STAT_OPERATION) if (((Rx301.State >> 1U) & 0x07U) == (Uint16)IDX_ECU_STAT_OPERATION)
{ {
// ECU OPERATION 확인 즉시 발전 상태로 전환 (RPM Ramp는 CProcessApuStateGenerating에서 수행) // ECU OPERATION 확인 즉시 발전 상태로 전환 (RPM Ramp는 CProcessApuStateGenerating에서 수행)
GeneralOperValue.ulRampStartClock = 0UL; GeneralOperValue.ulRampStartClock = 0UL;
GeneralOperValue.uiApuState = (Uint16)IDX_APU_OPER_GENERATING; GeneralOperValue.uiApuState = (Uint16)IDX_APU_OPER_GENERATING;
} }
#endif
} }
static void CProcessApuStateGenerating(void) static void CProcessApuStateGenerating(void)
{ {
#if 0 // '0' - 기존 코드, '1' - IDLE_SEQ_MOD
CSetGcuCommand((Uint16)IDX_GCU_CMD_GENERATING); // 발전 명령 송신
GeneralOperValue.uiDynamicRPM = CDynamicRpmControl();
CSetEngineActualRpm(GeneralOperValue.uiDynamicRPM); // RPM 가변 제어 시작
#else
Uint32 ulElapsed; Uint32 ulElapsed;
Uint16 uiRampRange;
Uint16 uiRampRpm; Uint16 uiRampRpm;
CSetGcuCommand((Uint16)IDX_GCU_CMD_GENERATING); CSetGcuCommand((Uint16)IDX_GCU_CMD_GENERATING);
@@ -170,16 +146,19 @@ static void CProcessApuStateGenerating(void)
{ {
if (GeneralOperValue.ulRampStartClock == 0UL) if (GeneralOperValue.ulRampStartClock == 0UL)
{ {
Uint16 uiActual = CGetEngineActualRpm();
GeneralOperValue.uiRampStartRpm = (uiActual < RPM_RAMP_END) ? uiActual : RPM_RAMP_END;
GeneralOperValue.ulRampStartClock = CGetSoftClock(); GeneralOperValue.ulRampStartClock = CGetSoftClock();
CSetEngineActualRpm(RPM_RAMP_START); CSetEngineActualRpm(GeneralOperValue.uiRampStartRpm);
} }
else else
{ {
ulElapsed = (CGetSoftClock() + SYSTEM_10MIN_TIME - GeneralOperValue.ulRampStartClock) % SYSTEM_10MIN_TIME; ulElapsed = (CGetSoftClock() + SYSTEM_10MIN_TIME - GeneralOperValue.ulRampStartClock) % SYSTEM_10MIN_TIME;
uiRampRange = RPM_RAMP_END - GeneralOperValue.uiRampStartRpm; // 동적 범위
if (ulElapsed < TIME_RAMP_UP) if (ulElapsed < TIME_RAMP_UP)
{ {
uiRampRpm = (Uint16)(RPM_RAMP_START + (Uint16)(((Uint32)RPM_RAMP_RANGE * ulElapsed) / TIME_RAMP_UP)); uiRampRpm = (Uint16)(GeneralOperValue.uiRampStartRpm + (Uint16)(((Uint32)uiRampRange * ulElapsed) / TIME_RAMP_UP));
CSetEngineActualRpm(uiRampRpm); CSetEngineActualRpm(uiRampRpm);
} }
else else
@@ -190,7 +169,6 @@ static void CProcessApuStateGenerating(void)
} }
} }
} }
#endif
} }
static void CProcessApuStateCooldown(void) static void CProcessApuStateCooldown(void)
@@ -384,9 +362,9 @@ static void CInitialStandby(void)
GeneralOperValue.uiEmergency = 0U; GeneralOperValue.uiEmergency = 0U;
GeneralOperValue.ulRampStartClock = 0UL; // IDLE_SEQ_MOD GeneralOperValue.ulRampStartClock = 0UL;
GeneralOperValue.uiRampComplete = 0U; // IDLE_SEQ_MOD GeneralOperValue.uiRampComplete = 0U;
GpioDataRegs.GPBCLEAR.bit.GPIO55 = 1U; // GPIO_FAULT_CMD GpioDataRegs.GPBCLEAR.bit.GPIO55 = 1U; // GPIO_FAULT_CMD
} }
@@ -409,9 +387,9 @@ static void CEmergencyStop(void)
GeneralOperValue.uiEmergency = 1U; GeneralOperValue.uiEmergency = 1U;
GeneralOperValue.ulRampStartClock = 0UL; // IDLE_SEQ_MOD GeneralOperValue.ulRampStartClock = 0UL;
GeneralOperValue.uiRampComplete = 0U; // IDLE_SEQ_MOD GeneralOperValue.uiRampComplete = 0U;
GpioDataRegs.GPBSET.bit.GPIO55 = 1U; //GPIO_FAULT_CMD GpioDataRegs.GPBSET.bit.GPIO55 = 1U; //GPIO_FAULT_CMD
} }

5
main.h
View File

@@ -211,8 +211,9 @@ typedef struct ClassGeneralOperValue
Uint16 uiRetryCrankingCount; Uint16 uiRetryCrankingCount;
Uint16 uiWriteEepromDataStart; Uint16 uiWriteEepromDataStart;
Uint32 ulTotalOperationHour; Uint32 ulTotalOperationHour;
Uint32 ulRampStartClock; // IDLE_SEQ_MOD Uint32 ulRampStartClock;
Uint16 uiRampComplete; // IDLE_SEQ_MOD Uint16 uiRampComplete;
Uint16 uiRampStartRpm;
struct struct
{ {
Uint16 PlayCmd; Uint16 PlayCmd;