diff --git a/firmware/CHANGELOG.md b/firmware/CHANGELOG.md index 3694809b15..c759e7021e 100644 --- a/firmware/CHANGELOG.md +++ b/firmware/CHANGELOG.md @@ -33,6 +33,7 @@ All notable user-facing or behavior-altering changes will be documented in this - Mitsubishi 3A92 VVT trigger - Toyota 4-1 VVT trigger - use extra RAM for lua if your microRusEFI unit has stm32f42x microcontroller + - VVT activation delay #3443 ## March 2022 Release - "Day 22" diff --git a/firmware/controllers/actuators/vvt.cpp b/firmware/controllers/actuators/vvt.cpp index fe603ce9ce..e824f26dbc 100644 --- a/firmware/controllers/actuators/vvt.cpp +++ b/firmware/controllers/actuators/vvt.cpp @@ -90,10 +90,11 @@ expected VvtController::getClosedLoop(angle_t target, angle_t observa void VvtController::setOutput(expected outputValue) { float rpm = Sensor::getOrZero(SensorType::Rpm); - // todo: make this configurable? - bool enabledAtCurrentRpm = rpm > engineConfiguration->cranking.rpm; + bool enabled = rpm > engineConfiguration->cranking.rpm /* todo: make this configurable? */ + && engine->rpmCalculator.getSecondsSinceEngineStart(getTimeNowNt()) > engineConfiguration->vvtActivationDelayMs / MS_PER_SECOND + ; - if (outputValue && enabledAtCurrentRpm) { + if (outputValue && enabled) { m_pwm.setSimplePwmDutyCycle(PERCENT_TO_DUTY(outputValue.Value)); } else { m_pwm.setSimplePwmDutyCycle(0); diff --git a/firmware/controllers/engine_cycle/rpm_calculator.cpp b/firmware/controllers/engine_cycle/rpm_calculator.cpp index 34ebee6d06..840ed27b9f 100644 --- a/firmware/controllers/engine_cycle/rpm_calculator.cpp +++ b/firmware/controllers/engine_cycle/rpm_calculator.cpp @@ -300,7 +300,7 @@ void rpmShaftPositionCallback(trigger_event_e ckpSignalType, } } -float RpmCalculator::getTimeSinceEngineStart(efitick_t nowNt) const { +float RpmCalculator::getSecondsSinceEngineStart(efitick_t nowNt) const { return engineStartTimer.getElapsedSeconds(nowNt); } diff --git a/firmware/controllers/engine_cycle/rpm_calculator.h b/firmware/controllers/engine_cycle/rpm_calculator.h index 5282f719d4..4b877f66f0 100644 --- a/firmware/controllers/engine_cycle/rpm_calculator.h +++ b/firmware/controllers/engine_cycle/rpm_calculator.h @@ -103,8 +103,8 @@ public: */ float getRpmAcceleration() const; - // Get elapsed time (seconds) since the engine transitioned to the running state. - float getTimeSinceEngineStart(efitick_t nowNt) const; + // Get elapsed time since the engine transitioned to the running state. + float getSecondsSinceEngineStart(efitick_t nowNt) const; /** * this is RPM on previous engine cycle. diff --git a/firmware/controllers/limp_manager.cpp b/firmware/controllers/limp_manager.cpp index 33f37aae9d..7230f908d3 100644 --- a/firmware/controllers/limp_manager.cpp +++ b/firmware/controllers/limp_manager.cpp @@ -40,7 +40,7 @@ void LimpManager::updateState(int rpm, efitick_t nowNt) { // Only check if the setting is enabled if (minOilPressure > 0) { // Has it been long enough we should have pressure? - bool isTimedOut = engine->rpmCalculator.getTimeSinceEngineStart(nowNt) > 5.0f; + bool isTimedOut = engine->rpmCalculator.getSecondsSinceEngineStart(nowNt) > 5.0f; // Only check before timed out if (!isTimedOut) { diff --git a/firmware/util/efitime.h b/firmware/util/efitime.h index 654769d79c..d450a653bb 100644 --- a/firmware/util/efitime.h +++ b/firmware/util/efitime.h @@ -12,6 +12,7 @@ #include "efifeatures.h" #include "rusefi_types.h" +#define MS_PER_SECOND 1000 #define US_PER_SECOND 1000000 #define US_PER_SECOND_F 1000000.0 #define US_PER_SECOND_LL 1000000LL