EEC Mass Air Fuel Control

by Michael Decipha Ponthieux
Posted: 2013-04-14
Last Updated: 2017-11-01

PERLOAD, LoadX, Load%

Perload controls fuel, perload is the percentage of total load depending on what value the PRLDSW scalar is set to. If prldsw is 0 then you are scaling load from FN035. FN035 must be dialed in to the curve of the engines load at zero crossing.

I HIGHLY RECOMMEND SETTING PRLDSW=0 IN ALL TUNES. When PRLDSW=0, the ecu calculates perload as a percentage of LOAD using the scaling function FN035. FN035 must have your load value at zero crossing which will be the maximum load values your engine can reach at WOT Naturally Aspirated.

If using any of the EFIDynoTuning Base Calibrations, be sure that FN035 contains your maximum N/A (while not in boost) LOAD. 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 crossing. Once you have boost bypassed, do a WOT run in 2nd gear from idle to redline. At each 1300 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 FN035 is dialed in properly, PERLOAD will be near 100% (+/- 5%) at WOT at all RPM's for a naturally aspirated engine. When in boost PERLOAD will be greater than 100% representing the engine is moving more air that it can flow naturally aspirated. This method 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 PRLDSW=1, then PERLOAD=LOAD << disables FN035 (not recommended)

PCT_Load is inferred from the failure management lookup tables mainly FN1036A. (This is not present in the foxbody and older ecu's)

NOTE: Most later EEC-V strategies do not support a PRLDSW scalar value of 0 for perload fuel control. In those cases, contact decipha to have the code rewritten to do so in order to control fuel more precisely.
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.
PID - Older EEC-IVPID Later EEC-IV and EEC-VParameterOld 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)
**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 400 adcntsThis function forces open loop based on throttle position, 400 adcnts == 2.0 volts
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.


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.

FN1360 - Stabilized Fuel Table

When PERLOAD=1 (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 ECTSTABL).

So basically if you disable FN035 by setting PRLDSW to 1, 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 PERLOAD [when prldsw==1;(perload=load)]. Also worth noting is that startup enrichment fuel will be REMOVED when the Stabilized ECT flag is set, allowing FN1360.

For example:
A stock pushrod 302 will only reach ~55 load up to about 1200 rpm, ~65 load below 3k and ~75 at about 4k then reduce back down to about ~60 load at 6k rpm. So with PRLDSW=1 you WILL have to force open loop before 55 load and set the base fuel table so that at 55 load your at least as rich as 0.875 Lambse. Typically you should have lambse's ramping rich at 90% of peak load. Thus, 55 * 0.9 == 49.5 load, however this is very inefficient since ~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.


Many people mistakenly confuse load scaling with scaling airflow, the two are completely different.

Scaling airflow is done to compensate for a high flow MAF. 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, to do so 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. When the ECU reaches its highest calculatable LOAD it may cause the ecu to reset, enter crank mode, etc.. but most importantly you loose spark control since you will be clipping the top of the spark table, all of which are undesireable results. To compensate for clipping LOAD at 2.00 you must increase the SARCHG value (CID scalar) so LOAD is below 2.00 I typically never let LOAD get above 1.50 on most vehicles I tune that way you still have some cushion if they decided to turn it up. Keep in mind when doing this you'll need to adjust FN035 and the spark values so your not demanding excessive timing and a lean mix under boost.

How to reduce LOAD ? As I mentioned before, LOAD is calcualted by airmass from the maf and SARCHG - the engine size scalar.
(FYI: SARCHG is an abbreviation of standard aircharge.)
You can reduce LOAD by simply dividing your maximum load value by your new desired maximum load value. lets say your reaching 1.75 load at WOT and you want it to be at 1.40 1.75 / 1.40 = 1.25 If you multiply SARCHG by that (lets say sarchg is at 143) 143 * 1.25 = 178, when you INCREASE sarchg to 178 your new load at WOT will be your desired 1.40 LOAD. REMEMBER: When changing SARCHG, the bigger concern will always be the spark table axis scaling as a lower load will command MORE timing all else being the same. Be sure anytime you increase SARCHG to reduce LOAD that you ADJUST THE SPARK TABLE ACCORDINGLY either by reducing the LOAD axis scaling function or by reducing the commanded spark advance for the new lower LOAD values. As not only will WOT have a lower LOAD value, the zero crossing LOAD value will be lower as well and will need to be updated in both FN035 and by making sure the commanded spark advance in the table at that zero crossing point is not excessive for the engine naturally aspirated.

Table Axis Scaling tables for BOOST (greater spark control)

The majority of EEC's do not have MAP sensor inputs, and the ones that do aren't boost friendly, so we can't adjust timing based on boost right? WRONG!!

Again, this write up pertains to MASS AIR ecu's, using the MAF you can rescale the tables axis to retard timing based off of boost pressure (higher loads).

The only reason you would rescale the tables axis is to get more control of spark so you can demand a different value at higher loads that a stock engine doesn't need to have access to since it cannot reach those higher loads naturally aspirated. Henry didn't scale table axis for high loads for the simple fact that the stock engine can't reach those loads so they put more resolution down low. Typically a stock 302 only reaches ~75 load around 4k and load falls above and below 4k (peak torque).

So for example, let say at WOT your setup with 6 psi of boost puts you at 1.20 load, with 10 psi your at 1.50 load and at your max boost of 18psi your at 1.80 load, you can rescale the tables so you can control timing and fuel at these boost levels.

Now this is all assuming the wot spark functions are disabled (for older eec-iv's), and if your strategy doesn't have that hack added to it you can set the tps breakpoint for WOT to its maximum value so the WOT flag will never be set. The only downfall is that by doing that you loose the WOT multiplier functions, but its not very common that you would need to use those functions anyway, just keep that in mind if you go that route so when you look at your logs your APT (throttle state) will never reach 1 (1=WOT). The WOT spark functions were probably incorporated in the ecu's as a safety measure in the older ecu's, but ideally you don't want to pull spark just because the pedal is through the floor, you want to 'ramp' spark which will increase torque, throttle response, fuel economy, etc... which is how the newer ecu's control spark from the factory, plus it allows you to add or remove boost without having to change calibrations.
See the
Simplify Fox Timing Write Up for more details.

NOTE: With the WOT breakpoint set to maximum, while cranking with the throttle pedal to the floor to normally activate the flood-clear "kill injector" mode, it will not function since the ecu will not recognize WOT.

I recommend everyone to use only one spark table just for the sake of keeping everything simple, the only people that may want to interpolate between the lug tables would be those who have a very high compression engine running low octane fuel or those advanced tuners with manuals behind turbo's trying to decrease spool after a shift. Most 94 and later ecu's use the least amount of calculated spark at any given time if you have a newer ecu you can set all other spark tables to high values ~60 and just use the borderline knock table as your primary means of spark (don't forget about the multiplier tables and functions), if you have a GUFX ecu then just set the hack scalar for spark inhibit to sealevel only or just download the A9L2 Base Tune

For more ignition timing information visit the TIMING Write Up and the MBT reference chart. on to the good stuff...

Nomalizing - Axis Scaling Functions

This example given is specifically for the Sealevel Spark table in GUFX, however, the FN2200 Borderline Knock table in newer ecu's follows the same principles as do all tables axis scaling.

FN904A is the Sealevel Spark Table in older EEC-IV, the Y-Axis is Normalized Load Scaled from FN071
So off to function FN071 we go

FN071 - Stock A9L:

As always the X-Axis top most and bottom most values should never be changed under any circumstances in any function. 200/400 is the max LOAD the ecu can calculate and 0 is the least LOAD, the value in the Y-Axis is the row for the table its scaling.

I know to some that's got to be confusing so I'll break it down and make it nice and easy to understand by going through it

If you cruise back up or if you have a high enough resolution display setting on your monitor you'll see that i put the row numbers next to the sealevel load table scaling so you can understand where each point is referencing, but if you don't,

here it is again in bold, the values on the left are the Y-axis input for the Spark Sealevel Table

75 (row 7)
60 (row 6)
50 (row 5)
40 (row 4)
30 (row 3)
20 (row 2)
10 (row 1)
5 (row 0)

Which is the same thing as this

We'll take it from the bottom, from the load scaling of FN701, anything from 0 to 5 load is using row 0, then 10 load is right there in the function at row 1 so no interpolation is being done, the next value is 60 at row 6, so the ecu is interpolating everything in between. 60 -10 = 50, 6 - 1 = 5, 50 / 5 = 10 per row, so row 2 is row 1 + 10, row 3 is row 2 + 10, and so on, row 7 is 75 to 200. So everything from 75 load and greater (up to) 200 load uses row 7. This is how all scaling functions 'function' in the ecu.

Now its up to you to change your spark scaling to better suit your needs, pretty much everything 30 load and less (actual unscaled load) can use the same timing normally, at CT and Idle, spark is being called out from FN111, so everything below about 20 load will just about never be used. With that knowledge right off the bat you can free up 3 rows right there which may be enough to do what you need to. if not then you can adjust accordingly. I highly recommend the spark scaling I have in the A9L2 and T4M2 Base Tunes for all calibrations.

Now with the original load scaling i made for my theoretical engine example, i would scale the spark table to something like this:

Which made my spark table look like

Be sure you save the calibration when changing any scaling function for those changes to be applied, else it will show the scaling it was loaded with. Don't forget YOU ALSO NEED TO ADJUST ALL THE TABLES AND FUNCTIONS THAT THE NEW SCALING CHANGES. LOOK IN THE COMMENTS FOR AN IDEA OF WHERE TO ADJUST EVERYTHING ELSE.

You can now plug in the timing you want at each point of boost and enjoy the new powah and voila! Now we have table scaling for boost.

Here is a quick example of what an optimized timing table might look like just to give you an idea:
A9L2 FN904A

Load is going to vary per setup, load is based off airflow and CID, since we all run different MAF's and using the maf to dial in fuel is a typical method. Load can be anywhere at any time on any setup, can't really say where its going to be unless you have a flowed or known MAF curve.

See the
Spark Write Up for more details on ignition timing. The MBT Reference Chart can be found on the home page under reference.

I recommend giving the Tips & Tricks Write Up a read over for various ways to force open loop, disable hego2, etc...

Return Home
Jump to Forum - EFIDynoTuning LC - New Orleans, LA