39 float entryRpm = target + rpmUpperLimit;
42 float exitRpm = target + 1.5 * rpmUpperLimit;
58 return { target, entryRpm, exitRpm };
62#if EFI_SHAFT_POSITION_INPUT
140#if EFI_ANTILAG_SYSTEM
147 float tpsForTaper = tps.value_or(0);
153 if (tpsForTaper <= engineConfiguration->idlePidDeactivationTpsThreshold) {
155 float timeSinceRunningPhaseSecs = (nowUs -
lastTimeRunningUs + 1) / US_PER_SECOND_F;
180 return clampPercentValue(
running);
191 return crankingValvePosition;
291 if (rpm < targetRpm) {
304 errorAmpCoef =
interpolateClamped(0, 0, MS2US(1000), errorAmpCoef, timeSincePidResetUs);
306 idlePid->setErrorAmplification(errorAmpCoef);
308 percent_t newValue = idlePid->getOutput(targetRpm, rpm, FAST_CALLBACK_PERIOD_MS / 1000.0f);
317 float multCoef = interpolate3d(
337#if EFI_SHAFT_POSITION_INPUT
367 auto phase =
determinePhase(rpm, targetRpm, tps, vehicleSpeed, crankingTaper);
388 if (tps.Valid && idleMode ==
IM_AUTO) {
393 auto closedLoop =
getClosedLoop(phase, tps.Value, rpm, targetRpm.ClosedLoopTarget);
395 iacPosition += closedLoop;
400 iacPosition = clampPercentValue(iacPosition);
403#if EFI_TUNER_STUDIO && (EFI_PROD_CODE || EFI_SIMULATOR)
425 float idleAirmass = totalAirmass - timingAirmass;
454#if EFI_SHAFT_POSITION_INPUT
Timer timeSinceStateChange
float filter(float input)
void configureHighpass(float samplingFrequency, float cutoffFrequency, float Q=0.54f)
FuelComputer fuelComputer
TriggerCentral triggerCentral
RpmCalculator rpmCalculator
AntilagSystemBase antilagController
efitimeus_t timeToStopIdleTest
TunerStudioOutputChannels outputChannels
constexpr auto & module()
RegisteredOutputPin fanRelay
RegisteredOutputPin fanRelay2
float m_modeledFlowIdleTiming
PidIndustrial industrialWithOverrideIdlePid
void onFastCallback() override final
float getCrankingTaperFraction(float clt) const override
float getClosedLoop(IIdleController::Phase phase, float tpsPos, float rpm, float targetRpm) override
void onConfigurationChange(engine_configuration_s const *previousConfig) override final
Phase determinePhase(float rpm, TargetInfo targetRpm, SensorResult tps, float vss, float crankingTaperFraction) override
float m_idleTimingSoftEntryEndTime
float m_lastAutomaticPosition
float getIdlePosition(float rpm)
void onEngineStop() override final
float getIdleTimingAdjustment(float rpm) override
efitimeus_t restoreAfterPidResetTimeUs
percent_t getOpenLoop(Phase phase, float rpm, float clt, SensorResult tps, float crankingTaperFraction) override
TargetInfo getTargetRpm(float clt) override
void onIgnitionStateChanged(bool ignitionOn) override
efitimeus_t lastTimeRunningUs
percent_t getCrankingOpenLoop(float clt) const override
float m_crankTaperEndTime
void updateLtit(float rpm, float clt, bool acActive, bool fan1Active, bool fan2Active, float idleIntegral)
percent_t getRunningOpenLoop(IIdleController::Phase phase, float rpm, float clt, SensorResult tps) override
float getInstantRpm() const
virtual void loadLtitFromConfig()
void onIgnitionStateChanged(bool ignitionOn)
void update(float rpm, float clt, bool acActive, bool fan1Active, bool fan2Active, float idleIntegral)
bool getLogicValue() const
bool isSame(const pid_s *parameters) const
void setErrorAmplification(float coef)
void postState(pid_status_s &pidStatus) const
void initPidClass(pid_s *parameters)
float getOutput(float target, float input)
float derivativeFilterLoss
uint32_t getRevolutionCounterSinceStart(void) const
virtual SensorResult get() const =0
static float getOrZero(SensorType type)
float getTargetPosition() const
InstantRpmCalculator instantRpm
float interpolateClamped(float x1, float y1, float x2, float y2, float x)
efitimeus_t getTimeNowUs()
static EngineAccessor engine
static constexpr persistent_config_s * config
static constexpr engine_configuration_s * engineConfiguration
Idle Air Control valve hardware.
static void finishIdleTestIfNeeded()
Idle Valve Control thread.
void applyIACposition(percent_t position)
percent_t getIdlePosition()
static CCM_OPTIONAL FunctionalSensor clt(SensorType::Clt, MS2NT(10))
static FuncSensPair idlePos(PACK_MULT_VOLTAGE, SensorType::IdlePosition)
expected< float > SensorResult
running("running", SensorCategory.SENSOR_INPUTS, FieldType.INT, 892, 1.0, -1.0, -1.0, "")
float idle_derivativeFilterLoss
int8_t airmassToTimingValues[8]
int16_t idlePidRpmUpperLimit
int16_t idlePidRpmDeadZone
float idleTimingSoftEntryTime
bool idleReturnTargetRamp
scaled_channel< uint16_t, 100, 1 > idleFlowEstimateFlow[8]
bool useIdleTimingPidControl
int16_t idlerpmpid_iTermMax
scaled_channel< uint8_t, 1, 2 > idleMaximumAirmass
scaled_channel< uint8_t, 2, 1 > idleFlowEstimatePosition[8]
scaled_channel< uint8_t, 10, 1 > iacByTpsHoldTime
int16_t idlerpmpid_iTermMin
uint8_t acIdleExtraOffset
float idle_antiwindupFreq
scaled_channel< uint8_t, 10, 1 > idleReturnTargetRampDuration
bool useIacTableForCoasting
scaled_channel< uint8_t, 10, 1 > iacByTpsDecayTime
int8_t airmassToTimingBins[8]
int16_t idlePidDeactivationTpsThreshold
int16_t pidExtraForLowRpm
percent_t currentIdlePosition
bool looksLikeCrankToIdle
bool isIacTableForCoasting
percent_t baseIdlePosition
scaled_channel< uint16_t, 100, 1 > idleTargetFlow
uint16_t idleTargetAirmass
uint8_t idleStepperTargetPosition
float cltIdleCorrTable[CLT_IDLE_TABLE_RPM_SIZE][CLT_IDLE_TABLE_CLT_SIZE]
scaled_channel< int16_t, 1, 1 > cltIdleRpmBins[CLT_CURVE_SIZE]
uint8_t iacPidMultLoadBins[IAC_PID_MULT_SIZE]
scaled_channel< uint8_t, 1, 10 > iacPidMultRpmBins[IAC_PID_MULT_RPM_SIZE]
uint16_t afterCrankingIACtaperDuration[CLT_CRANKING_TAPER_CURVE_SIZE]
scaled_channel< uint8_t, 1, 100 > iacCoastingRpmBins[CLT_CURVE_SIZE]
float cltCrankingCorr[CLT_CRANKING_CURVE_SIZE]
scaled_channel< uint8_t, 20, 1 > iacPidMultTable[IAC_PID_MULT_SIZE][IAC_PID_MULT_SIZE]
float cltIdleCorrBins[CLT_IDLE_TABLE_CLT_SIZE]
float afterCrankingIACtaperDurationBins[CLT_CRANKING_TAPER_CURVE_SIZE]
scaled_channel< uint8_t, 1, 100 > rpmIdleCorrBins[CLT_IDLE_TABLE_RPM_SIZE]
float cltCrankingCorrBins[CLT_CRANKING_CURVE_SIZE]
scaled_channel< uint8_t, 2, 1 > iacCoasting[CLT_CURVE_SIZE]
scaled_channel< uint8_t, 1, 20 > cltIdleRpm[CLT_CURVE_SIZE]
float timeSinceCrankingInSecs