Fuel
Introduction
In M2.3.2 LOAD is the injection time in milliseconds to reach lambda 1.
Because rescaling all LOAD on every axis every time you change injectors is an insane amount of work, I took a different approach.
LOAD is stored internally as a 16 bit variable, but the map axes only go up to 255, because they are 8 bit. This does not mean that you will have any issues after going past 255 LOAD. The table lookup will simply read the last column, but because the internal LOAD (that is also reported by the datalogger) is 16 bit and essentially unlimited, all fueling and timing will still be fine. Also do keep in mind that 255 LOAD is roughly 2.7-2.8 bar of boost, and the MPXH6400A starts being insufficient. It is possible to work around this, by rescaling FGAT0 and LOAD, just as it is possible to linearize an 8 bar MAP sensor.
Algorithm
The injection pulsewidth is calculated as follows:
IPW = LOAD*FGAT0*ENRICHMENT+TVUB
Enrichment calculation works as follows:
FACTOR = (OLD_FACTOR * NEW_FACTOR) << 7
What this means is - if the new factor is more than 128, then fuel is enriched. If the new factor is less than 128, fuel is leaned, and if the factor is exactly 128, then nothing happens at all.
The objective is to calibrate the ECU so, that with a hot engine when ENRICHMENT is 128, then lambda = 1. To achieve this:
- We must pick the correct injector constant (FGAT0)
- Pick the correct injector deadtime (TVUB)
- Calibrate the VE so that LOAD is accurate to deliver a lambda = 1 (or 14.7 AFR) mixture when enrichment is 128
You can verify this is the case, when your real AFR matches REQ_AFR.