diff --git a/Oper.c b/Oper.c index dd67862..7644167 100644 --- a/Oper.c +++ b/Oper.c @@ -11,9 +11,7 @@ #define ENGINE_DIFF_SPEED (400U) // 2800 - 2400 // IDLE_SEQ_MOD -#define RPM_RAMP_START (1500U) #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 LED_OFF (0U) @@ -123,40 +121,18 @@ static void CProcessApuStateRetryCranking(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) { // ECU OPERATION 확인 즉시 발전 상태로 전환 (RPM Ramp는 CProcessApuStateGenerating에서 수행) GeneralOperValue.ulRampStartClock = 0UL; GeneralOperValue.uiApuState = (Uint16)IDX_APU_OPER_GENERATING; } -#endif } 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; + Uint16 uiRampRange; Uint16 uiRampRpm; CSetGcuCommand((Uint16)IDX_GCU_CMD_GENERATING); @@ -170,27 +146,29 @@ static void CProcessApuStateGenerating(void) { if (GeneralOperValue.ulRampStartClock == 0UL) { + Uint16 uiActual = CGetEngineActualRpm(); + GeneralOperValue.uiRampStartRpm = (uiActual < RPM_RAMP_END) ? uiActual : RPM_RAMP_END; GeneralOperValue.ulRampStartClock = CGetSoftClock(); - CSetEngineActualRpm(RPM_RAMP_START); + CSetEngineActualRpm(GeneralOperValue.uiRampStartRpm); } 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) { - 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); } else { - GeneralOperValue.uiRampComplete = 1U; - GeneralOperValue.uiDynamicRPM = CDynamicRpmControl(); + GeneralOperValue.uiRampComplete = 1U; + GeneralOperValue.uiDynamicRPM = CDynamicRpmControl(); CSetEngineActualRpm(GeneralOperValue.uiDynamicRPM); } } } -#endif } static void CProcessApuStateCooldown(void) @@ -384,9 +362,9 @@ static void CInitialStandby(void) 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 } @@ -409,9 +387,9 @@ static void CEmergencyStop(void) 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 } diff --git a/main.h b/main.h index 4e4edfd..dabc0f4 100644 --- a/main.h +++ b/main.h @@ -211,8 +211,9 @@ typedef struct ClassGeneralOperValue Uint16 uiRetryCrankingCount; Uint16 uiWriteEepromDataStart; Uint32 ulTotalOperationHour; - Uint32 ulRampStartClock; // IDLE_SEQ_MOD - Uint16 uiRampComplete; // IDLE_SEQ_MOD + Uint32 ulRampStartClock; + Uint16 uiRampComplete; + Uint16 uiRampStartRpm; struct { Uint16 PlayCmd;