What O2 Control does
Your fuel tables are a prediction. The ECU calculates an injector pulse from the base table and its corrections, fires the injectors, and hopes the result is the mixture you wanted. O2 Control closes that loop. It reads an exhaust oxygen sensor, compares the reading to a target, and trims fuel up or down until the two agree.
What you tune depends on the sensor you choose:
- Wideband sensor: the ECU works from the Target Lambda table, so you can ask for any mixture, lean cruise or rich boost alike, and the controller will chase it.
- Narrowband sensor: the ECU works from a Target Voltage table instead. A narrowband only really knows "richer than stoich" or "leaner than stoich", so it is best suited to idle and light cruise near stoichiometric.
If you are still choosing hardware, our explainer on how wideband sensors work covers the difference in detail. For almost every performance build we fit a wideband, such as the WB1 CAN wideband controller, or the WB2 dual-channel kit on a V engine where each bank gets its own sensor.
Short term vs long term trim
| Short Term Fuel Trim (STFT) | Long Term Fuel Trim (LTFT) | |
|---|---|---|
| What it is | The live correction the closed loop controller is applying right now | A learned correction stored in its own table, cell by cell |
| Memory | Temporary. The ECU doesn't store it | Kept by the ECU until you reset it or apply it to the base table |
| Speed | Fast, reacting to the live sensor reading | Slow, averages over time |
| Turned on by | O2 Control itself | Enable Long Term Fuel Trim, on its own tab |
The two work as a team. Long term learning slowly absorbs the error so the short term controller has less to do, which is what gives you a steady, quick-reacting closed loop. People often call long term trim "auto-tune", and that is fair as long as you remember it is refining a tune, not creating one. There's more on this in our guide to short and long term fuel trim.
Setting up the O2 Control tab
Start by choosing the sensor type and sensor number for Bank 1. If you have configured a second engine bank, you can pick a separate sensor for Bank 2 so each side of the engine is trimmed on its own reading.
The rest of the tab decides how hard the controller can pull and, just as importantly, when it is allowed to run at all.
| Setting | What it does | Our advice |
|---|---|---|
| STFT Max Enrich | Caps how much fuel the short term trim can add | Keep it modest. A big cap hides real problems like a failing pump |
| STFT Max Disenrich | Caps how much fuel the short term trim can remove | Keep it modest too, so a bad sensor reading can't lean the engine out far |
| Target Oscillation Amplitude | Deliberately swings the mixture around the target, in AFR (wideband) or volts (narrowband) | Leave at the default of 0 unless you need catalyst efficiency. Around 0.05 V is typical for narrowband emissions work |
| Warm Voltage | Narrowband only. If the sensor already reads above this voltage, the startup wait is skipped | Useful for hot restarts, where the sensor is still up to temperature |
| Initial Engine Running Time | How long the engine must run before closed loop starts, so the sensor can heat up (default 30) | The wait is skipped automatically if warm voltage is reached or a CAN wideband reports it is ready |
| Min Coolant Temp | O2 Control stays off below this coolant temperature (default 0) | Raise it if the cold-start enrichment and closed loop fight each other |
| Min RPM | O2 Control stays off below this RPM (default 450), which keeps it out of cranking | Keep it below your idle speed if you want closed loop at idle |
| Max RPM | O2 Control stays off above this RPM (default 4500) | Most useful with narrowbands, or if you prefer open loop at high RPM |
| Transient Throttle Rate Limit | Pauses closed loop when throttle moves faster than this rate | Lets gentle throttle changes stay in closed loop while stabs hand fueling back to the transient throttle system |
| Enable Max TPS | Optional throttle position ceiling for closed loop | Handy on a race car where you want wide open throttle left alone |
| Enabled Max MAP | Optional manifold pressure ceiling for closed loop | Use it to keep closed loop out of boost if you only trust it in vacuum |
A cold sensor gives nonsense readings. If you run an ECU-controlled sensor heater, get the O2 heater set up before you trust anything O2 Control does.
Tuning the controller tables
Under ECU Navigator, the Lambda > O2 Control branch holds the tables that shape how the controller behaves. Most of them can be mapped against any channel. To edit an axis, select the table and press F3, then change or add breakpoints. ESP rescales the table so its shape is kept when you move an axis value, so you won't wreck your work by adding a site.
Delay
Exhaust takes time to travel from the valve to the sensor. After something pauses closed loop, such as a throttle stab, the Delay table sets how long the controller waits before it starts correcting again. Without it, the ECU would react to exhaust gas that left the cylinder before the pause ended. This table is normally mapped with RPM on the X axis, because gas speed rises with engine speed, so the delay can be shorter up top.
Proportional, Integral and Derivative gains
These three tables are the heart of the controller, and they are intended to be mapped against throttle (X axis) and RPM (Y axis), though you can change either axis. In plain terms:
| Gain | Think of it as | Typical narrowband | Typical wideband |
|---|---|---|---|
| Proportional | How strongly it reacts to the size of the error. Higher reacts faster, too high makes the mixture swing rapidly | About 10 to 100 | About 100 to 300 |
| Integral | How big each correction step is. Higher pushes harder to close a small, persistent error | About 10 to 100 | About 200 to 500 |
| Derivative | A brake as the mixture approaches target. It can stop overshoot, but too much and it never gets there | Usually 0, since some overshoot is wanted | 0 or very small, roughly 0 to 10 |
We tune these in order. Start with derivative at zero and bring proportional up until the trim responds briskly without the lambda trace turning into a sawtooth. Then add integral until small steady errors close out. Only reach for derivative if you ran proportional aggressively and now see the mixture sail past the target.
Long Term Fuel Trim Gain
This sets how quickly the long term tables learn (default 30, mappable up to 3D). Larger numbers learn faster but can start the learned values oscillating. Smaller numbers are slower but steadier. On a customer car we'd rather it learns slowly and correctly.
Long term fuel trim setup
Long term trim works with either sensor type, but we strongly prefer a wideband. It responds faster and is accurate across the whole load and RPM range. Never let a narrowband drive long term learning at full throttle: it can't tell you how rich a power mixture really is.
Turning on Enable Long Term Fuel Trim (off by default) adds the learning tables to the ECU Navigator. The other settings on that tab:
- LTFT Max Enrich / Max Disenrich: the most fuel long term learning may add or remove. Both default to 15.
- Long Term Fuel Trim Rich Bias: teaches the long term table to sit slightly richer than target (default 3, set 0 to turn it off). Short term trim then pulls the mixture back to target in normal running. The benefit shows up if the sensor fails and the ECU drops to open loop: the learned tune is on the safe, rich side.
- Long Term Fuel Trim Min Temperature: no learning below this coolant temperature (default 80), so a cold engine's fueling needs don't pollute the table.
- Disable During Post Start Corr: stops learning while post-start enrichment is doing anything.
- Disable During Coolant Corr: stops learning while the coolant correction table is adding or removing fuel, which in practice means until the engine is fully warm.
We normally enable both "disable during" options. Any enrichment that fades out over time is exactly the kind of thing you don't want the learning table to memorize.
Bank 1 and Bank 2 Long Term Fuel Trim tables
These show the fuel percentage the ECU has learned for each cell. Their axis channels are locked to whatever your fuel base table uses, though you can move the breakpoints on Bank 1 and Bank 2 will follow. Up to 4D mapping is available, and you can edit cells yourself while learning is still running.
Reset and Apply to Base Table
Reset zeroes every learned value. Apply to Base Table folds the learned corrections into your fuel base table, then zeroes the long term table. On a two-bank engine there is only one base table to write into, so ESP applies the part both banks agree on and leaves the difference between the banks behind in the long term tables.
A sensible workflow
- Get the base fuel table close by hand in open loop, and confirm the sensor reads correctly.
- Enable O2 Control with conservative STFT limits and your enable conditions set.
- Tune the gains until trim moves quickly but smoothly in the logs.
- Enable long term trim, drive the car through the areas you care about, and watch the learned table fill in.
- Review the learned values. If they look sensible, apply them to the base table and repeat until the corrections stay small.
Troubleshooting O2 Control
| Symptom | Usually |
|---|---|
| Lambda trace saws up and down around target | Proportional or integral gain too high, or target oscillation amplitude left on |
| Trim never quite reaches target | Integral too low, derivative too high, or STFT limits too tight |
| Trim always pinned at its limit | Base fuel table is well off, or a real fault such as an exhaust leak before the sensor, fuel pressure or sensor error |
| Closed loop never activates | One of the enable conditions isn't met: running time, coolant, RPM window, TPS or MAP ceiling |
| Long term table stays at zero | Learning disabled, engine below the LTFT min temperature, or a post-start or coolant correction still active |
| Mixture jumps after a throttle stab | Delay table too short, so the controller reacts to old exhaust gas |
O2 Control sits alongside other fueling functions, so it pays to check decel fuel cut and your wideband sensor setup when something doesn't add up.
O2 Control FAQ
Can I run closed loop fueling under boost?
With a wideband, yes, and many of our street cars do. We keep the trim limits tight in boost and make sure the base tune is already safe, so closed loop is only polishing. With a narrowband, keep closed loop out of boost using Max MAP or Max TPS.
Is long term fuel trim the same as auto-tune?
Close enough. It learns fuel corrections cell by cell and can write them into your base table. It won't fix a tune that is badly off, and it only learns in areas you actually drive.
Should the Delay table be the same on every engine?
No. It depends on how far the sensor is from the engine and how fast exhaust is moving. A sensor far down a long exhaust needs more delay than one near the turbo outlet. If you want a hand setting it up, book a free 30-minute consultation.




