Enable idle timing/ve tables based on idle phase logic (#2213)

* add helper

* advance

* ve

Co-authored-by: Matthew Kennedy <makenne@microsoft.com>
This commit is contained in:
Matthew Kennedy 2021-01-10 21:54:37 -08:00 committed by GitHub
parent 3d913634a8
commit 868f0d47ac
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 15 additions and 4 deletions

View File

@ -565,6 +565,10 @@ float getIdleTimingAdjustment(int rpm) {
return idleControllerInstance.getIdleTimingAdjustment(rpm);
}
bool isIdling() {
return idleControllerInstance.isIdling();
}
static void applyPidSettings(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
getIdlePid(PASS_ENGINE_PARAMETER_SIGNATURE)->updateFactors(engineConfiguration->idleRpmPid.pFactor, engineConfiguration->idleRpmPid.iFactor, engineConfiguration->idleRpmPid.dFactor);
iacPidMultMap.init(CONFIG(iacPidMultTable), CONFIG(iacPidMultLoadBins), CONFIG(iacPidMultRpmBins));

View File

@ -53,6 +53,11 @@ public:
float getIdleTimingAdjustment(int rpm);
float getIdleTimingAdjustment(int rpm, int targetRpm, Phase phase);
// Allow querying state from outside
bool isIdling() {
return m_lastPhase == Phase::Idling;
}
private:
// These are stored by getIdlePosition() and used by getIdleTimingAdjustment()
Phase m_lastPhase = Phase::Cranking;
@ -66,6 +71,8 @@ percent_t getIdlePosition();
float getIdleTimingAdjustment(int rpm);
bool isIdling();
void applyIACposition(percent_t position DECLARE_ENGINE_PARAMETER_SUFFIX);
void setManualIdleValvePosition(int positionPercent);

View File

@ -82,7 +82,7 @@ static angle_t getRunningAdvance(int rpm, float engineLoad DECLARE_ENGINE_PARAME
float advanceAngle = advanceMap.getValue((float) rpm, engineLoad);
// get advance from the separate table for Idle
if (CONFIG(useSeparateAdvanceForIdle)) {
if (CONFIG(useSeparateAdvanceForIdle) && isIdling()) {
float idleAdvance = interpolate2d("idleAdvance", rpm, config->idleAdvanceBins, config->idleAdvance);
auto [valid, tps] = Sensor::get(SensorType::DriverThrottleIntent);
@ -92,7 +92,6 @@ static angle_t getRunningAdvance(int rpm, float engineLoad DECLARE_ENGINE_PARAME
}
}
#if EFI_LAUNCH_CONTROL
if (engine->isLaunchCondition && CONFIG(enableLaunchRetard)) {
if (CONFIG(launchSmoothRetard)) {

View File

@ -1,5 +1,6 @@
#include "airmass.h"
#include "sensor.h"
#include "idle_thread.h"
EXTERN_ENGINE;
@ -23,8 +24,8 @@ float AirmassModelBase::getVe(int rpm, float load) const {
float ve = m_veTable->getValue(rpm, load);
auto tps = Sensor::get(SensorType::Tps1);
// get VE from the separate table for Idle
if (tps.Valid && CONFIG(useSeparateVeForIdle)) {
// get VE from the separate table for Idle if idling
if (isIdling() && tps && CONFIG(useSeparateVeForIdle)) {
float idleVe = interpolate2d("idleVe", rpm, config->idleVeBins, config->idleVe);
// interpolate between idle table and normal (running) table using TPS threshold
ve = interpolateClamped(0.0f, idleVe, CONFIG(idlePidDeactivationTpsThreshold), ve, tps.Value);