Closed Loop Fuel Correction
Closed-loop fuel correction trims delivered fuel toward the target lambda. Enable
it with fuelClosedLoopCorrectionEnabled, then configure Fuel > Closed loop
fuel correction. This is transient short-term trim, not an automatic
recalibration of the VE, MAF, Alpha-N, lambda-target, or ignition tables.
Correction is allowed only while the engine is running, after
stft_startupDelay, and when coolant is valid and at or above stft_minClt.
Each cylinder uses cylinderBankSelect to choose a bank. Bank 1 reads Lambda1,
bank 2 reads Lambda2, and so on. The selected load coordinate comes from
stftLoadSource; stft_maxOverrunLoad and stft_minPowerLoad separate the idle,
overrun, power, and main regions.
Each region has stft_cellCfgsN_timeConstant, stft_cellCfgsN_maxAdd, and
stft_cellCfgsN_maxRemove. The controller integrates lambda error toward the
commanded target. stftIgnoreErrorMagnitude selects constant-rate adjustment.
The current implementation clamps the effective trim to plus or minus 25 percent.
Correction pauses, without clearing that region's accumulated trim, when the
lambda reading is missing or outside stft_minLambda to stft_maxLambda. It also
pauses for noFuelTrimAfterDfcoTime after DFCO and for two seconds after another
fuel or spark cut. If the feature itself is disabled, or its running, startup, or
CLT gate fails, the returned bank multipliers are 1.0.
Do not interpret a failed sensor or a paused trim as successful calibration. A
dead sensor produces no new lambda error, and the cell can retain its previous
correction when correction resumes. Inspect the lambda channel, fault state,
fuelClosedLoopBinIdx, bank trim, target lambda, and recent cut state together.
Run open-loop calibration separately, establish a valid target and sensor
reading, then enable closed loop and verify each bank and region.