O2 Control

Elite Software Programmer › ESP - Main setup › FunctionsUpdated Sep 2026

O2 Control is the Elite feature that watches your oxygen sensor and nudges fueling until the measured mixture matches what you asked for. Set up well, it keeps a street car on target through weather and wear. Set up badly, it chases its own tail. Here is how we configure it in ESP and what every setting and table is actually doing.

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 isThe live correction the closed loop controller is applying right nowA learned correction stored in its own table, cell by cell
MemoryTemporary. The ECU doesn't store itKept by the ECU until you reset it or apply it to the base table
SpeedFast, reacting to the live sensor readingSlow, averages over time
Turned on byO2 Control itselfEnable 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.

SettingWhat it doesOur advice
STFT Max EnrichCaps how much fuel the short term trim can addKeep it modest. A big cap hides real problems like a failing pump
STFT Max DisenrichCaps how much fuel the short term trim can removeKeep it modest too, so a bad sensor reading can't lean the engine out far
Target Oscillation AmplitudeDeliberately 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 VoltageNarrowband only. If the sensor already reads above this voltage, the startup wait is skippedUseful for hot restarts, where the sensor is still up to temperature
Initial Engine Running TimeHow 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 TempO2 Control stays off below this coolant temperature (default 0)Raise it if the cold-start enrichment and closed loop fight each other
Min RPMO2 Control stays off below this RPM (default 450), which keeps it out of crankingKeep it below your idle speed if you want closed loop at idle
Max RPMO2 Control stays off above this RPM (default 4500)Most useful with narrowbands, or if you prefer open loop at high RPM
Transient Throttle Rate LimitPauses closed loop when throttle moves faster than this rateLets gentle throttle changes stay in closed loop while stabs hand fueling back to the transient throttle system
Enable Max TPSOptional throttle position ceiling for closed loopHandy on a race car where you want wide open throttle left alone
Enabled Max MAPOptional manifold pressure ceiling for closed loopUse it to keep closed loop out of boost if you only trust it in vacuum
Heater first

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:

GainThink of it asTypical narrowbandTypical wideband
ProportionalHow strongly it reacts to the size of the error. Higher reacts faster, too high makes the mixture swing rapidlyAbout 10 to 100About 100 to 300
IntegralHow big each correction step is. Higher pushes harder to close a small, persistent errorAbout 10 to 100About 200 to 500
DerivativeA brake as the mixture approaches target. It can stop overshoot, but too much and it never gets thereUsually 0, since some overshoot is wanted0 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

  1. Get the base fuel table close by hand in open loop, and confirm the sensor reads correctly.
  2. Enable O2 Control with conservative STFT limits and your enable conditions set.
  3. Tune the gains until trim moves quickly but smoothly in the logs.
  4. Enable long term trim, drive the car through the areas you care about, and watch the learned table fill in.
  5. Review the learned values. If they look sensible, apply them to the base table and repeat until the corrections stay small.

Troubleshooting O2 Control

SymptomUsually
Lambda trace saws up and down around targetProportional or integral gain too high, or target oscillation amplitude left on
Trim never quite reaches targetIntegral too low, derivative too high, or STFT limits too tight
Trim always pinned at its limitBase 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 activatesOne of the enable conditions isn't met: running time, coolant, RPM window, TPS or MAP ceiling
Long term table stays at zeroLearning disabled, engine below the LTFT min temperature, or a post-start or coolant correction still active
Mixture jumps after a throttle stabDelay 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.