Fuel Control

by: Michael Decipha Ponthieux
Posted: 2013-01-02
Last Updated: 2020-05-12


This write up specifically pertains to Ford fuel control but the basis applies to most all other ECUs / PCMs.

Before a vehicle can be tuned properly especially a highly modified vehicle the first step and most important is that all of the base changes are made in the calibration to incorporate all modifications that the vehicle has been subjected to. The second most important aspect of custom tuning is getting the fuel model correct so that the ecu has accurate fuel control. The first step of fuel modeling is putting the correct stoich AFR value in your tune. Below is a chart of the more common fuels and TYPICAL stoichiometric air/fuel ratios for that fuel.

Stoich (fuel type)

Typical USA Fuel Stoichiometric Air Fuel Ratios
Pump Gas Non-Ethanol14.64Does not exist in most parts of the USA
Pump Gas E1014.08typical fuel at most pumps in the USA
Sunoco Race Fuels
Sunoco MO2X UL (clear 97)14.52.7% oxygenated
Sunoco 260 GTX (98)14.4
Sunoco 260 GT (clear 100)13.93.3% oxygenated
CAM 2 GT 10013.9alternate name of Sunoco 260 GT
Sunoco 260 GT Plus (light blue 104)13.74.8% oxygenated
Sunoco Standard (purple 110)14.85
Sunoco Supreme (blue 112)14.95LEADED
Sunoco MO2X (green 112)14.52.7% oxygenated
Sunoco HCR Plus (orange 114)14.8
Sunoco Maximal (red 116)15.01LEADED
Sunoco MaxNOS (yellow 116)14.9
Turbo Blue Race Fuels
Turbo Blue Unleaded (clear 100)13.93.5% oxygenated
Turbo Blue Unleaded Plus (lt. blue 104)13.74.5% oxygenated
Turbo Blue (blue 110)14.7
Turbo Blue Advantage (lt . blue 112)14.9
Turbo Blue Extreme (orange 116)15.0
VP Race Fuels
VP Street Blaze 100 (orange 100)14.02 - 14.16
VP C10 (clear 100)14.535
VP C12 (green 108 MON)14.45 - 15.00
VP C16 (blue 117 MON)14.775
VP Q16 (yellow 116 MON, 120 RON)13.43
VP C23 (blue 120 MON)14.935
VP C44 (purple 99 MON)12.87 - 14.93
VP 110 (purple 110)14.40 - 15.09
VP 11314.26leaded / oxygenated
VP MS10314.265
VP MS109 (clear 105)13.415
VP Import (clear 120 MON)14.155
**If you have any corrections or additions to add to this chart leave a post on the forum and I will update this chart to keep is as current as possible. The above are TYPICAL stoich AFRs, fuel blends can vary from pump to pump and source to source.

Preface / Definitions

Before we can begin to discuss dialing in fuel it is imperative that you understand air fuel ratios, lambda and various miscellaneous terminology.
RAM PIDsNameDescription
KAMRFLTFTThe adaptive fuel multiplier learned over time.
LAMBSEThe commanded AFR the ecu is targeting. On 2010- and older strategies lambse is often mistaken called the STFT.
STFTThe instanteous fuel correction based on o2 sensor feedback. Only exists on 2011+ strategies with factory widebands.

StoichStoichiometric Air Fuel Ratio is where all the fuel is consumed most efficiently == lambda of 1.000

The following is a simplified list of the basic fuel modes for all ecu's (although other modes exist they are not primary control).
  • Underspeed
  • - Cranking PWThe ecu is in Cranking Pulsewidth Fuel Control when you physically hold the key in the crank position before it fires off (meaning <400 rpm).
  • Cold OL Fuel
  • - Base FuelBase fuel is the desired AFR during warm up.
  • Cold Fuel Enrichment
  • - Startup EnrichmentStartup Enrichment is the additional fuel needed to stabilize the engine for every startup, better known as a "Choke" in carburetor's.
  • Closed Loop
  • - o2 Sensor ControlClosed loop fuel control is the normal fuel mode used when the o2s are in control of fuel. In closed loop fuel control the o2 sensors switch to control fuel.
  • Open Loop
  • - WOT Fuel Desired lamda commanded over half throttle for enrichment and WOT - Wide Open Throttle.

    Cranking PW

    Cranking PW is the actual pulsewidth in msec the injectors are fired for every pip signal. If you have difficulty starting and suspect the cranking PW are too high (i.e. too rich) hold the throttle to the floor during crank to shut off the injectors to verify. Cranking PW does not have to be perfect. Typically +/- 25% of ideal will suffice with no ill effects. In summary, If you dont have to hold the key in the crank position with the starter engaged for too long to get the engine to fire then your cranking pw is fine.

    2002 and newer strategies typically require little to no Cranking PW adjustment as the cranking pw is calculated based on the fuel and air model.
    FNCRK_LAM This function is the lambse commanded during cranking. It should be set to 1.000 in all tunes and does not usually require adjustment.
    FN052C This function is the LOAD commanded during cranking. A good value is about .70 load. Adjust as needed to get the fastest fire off possible.
    This table is a multiplier to cranking pw. It should only be used to adjust the cranking pw to reduce pw on extended cranking to prevent flooding the engine. This is only present on 1994+ strategies. GUFX has this added in with the decipha patch.
    FN387 / FN387XThis is the underspeed PW multiplier which is also used during cranking PW. Should always be set to 1.000 in all tunes.

    2001 and older strategies require cranking pw modifications as follow:
    FN348On modified engines, the cranking pw is typically adjusted based on the percentage of injector size and engine size change. The following equation is typically used for startup tunes in these cases. It is common for the warm to hot cranking pw to need further adjustment to fine tune.
    You would multiply the Y-axis of the cranking pw function as a percentage of the following:
    OLD injector size / NEW injector size * NEW engine size / OLD engine size

    Understanding Lambse (Desired Lambda "Commanded Fuel")
    The first step to tuning is dialing in fuel. The ecu controls fuel with LAMBSE. If you've never tuned an engine before its imperative that you understand fuel CAN ONLY be dialed in on a WARM ENGINE. A cold engine can require significantly MORE fuel than a stabilized warm engine. Lambse is a derivative of LAMBDA or the "AFR" (air/fuel ratio) the ecu is demanding. When fuel is dialed in your wideband will match your lambse. YOU CANNOT ADJUST FUEL IN ANY WAY SHAPE OR FORM UNTIL YOU KNOW WHAT YOUR LAMBSES ARE!!! With null modifier's your LAMBSE will be the exact value in your base fuel table at warm stable temps. However, in all cases,
    you adjust your fueling to make your wideband MATCH your lambse, again,
    you adjust your fueling to make your wideband MATCH your lambse, repeat,
    you adjust your fueling to make your wideband MATCH your lambse
    you adjust your fueling to make your wideband MATCH your lambse

    DO NOT change the maf curve to get the wideband to spit out the AFR you want. Adjust the maf curve or injector values to get the wideband to spit out the afr the ecu is telling it to (LAMBSE). The LAMBSE is the Lambda (AFR) the ecu is DEMANDING. If your lambse is 1.160 at WOT and your wideband reads 0.990 lambda at WOT then you are RICH and you need to pull 17% fuel out. Just for clarification the 1.160 lambse at WOT was my example to show you that the wideband reading means nothing if you do not know the lambse the ecu is commanding. No one in their right mind would demand 1.160 at WOT but this extreme example is to emphasize the importance of lambse. Likewise, if your LAMBSE at WOT is 0.550 and your wideband reading is 0.750 then you are LEAN and need to add 20% fuel. Again, no sane person would demand 0.550 Lambse at WOT this extreme example is simply to express the importance of LAMBSE!!!. This understanding is paramount in order to dial in fuel. YOUR FUEL IS NOT DIALED IN UNTIL the wideband lambda matches the ecu's lambse.; When this happens your LTFT's - long term fuel trims "KAMRF" will be very near 1.000 in closed loop at all conditions. And the lambse that the ecu is demanding during closed loop will be the actual lambda measured with a wideband. Once more, you adjust your fueling to make your wideband MATCH your lambse. For all conditions the lambse is the AFR the ecu is demanding. So keep in mind multipliers only modify lambse. THEY ARE INCAPABLE OF DIALING IN FUEL. For example, if your wideband is reading 0.920 and your lambse is 0.880 your fuel is off by ( 0.920 - 0.880 = 4%). Changing the WOT fuel lambse multiplier from 1.000 to 0.960 will reduce your LAMBSE from 0.880 to (0.880 * 0.960 =) 0.844 and since your fuel error% is still 4%, your actual wideband lambda would drop to ( 0.920 - 0.040 = ) 0.884. That will give you a wideband lambda of 0.880 but lambse is commanding 0.844. Thus 0.880 - 0.844 = 4% error still exists and you did not dial in fuel. Thus as you can see you hadn't dialed in fuel since your fuel error% is still unchanged at 4%.

    PRLDSW - PERLOAD (FN035) - DOES NOT APPLY TO 2005+ Strategies

    PERLOAD CONTROLS FUEL. Perload is the percentage of total load depending on what value the PRLDSW scalar is set to. It is highly recommended to set PRLDSW=0 in all calibrations.

    Note: PRLDSW does not function in the 2002+ strategies that use TP_REL for fuel control natively. Thus 2002 and newer strategies do not support a PRLDSW scalar value of 0 for perload fuel control since the base fuel table uses TP_REL as the Y-axis scaling. In those cases verify if decipha has written code to do so in order to control fuel more precisely. At the time of this writing RZASA does have PERLOAD fuel control and FBGI0 currently does not.
    PERLOAD = LOADNot Recommended

    When PRLDSW=0, the ecu calculates perload as a percentage of LOAD using the "Peak Load" function FN035. In stock calibrations FN035 will be set to the MAXIMUM load the engine can possibly reach. For supercharged applications this will incorrectly INCLUDE the peak load in boost which I DO NOT RECOMMEND.

    In order to have the most efficiently possible fuel control FN035 must be dialed in to the curve of the engines load through-out the RPM range at 0 boost and 0 vacuum. Therefore FN035 must have your typical load value your engine reaches when at WOT Naturally Aspirated regardless if its boosted or not.

    When doing so and FN035 is dialed in properly, PERLOAD will be near 1.00 (+/- 0.05 fluctuations is typical) at WOT at all RPM's for a naturally aspirated engine. When in boost PERLOAD will be > 1.00 representative of the engine moving more air than it can flow naturally aspirated. This method is the MOST accurate method for fuel control on the ford ecu's.
    Note: Doing the above along with setting up the spark table appropriately is how boost can be added later after the engine has been tuned with minimal to no tune changes required. So long that the maf, piping and injectors remain the same.

    If using any of the EFIDynoTuning Base Calibrations, be sure that FN035 contains your maximum N/A load (while not in boost). If you do not have a boost gauge you can approximate 0 vac and 0 boost at approximately half throttle. In some extreme cases you may need to disable boost by removing the supercharger belt if you do not have a vac/boost gauge to find the LOAD at 0 boost / 0 vac. Once you have boost bypassed, do a WOT run in 2nd gear from idle to redline. At each 650 rpm interval, note the LOAD. If using TunerPro RT I have configured a histogram that will give you the correction factor to apply to FN035 under the Data History Tables (Histograms).

    When PRLDSW=1 then PERLOAD=LOAD which effectively disables FN035. This is not recommended since most engines peak load at low rpms is significantly lower than the higher rpms. In engines with larger cam's its typical to reach the same load value in cruise that you reach at 0 vac / 0 boost at lower rpms. If PRLDSW=1 you can only command a given lambse for any given load. Thus, doing so will require you command full enrichment AFRs at cruise. Otherwise at WOT at lower RPMs you will not have enrichment as this is the same load as cruise in the higher rpm's. THIS IS NOT RECOMMENDED. Note: This is typically the default setting on factory supercharged applications, supercoupe, cobra, lightning/harley. It is basically undone with FN1360 which will be discussed later.

    PCT_Load is inferred from the failure management lookup tables most notably FN1036 the failed load table and to a much less extent its associated modifier tables for BP and ISC compensation. This is not present in the foxbody and older ecu's thus those older strategies do not support a PRLDSW value of 2. PCT_LOAD is the top row of the FN1036 table divided by the current tables interpolated value. This gives a percentage of peak load based on throttle position which is not ideal.
    WARNING: When PRLDSW=2 perload is CLIPPED to not exceed PCT_LOAD * ARCWOTCOR. This can cause lean out at WOT if not dialed in properly. Note that this ONLY APPLIES when PRLDSW=2.
    Fyi: ARCWOTCOR is the inferred load multiplier for FN1036 at WOT to help compensate for changes in engine output at WOT.
    if PRLDSW=2 be sure that the ARCWOTCOR scalar is maxed out at 2.00 while dialing in the tune. ARCWOTCOR is a multiplier on PCT_LOAD (inferred load) which comes primarily from the FN1036A table If you hadn't dialed in the PCT_LOAD tables and ARCWOTCOR is not set to 2.00, then you will go lean at WOT if LOAD exceeds FN1036 * ARCWOTCOR.
    If using TunerPro RT, I have setup a histogram to dial in FN1036. Simply copy and paste that table into your tune along with the axis scaling. After you have dialed in your tune and FN1036A, you can reduce ARCWOTCOR to a reasonable value if you so choose, typically stock values of 1.3 for boosted engines or 1.1 for N/A engines. However, leaving ARCWOTCOR at 2.0 will not cause any issues and can be kept.

    When changing PRLDSW=0, the following are the MINIMUM changes required. This only applies to 2001- and older strategies. More details to follow.
    GUFX &
    Older EEC-IV
    Later EEC-IV
    & EEC-V
    ParameterOld ValueNew ValueComments
    FN320AFN320AO/L Perload ThresholdY-axis: all 0.95 to 1.20This function forces open loop based on PERLOAD
    FN035FN035Peak Load ScalingWOT load with boost bypassed (n/a - no boost load)
    **DNE**FN1360Stabilized Fuel TableThis table can be disabled by setting ECTSTABL=254 and ECTSTABLTIM=255.
    **DNE**FN337O/L Warm ThresholdY-Axis: all 2.00This function forces open loop only when the engine is warm, maxing to 200 load will disable.
    THBP2FN513WOT TP ThresholdY-Axis: all 650 adcntsThis function forces open loop based on throttle position, 650 adcnts/200 == 3.25 volts TP_REL
    FN1307FN1362Base Fuel Table0.805 > 105 perload
    0.875 at 105 and 90 Perload
    1.000 at 75 perload and less
    The base fuel table. (AFR the ecu is commanding)
    **DNE** = does not exist. See the
    Tips & Tricks Write Up for specifics on Open Loop and Closed Loop controls.

    Base Fuel (Cold Fueling) / Primary Fuel Table(s)

    The base fuel table is the AFR commanded based on engine coolant temperature and either LOAD, PERLOAD or RELATIVE THROTTLE (TP_REL) depending on your specific strategy and can also vary depending on how you have your tune setup for fuel control. In the fuel table the lambse is the afr your telling the ecu you want. If your lambses are 0.850 at WOT and you want them at 0.800 you need to go to the fuel table and change it from 0.850 to 0.800 in those cells. In all of my tunes I always simplify fueling by demanding 1.000 lambda (stoich) up to a perload of 0.75 of the maximum engine efficiency (no boost) and 0.875 at perloads of 0.90 to 1.05 and a lambse of 0.800 at perload of 1.20 and greater.
    Note that N/A engines cannot reach PERLOAD greater than 1.00 (more air than the engine can suck in on its own) when FN035 is dialed in "PER DECIPHA" as described above.
    CopperheadFN1362LBXBase Fuel Table ColdDoes not usually require adjustment.
    PowerPCFN1362LBBase Fuel Table ColdRecommend commanding enrichment lambse at top of table
    RZASAFN1362LXPrimary Base OL Fuel TableOnly used with decipha PERLOAD code, recommend setting as outlined above.
    FBGI0FN1362LXBase OL Fuel Tablerecommend setting to all 1.000 until PERLOAD code is released.
    CVAF1FN1362X_LOSTBase Fuel TableUses LOAD as the y-input. Recommend manually dialing in for now.
    CDAN4FN1362Base Fuel TableRecommend setting as described above.
    AHAC2FN1362Base Fuel Table / WOT MultiplierRecommend setting as described above.
    CBAZAFN1362 / FN1306Base Fuel TableRecommend setting as described above.
    GUFXFN1307 / FN1362Base FuelRecommend setting as described above.

    What about FN1360 - The Stabilized Fuel Table ?
    The stabilized fuel table and base fuel table effective interchange and serve the same purpose. The primary difference is that the stabilized table has rpm input instead of ect for the x-axis scaling. When the ECT Stable flag is set the ecu NO LONGER APPLIES STARTUP ENRICHMENT. More details are below.

    In 2001 and older strategies the base fuel table is used at startup until the ECT stable flag is set. In which it switches to the stabilized fuel table. In 2002 and newer strategies the stabilized fuel table is ALWAYS ACTIVE and the base fuel tables are only effective until the stabilized ect time scalar is exceeded.
    Disabling the ect stable flag from setting will disabled FN1360, FN338 and FN337 which are not needed.
    Note: The FN337 - RPM vs Load Open Loop Function is ONLY ACTIVE once the ECT Stable Flag is set, setting the function to all 0s will not force open loop until the ECT Stable flag is set. If the ect stable flag is disabled to disable FN1360 then that function will be disabled. FN320A is the perload OL threshold and should be used for enrichment based on perload.

    STFT / Lambse - Short Term Fuel Trims

    Short Term Fuel Trim is the lambse difference from stoich (1.000 - lambse) * 100 , It is the exact same representation of Lambse.

    To put this into perspective, lets say at WOT we have a LAMBSE of 0.800
    1.000 - 0.800 = 0.2 * 100 = 20 (STFT)

    Now, lets say we have a negative STFT value of -18
    1.000 - (-18 / 100) = 1.18 LAMBSE

    as you can infer, a negative STFT means its removing fuel, so lambse will be greater than 1.000 (leaner)
    a positive STFT means it is adding fuel, so lambse is less than 1.000 (richer)
    So lets say for example, we have a STFT of 15

    1.000 - (15 / 100) = 0.85 (Lambse)

    for quick reference heres a table to break it down and help understand it better
    -11.010 = [1.000 - ( -1 / 100)]
    -21.020 = [1.000 - ( -2 / 100)]
    -41.040 = [1.000 - ( -4 / 100)]
    -81.080 = [1.000 - ( -8 / 100)]
    -121.120 = [1.000 - ( -12 / 100)]
    -161.160 = [1.000 - ( -16 / 100)]
    -181.180 = [1.000 - ( -18 / 100)]
    -201.200 = [1.000 - ( -20 / 100)]
    -251.250 = [1.000 - ( -25 / 100)]
    01.000 = [1.000 - ( 0 / 100)]
    10.990 = [1.000 - ( 1 / 100)]
    20.980 = [1.000 - ( 2 / 100)]
    40.960 = [1.000 - ( 4 / 100)]
    80.920 = [1.000 - ( 8 / 100)]
    120.880 = [1.000 - ( 12 / 100)]
    160.840 = [1.000 - ( 16 / 100)]
    180.820 = [1.000 - ( 18 / 100)]
    200.800 = [1.000 - ( 20 / 100)]
    250.750 = [1.000 - ( 25 / 100)]

    FN1360 - Stabilized Fuel Table (ALL STRATEGIES)

    When PERLOAD=1 (PERLOAD==LOAD) you cannot allow for different lambses at different loads per RPM. But FN1360 will allow you to. The catch is that FN1360 is ONLY ACTIVE after the engine is warm == ect exceeds the ECTSTABL scalar and the STABLTIM scalar time is exceeded. So basically if you disable FN035 by setting PRLDSW to 1 (as most stock supercharged applications are) you are basically undoing it with the FN1360 table. However, since the FN1360 table ONLY gets used AFTER the engine is warm you CANNOT have efficient COLD fueling control. You WILL have either excessive enrichment or excessive lean out since the base fuel table FN1306 is only scaled by ECT (engine coolant temperature) and LOAD [when prldsw==1;(perload=load)]. Also worth noting is that startup enrichment fuel will be REMOVED when the Stabilized ECT flag is set that allows FN1360 to become active.

    For example:
    Some engines can only reach ~0.55 load up to about 1200 rpm, ~0.65 load below 3k and ~0.75 load at about 4k then reduce back down to about ~0.60 load at 6k rpm. So with PRLDSW=1 you WILL have to force open loop before 0.55 load and set the base fuel table so that at 0.55 load your at commanding enrichment typically 0.875 Lambse for pump gas. For optimal engine efficiency, response and safety, you should typically have lambse's commanding full enrichment at 90% of peak load. Thus, 0.55 * 0.9 == 0.495 load. however this is very inefficient since ~0.50 load is easily attainable at highway crusing rpms (~2200 rpm) which as a result will be enriched. Thus I recommend setting PRLDSW to 0 in all tunes. Most 94+ tunes have PRLDSW=2 in stock tunes, I recommend switching it to 0 and adjusting the
    minimum items listed above.

    Remember: PERLOAD only controls fuel and LOAD controls spark.

    Given the controls of PRLDSW, the "best" option for PERLOAD is to use Load Scaling from FN035 by setting the load scaling switch PRLDSW to 0. Remember, If the PRLDSW scalar is not set to 0 in your tune currently, you WILL have to make the minimum changes listed above.

    Injectors - Inputing Injector Data

    Accurate injector data is critical to properly dialing in fuel. See the Injector Data Reference page to see if your injector data is available.
    Injector High Slope - "Global Fuel K-Constant"

    The injector high slope "AHISL" is the actual flow rate of the injector. Typically this would be the same value as the injector is rated for (ex: 30lb injector would have a high slope of 30, a 60lb injector would have a high slope of 60, etc...) Although, its typically common for most injectors to have a high slope slightly less than their rating as well. For example a 36lb injector could have a high slope of 34.2, this is due to the fact that most injectors are rated at 43.5 psi but operate at only 39.15 psi thus lowering their actual flow rate.

    EEC-V Injector Maximum Injector Slope CLIPS EEC-V ecu's have maximum injector slope values based on the processor speed. For returnless fuel systems (1999+ newer) the deltap multiplier has to be FACTORED in to the maximum slope clip. Below is the maximum FINAL slope value the ecu can calculate.
    ECU Clock SpeedXTALHPSMax Slope Value (lbs/hr)Comments
    27 MHz4.060.34Late 2003 and 2004+ vehicles
    24 MHz3.053.641999-2003 most ecus
    21 MHz2.046.931998 ecu's
    18 MHz1.040.231995 ecu's

    Injector Low Slope

    The Injector Low Slope accounts for non-linearities at low pulsewidths, at low pulsewidths most injectors act as larger injectors spraying or drooling more fuel, so to compensate you will have a low slope typically with a value HIGHER than the high slope but not always. Typically the low slope is approximately 15% larger than the high slope on most injectors. So a 30lb injector would typically have a low slope of (30*1.15=) 34.5, a 60lb injector would have a low slope of (60*1.15=) 69 or so (excluding the siemens deka 60lb injectors which are very linear at low pulsewidths). The further apart the low slope is from the high slope the more influence the breakpoint will have, thus IT IS IDEAL AND HIGHLY RECOMMENDED to have the low slope AS CLOSE AS POSSIBLE to the high slope when dialing in unknown injectors; this will insure your fueling is not doing anything odd at the breakpoint. However, the low slope can SOMETIMES be less than the high slope on older larger injectors. This isn't as common on newer style injectors.

    Injector Slope Tuning

    The injector slopes can be thought of as global fuel multipliers. A smaller injector slope (smaller injector size) will spray MORE FUEL than a larger injector to deliver the same air/fuel ratio. Thus, decreasing the injector slope will RICHEN the fuel mix. This can ONLY be done when the MAF curve is correct and measuring airflow accurately.

    Fuel Pressure

    Changing the fuel pressure will change the Injector Slopes and Voltage Offset for ballpark quick adjustment, I compensate 1% per psi, so if you up the pressure from 40 to 60, i would multiply the slopes by 1.20 if I drop the pressure from 40 to 20, i would multiply the slopes by 0.80, if i went from 40 to 45 the i would multiply by 1.05 not exact, but good enough for government work, also keep in mind most injectors are rated at 43.5 psi where as a factory ford fuel pressure regulator will regulate the injection (delta) pressure at 39psi

    MAF Transfer - Dialing in the MAF

    Incorrect injector settings will usually only cause inconsistent fueling at the bottom of maf curve usually below 400 imaf counts. In most cases everything from 400 imaf cts and greater will have a consistent fuel error% if the maf curve is accurate. To test that the maf curve is accurate, simply make a half throttle log accelerating from idle sweeping through the maf voltage up to about half throttle at 6000 rpm. If done correctly you should have a smooth imaf ct increase from idle voltage up to about 700 imaf cts or so (dependent upon meter). Now you simply calculate out your fuel error% ( lambda / lambse ) at each imaf ct point and compare your error percentage. If you come up with a constant error% for everything over 400 imaf cts, then your maf curve is accurate!!

    For example:
    If during your imaf cts sweep your LAMBSE is at 0.888 and your wideband reads 0.960 but stays there CONSISTENT then the maf curve is accurate! You can very simply reduce your high slope and get your 0.960 wideband reading down to exactly 0.888 that the ecu is demanding (LAMBSE). LAMBSE's in closed loop are based purely on hego feedback, when in closed loop your lambse's will jump around to hit stoich (make the hegos switch.) Once it does, adaptives will update the KAMRF's. When in closed loop you do not need to dial in fuel, the KAMRFs will do that for you!!! Then once you've gathered sufficient KAMRF data you use that info to dial in your fuel.

    Note: The highest MAF voltage in the MAF transfer must be the maximum the ecu allows!!!! NO EXCEPTIONS!!! This will be 16 volts for EEC-IV and 5.12 volts for EEC-V The MAF curve must be in chronlogical order, thus all numbers must be in order from least to greatest, YOU CANNOT HAVE A LOWER FLOW FOR A HIGHER VOLTAGE!! else the ecu will reset everytime it reaches that point.

    For those that do not have a known maf curve, I recommend to dummy down the maf transfer to only a few points like so:

    etc, everything below set to 0v and flow = 0, you can now work your flows much easier, thats decipha's 2nd law of dialing in a MAF

    why bother with adjusting 30pts on a maf curve if you can change just 3 injector values and your fuel is perfect every time? with a known curve you can calculate hp from airflow, you'll also find that the transients are much more accurate and the vehicle just runs 'smoother' your afr will also be much more consistent, you wouldn't need to run the curve threw anything to straighten it out as it would already be perfect, also you can use the hegos to see where your WOT fuel is, if your kams are at one then you don't even need a wideband as your wot fuel is perfect, for newer 94+ ecu's that have inferred load you wouldn't have to spend hours dialing in inferred load as the only changes would be where the engine became more effecient, typically 3/4 throttle on up, that way if your maf sensor ever fails you can still drive the car with no problems, you can also find if you have any turbulance in your intake piping as the maf curve would have spikes in it, you can then clock the maf and know exactly where its happiest at
    so if you can get by with dialing in fuel using the slopes and breakpoint, that is your best bet

    Fuel Error% - Calculating Fuel Corrections

    Fuel error percentage can be calculated using the following formula
    LAMBDA - LAMBSE + KAMRF = Error %
    So for example, lets say our engine idles at 90 imaf cts, with the engine at a warm stable idle, the wideband lambda jumps between .98 and 1.02 lambse's are jumping between 1.14 and 1.18 kamrf is at 0.945, we then have

    1.00 - 1.16 + 0.945 = 0.785

    Calculate the fuel error percentage at each imaf point in your maf curve, if the corrections are not linear (indicating an incorrect injector value) then apply those corrections to your maf flow.
    So with that, (for this example) we would go to the 0.450 voltage point in our maf transfer function and multiply the flow by 0.785 for our new reduced flow rate.


    Scaling Airflow is done to compensate for a high flow MAF.
    Scaling Load is done to compensate for load clipping at 2.00
    Scaling Injectors is done to compensate for exceeding the maximum injector size limit.

    If you have a MAF that flows over 64 lbs/min (1,750 kg/hr) for EEC-V or PowerPC, or 86 lbs/min (2,350 kg/hr) for EEC-IV you will have to scale airflow.

    In any calibration make sure the MAF flow DOES NOT exceed these values, (even lower at 1,000 kg/hr or 36#/min for some select v6 and 4 cyl strategies) although you can put a higher value in the maf transfer, the ecu is incapable of calculating it. So you would compensate by scaling airflow.

    This does not apply if using TunerPro. As of Feb. 2020, TunerPro has scaling included integral to the definition file. See this post for more details -

    For greater knowledge, in order to scale airflow you must do the following:

    DIVIDE YOUR MAF MAXIMUM AIRFLOW BY 55 lbs/min (1500 kg/hr), the resulting value will be your SCALING PERCENTAGE,

    For example:
    Lets say you have a MAF Meter capable of measuring up to 116 lbs/min (3164 kg/hr).
    Take the maximum measureable airflow of 116 lbs/min (3164 kg/hr) and divide by 55 lbs/min (1500 kg/hr).
    For lbs/min: 116 / 55 = 2.109 ; 2.109 is your SCALING PERCENTAGE.
    if your def file shows kg/hr the same applies.
    3164 / 1500 = 2.109 ; 2.109 is your SCALING PERCENTAGE.

    you will now apply that SCALING PERCENTAGE to the following:
    PID - Early EEC-IVPID Late EEC-IV and EEC-VParameterOld valueNew ValueDescription
    SARCHGSARCHGCID scalar302143This would normally have the value for your cubic inch displacement like 301.08
    SARCHG and MAF flow is how LOAD is calculated
    Skipping this step is going to cause engine damage with excessive ignition timing due to low load
    FN036FN036MAF Transfer11655by scaling your ACTUAL maf transfer your measuring a percentage of actual airflow
    ALOSLALOSLInjector Low Slope101.45948.107now reduce your ACTUAL injector slopes and breakpoint by your scaling percentage to bring fueling back to where it was
    REMEMBER, a smaller injector sprays LONGER than a larger injector for the same AFR
    Reducing the slope will RICHEN the mix to compensate for reducing the MAF transfer which LEANED the mix
    AHISLAHISLInjector High Slope75.15735.63
    FN389FUEL_BRKPTInjector Breakpoint0.000024210.00001147
    **DNEAIR_MAN_VOLManifold Volume52.3reduce the manifold volume scalar by your scaling percentage to aid in transients (this is not available in older ecu's)
    FN1358FN040AInferred Airmassapply your scaling percentage to reduce all cells on the bottom 3 rows
    **DNEFN1036AInferred Load / Failed MAF Tableapply your scaling percentage to reduce all cells in this table, this table is the TOTLDST, PCT_Load table.
    **DNE = does not exist
    NOTE: Injector voltage offsets DO NOT GET SCALED
    Since we are measuring the SCALING PERCENTAGE of the MAF and the SCALING PERCENTAGE of the injectors we haven't changed fueling because the ratio of air to fuel is equivalent, but yet we don't exceed the ECU's maximum airmass clip of 64 lb/min (1,750 kg/hr) and now we won't split a V8 into two inline 4s. However, this doesn't exactly work out in all cases, often times slight adjustments to the injector slopes and/or MAF curve are necessary to get fuel dialed back in. Reason being is that often times people mistakenly clip the injector size limitations on EEC-V from lack of knowledge.

    EEC-V Max Injector Slope

    The EEC-V also has a maximum injector slope size clip similar to the maf flow clip. Just as outlined above, the scaling percentage must also accomdate the maximum slope value otherwise the ecu cannot calculate the injector size value you have in the calibration. The table below is the MAXIMUM slope size permissible for the given ECU clock speed. Be sure your scaled percentage puts the slope values BELOW this maximum clip.

    EEC-V - Injector Slope Maximum Value
    XTALHPSMhzMax Slope ValueTypical Applications
    1.01840.23 94-96 early eec-v
    2.02146.93 most 96-98 vehicles
    3.02453.64 most 99-02 vehicles, all 99-03 trucks
    4.02760.34 most 03/04 cars, excludes trucks

    Putting a value higher than those listed in the above chart for any given processor clock speed EEC-V will result in the value being clipped to the value in the table. NEVER EXCEED THE VALUES GIVEN.

    Scaling LOAD - 200 LOAD CLIP

    The older ford ECU's can only calculate up to 200 LOAD, once the ecu reaches 2.00 LOAD it cannot calculate further. This does not apply to the CAN-BUS ECU's that can be modified to calculate up to 400 LOAD.

    Wideband/Narrowband Tuning

    A narrowband will report a stoich switch before a wideband will, if it doesn't then something isn't right. A widband (WBo2) is nice but it not absolutely necessary to dial in fuel, with a known curve you can watch the kams peal the fuel curve into place the easy way to tell if your maf transfer is correct is that your wideband AFR will stay consistent, if your fuel is constantly jumping all over the place then your maf transfer is off, but if your LAMBSEs are static (one value) and your AFR is off by a percentage then you can make that correction with the SLOPE(s)

    for example, lets say you have your fuel table setup so that from 0 to 75 PERLOAD your LAMBSE is 1.000, at 90 to 105 perload LAMBSE is 0.875, 120+ load LAMBSE is 0.800 (see A9L2 for example) with all lambse multipliers null (set to 1 = no effect on lambse) including the global open loop fuel multiplier scalar null (set at 1.00) your lambse will be what we demanded in the fuel table at WOT lambse drops to 0.800 (perload exceeds 120) yet the wideband stays consistent reading 1.058, you can very easily drop the high slope from say 40 to 34.5 and in the next pull the WOT wideband will be exactly 0.800, now everything over the injector breakpoint is going to have a kam correction of 1.00 since your linear flow fuel is dialed in !! The only 2 variables remaining are the low slope and breakpoint, I start off by setting the breakpoint high, say 0.000020 (GUFB = ~6) for example, then adjust the low slope to get idle right where it needs to be, I then re enable closed loop and let the hegos and adaptives dial in the fuel, once the kams have learned you can organize the imaf numerically in the datalog and see how the kams have adapted, if you have a kam correction less than 1.00 in the lower voltages of the maf curve then you know you need to increase the low slope, REMEMBER, you must dial in the low slope BEFORE you can dial in the breakpoint as it will be constantly moving once you have the low slope dialed in and the high slope dialed in you'll see exactly where the breakpoint is as the KAM's will not be 1.00 in that MAF voltage range

    Open Loop / Closed Loop

    In open loop the lambse's do not respond to hego feedback, the lambse calculated from the fuel table(s) and multipliers is what you get since the hegos are cold during startup all ecu's crank into open loop fuel mode, one can logically figure out that since the hegos can only report STOICH = 1.000 lambda, that open loop must be entered at WOT and high loads as well where enrichment is needed (more fuel than stoich) So short, in open loop the hegos are just ignored but they can still give you insight on if your lean or rich by the voltage they are reporting. At WOT the hegos should be reporting 0.800 volts or more indicating your not lean. If you see them drop below that you know your lean unless the hegos heaters aren't getting power.

    During closed loop the ecu constantly adds and subtracts lambse to get the hego to switch if the hego is lean ( < 0.4 volts) then the ecu drops the lambse to enrichen the mix until the hego switches rich ( goes above > 0.4 volts) once the hego has switched rich, the ecu then increases lambses to get it to switch lean again in a never ending closed loop once the hegos are controlling fuel correctly, the ecu will save that fuel correction in the KAMRF data and use it the next time the ecu is in that cell (load and rpm range) the narrowbands and ecu can dial in your fuel much more accurately than a human can by looking at a wideband and making adjustments
    See the
    HEGO Write Up for more details.

    Closed Loop Tuning / KAMRF (LTFT)

    KAMRF is the absolute fuel error% at that specific imaf count which is how much fuel it took for the hego to reach actual CL stoich reported by the hego VS what you told the ecu it should be there is no fuel table for closed loop since its value is stoich = hego switch voltage point of .4 volts which can never be wrong you can apply the KAMRF as a direct multiplier to maf flow at that specific imaf, just make sure you remain at that imaf ct for at least 10 seconds and the lambses are switching above and below 1.0 so you know the kam's are mature and accurate.

    By datalogging and comparing MAF voltage to KAMRF we can dial in fuel perfectly but since the hegos only report stoich they can not be used to dial in WOT fuel... or can they? the beauty about mass air is that you tune the ecu to the peripherals not specifically to the engine by this i mean you don't dial in a VE table to calculate fuel like you would in a speed density setup once you have your maf and injectors dialed in, so long that your not exceeding their capacity, your fuel will be exactly where you set it

    its highly recommended to have a wideband for dialing in WOT but if you don't have a wideband you can still dial in your fuel by letting the hego's do it for you the ecu will default to open loop at WOT, in order to force closed loop at WOT you MUST set the WOT Breakpoint (threshold) to max either 5.1 volts or 1023 ad counts since relative_throttle position can never reach that the WOT flag will never be set, you must ALSO disable the OL vs RPM and OL vs ECT functions from forcing you into open loop the easiest way to do this is to set the time delay scalars to 20 seconds, you can now use the hegos to dial in WOT fuel, you must pull a few degrees of timing out to prevent a bunch of heat in the engine, an engines burns hottest at just a tad leaner than STOICH, and we all know HEAT MAKES POWAH so by pulling out say 6 degrees or more you will reduce the amount of heat in the engine and make it safer to beat on at STOICH
    for example, with a dialed in low and high slope your kams might look like this

    at 350 imaf cts and below, the kams fluctuate between 1.00 to 1.03 which is perfect.
    at 375 imaf cts, kams=1.05
    at 400 imaf cts, kams=1.06
    at 425 imaf cts, kams=1.04
    from 450 to 1000 imaf cts, kams fluctuate between 1.00 and 1.02

    you then know you need to reduce the breakpoint to give it a little more fuel where the slopes meet which is approx. 400 imaf cts in the example given

    think of it like this

    low slope=low load, cruise and idle
    high slope=high load, wot and aggressive acceleration
    breakpoint, is the center of where it mixes both together

    E-85 Adjustments

    If you've previously tuned your vehicle for pump gas and are switching to E-85 the following are the minimum changes that should be made when switching fuels.

    reduce stoich_afr "z_afr" to e85
    shoot mbt timing to it
    kick up the crank pw by 25%
    drop the 90+ load lambses (top 3 rows) by 0.05 lambda

    Dial her in from there.


  • Multipliers and fuel tables only modify lambse, THEY DO NOT DIAL IN FUELING!!
  • You can use the wot fuel multiplier if you want, in fact I use it on a lot of my mail order tunes, but remember though its a multiplier on lambse it cannot dial in fueling. So remember if your demanding 0.888 and your wideband is saying 0.820 even if your in boost, your running rich, once again the purpose in this write up is to emphasize that the wideband reading is useless without knowing the lambse, there is no possible way to know if your rich or lean since its relative to lambse
  • If you want a WOT AFR of 0.800 and your wideband reads an AFR of 0.800, yet the LAMBSE is 0.860 (the computer wants 0.860) THEN YOU ARE RICH and you need to change your fuel table to 0.800 instead of 0.860 and then reduce fueling so your wideband then reads 0.800 again which would coincide with your lambse, since your 6% richer now if you just changed the lambse to 0.800 without changing your fueling you'll be down to 0.740 lambda
  • LAMBSE is the AFR the ecu is demanding, widebands read the actual lambda, thats why you dial in fuel by getting the actual lambda (wideband) to match the commanded lambda = "LAMBSE"
  • Side Note: Table rescaling has no effect on FUELING, for the record, no one has to rescale any tables, its ONLY done to gain more control, if you want to do it the quick way you can simply increase the SARCHG (cubic inch displacement scalar) and adjust your tables accordingly, same principle
  • LAMBSE is the afr you tell the ecu you want, once fuel is dialed in correctly, the wideband will spit out the same value as LAMBSE
  • The lambse should be whats in the fuel table unless your in closed loop and its varying around stoich or if theres a multiplier thats modifying the lambse, like the wot multiplier, global fuel scalar, startup enrichment, lug multipliers, etc..
  • The injector slopes have nothing to do with lambse
  • Its often easiest to get fuel close in open loop then enable closed loop and use the kams to mold the fueling into place perfectly
  • The older ecu's used lbs/rev as a variable for the breakpoint (half the engine cylinders), where as with the newer ecu's its static thus the single breakpoint lb fuel scalar

    Startup Enrichment

    Startup Enrichment is the additional fuel needed to stabilize the engine for every startup, better known as a "Choke" in carburetor's. If you haven't dialed in base fuel yet then you can't dial in startup enrichment yet. Once your base fuel is dialed in for startup fueling compensation you have to dial in the startup enrichment "lambse subtractor" table.

    Also note the other big contributor to startup is dialing in the isc multiplier table(s) fn1861 / fn1862n / fn1862d.

    This is covered in the

    Cold / Startup Enrichment Write Up

    Resetting the ECU / KAM Memory

    Once your fuel has been dialed in, the KAM memory will not need to be reset.
    It is NOT recommended to reset the KAM memory for any purposes, the adaptive memory can ONLY benefit the tune.
    An unintentional memory reset such as a loss of battery power will not warrant any tune adjustments.
    If the vehicle has been sitting for an extended amount of time without the engine ran, so long as the injectors and MAF
    sensor remain the same as it was when tuned, no tune adjustments are required.

    Keep Alive Memory SHOULD ONLY be reset when fuel modeling has been changed
    this will occur under the following conditions:
    • MAF Transfer Function adjustments greater than 5%
    • Injector High Slope adjustments greater than 0.5 lbs/min
    • Sarchg (CID - Engine Size) adjustments greater than 50 cubic inches

    Adjustments made to LAMBSE in the fuel tables WILL NOT require KAM to be reset.

    to reset KAM's do any of the following:
    • The easiest method is to change the kam clear scalar to clear then hit update, then change it back to normal and hit update again, key must be on
    • OR... you can select an empty tune slot with the key on then select back to the tune
      for example, (if using BE) open up hardware >> moates config >> select tune slot 7 which should be blank, the pump will run, then select tune slot 8 again and the pump will shut off (if thats where you have your tune written)
    • OR... or you can write a corrupt tune to it like a CBAZA tune to a GUFB ecu for example
    • OR... you can disconnect the battery for 30 minutes
    Any of these methods will reset the learned adaptive fuel KAMRF's and idle air ISCKAM corrections.

    Retuning Required

    Retuning is required under any of the following circumstances

    • MAF sensor changes - all changes must be made in the MAF transfer ONLY
    • Fuel Injector changes - all changes must be made in the injector parameters ONLY
    • Fuel Pressure changes - all changes must be made in the injector parameters ONLY
    • Cylinder Head Replacement - spark table and peak load function must be updated
    • Camshaft Replacement - dashpot MAY need to be updated
    • Base Timing changes - Ignition timing (spark table) and injector timing must be updated
    • Fuel Grade changes, ex: E-85 or 87 Octane - AFR parameter and/or spark table must be updated

    Tuning Fuel Blind - No Fueling Feedback

    In some cases you will run in to some vehicles that do not cooperate. In these instances often the hegos are non-functional and an aftermarket wideband sensor either isn't possible due to the setup or just non-functional or reading incorrectly. In most instances it is due to burning oil and/or cam timing events or large exhaust with poor velocity. In any case in order to dial in these setups you must return to the old school carburetor style methods of dialing in fuel by feel. This is my method that works for me.

    First you will have to force open loop which goes without saying if you have incorrect or no hego feedback.
    Force OL Then simply go play with the maf transfer to get the engine running as best as you can. Without having any way to read the afr you cannot dial your fuel in so you have to tune it like a carb and adjust the maf transfer to see if the engine likes it or not. The best way to do this is to get the engine up to operating temp then at idle go adjust the maf flow at that imaf ct your idling at by reducing the flow multiplying it by 0.95 and updating. Continue to reduce the flow in 5% intervals until the engine starts dropping rpm and you will also see IPSIBR starts shooting up to add air to maintain idle. You have now reached the lean best idle fuel. Now multiply the flow by 1.05% to give it back 5% to make her happy again. At this point you've now reached the leanest point the engine will happily idle at and you've dialed in that maf point. Now use the throttle to reach the next imaf ct point and start over again. Dial in each point as well as you can until you reach the highest imaf cts point possible. Then to dial in those higher points you have to drive the vehicle. Hold the maf stable at that next imaf while driving and dial it in. Keep repeating until you reach half throttle. After half throttle it is safer to add fuel in 10% intervals by multiplying the flow at that imaf point and all the points above it by 1.10 until you've reached the point where adding fuel seems to slow the engine down or make it not as responsive. At that point remove 5% and your at the richest best fuel point for enrichment fuel and WOT. This is a tedious process so be patient. If a dyno is not available and street tuning is required its always best to have someone ride with you if possible to make operating the vehicle and tuning safer and easier.



    Even with known values fuel is seldom dialed in hence the need for custom tuning. Typically with known data its usual to be lean on the big end at WOT. Usually the mid-range is fairly close and idle will almost always need adjustment regardless.

    If PRLDSW=0 and FN035 is scaled properly as per the Scaling Write Up your fuel table should be set as follows: FN1362 Base Fuel Table


    if you input the actual flow values for your injectors from a flow bench as well as the maf values from the flow bench your fuel will probably be off a tad, it should be perfect in a perfect world but we don't live there. A flow bench has nothing to do with injectors or a curve or anything, a flow bench just measures flow, a good starting point but thats it Free reving an engine to dial in the maf meter is a very valid and effective means of creating the curve down low, you can typically dial it in enough to drive it out of state This is maf not speed density, the maf measures airflow, it doesn't matter if your engine is at 2v on the maf at a steady 60mph cruise or if its at 2v on the maf free reving at 4500 rpm. Its still flowing the same amount of air, a non lab-spec wideband is not as accurate as a narrowband at finding stoich, a narrowband ONLY measures stoich You can't use them to dial in fuel for anything other than stoich, however, you can should always use the narrowbands to verify the wideband is accurate If the narrowband voltage isn't over 0.8 volts at WOT then it would be wise to start snooping around and questioning the wideband could also be a faulty hego ground (check out
    Hego for more details).
  • Changing the injector slopes DOES NOT CHANGE LAMBSE.
  • Adaptives does not change anything, it only closes the gap from lambse and afr
  • PW is irrelevelt, thats the beauty of mass air, if the fuel is dialed in at 180kg/hr then its dialed in at 180kg/hr, rpm or pw is irrelevent
  • Fuel is proportionate to airflow the ecu will adjust pw for the rpm to reach the same lambse, thus mass air flow
  • Think of the breakpoint as an amount of fuel, because thats exactly what it is, in the older ecu's with a breakpoint function the breakpoint does
    actually get effected by rpm but its very minute, this is exactly why you can't convert from a breakpoint scalar to function
  • in open loop, lambse1=lambse2 the actual air/fuel ratio commanded matches what the engine is actually getting. This is the most critical aspect of your tune which lays the foundation since any error in fuel modeling will directly affect air modeling which is how load is calculated. Since load is how spark, transient fuel and almost all other major algorithms is the ecu are referenced it is very important that fuel be dialed in first otherwise everything else will need to be re-dialed in. dialing in the maf is typical when tuning and mass-air flow Before any 'tuning' can begin the ecu must have the correct stoichiometric air fuel ratio entered into the calibration data. The stoichiometric ratio is the ideal ratio in which all energy in the fuel is consumed. A numerically lower stoichiometric ratio consumes more fuel (lower MPGs) as compared to a fuel with a numerically higher stoichiometric ratio (higher MPGs). The stoichiometric scalar should be changed to reflect the actual fuel being burned.


    Load controls spark, load is calculated by the MAF (airmass) and SARCHG (engine size "CID") load is ford's equivalent to VE (volumetric efficiency). A bone stock E7 headed SBF 5.0L 302ci should reach a maximum peak load of ~78 at approximately 4k rpm, with LOAD reducing above and below peak tq.
    Thus, SARCHG on mass air ecu's is primarily used for spark control being that the major influence is LOAD. SARCHG has no direct affect on fueling for mass air ecu's. Changing the load value will not enrich or enlean the mix directly. However, changing SARCHG will change LOAD, and that could cause you to be in a different load cell causing enrichment or lean out if the above minimum changes required aren't adjusted to compensate.
    Return Home
    Jump to Forum
    www.EFIDynoTuning.com - EFIDynoTuning LC - New Orleans, LA