Skip to content

Tuning Table Generators

Cole Gentry edited this page Sep 18, 2026 · 1 revision

Tuning Table Generators

UltraLog 2.15 adds two tools that mine your logs for events and turn them into tuning tables: Lambda Delay and Accel Enrichment. They sit beside Log Viewer, Scatter Plots and Histogram in the tool switcher (⌘4 / ⌘5 on macOS, Ctrl+4 / Ctrl+5 elsewhere).

Both tools share one workflow:

  1. Load a log and pick the tool.
  2. Check the channel roles in the Tool Properties panel (auto-detected; marks a near-tie you should confirm).
  3. Adjust the axes if your ECU table uses different breakpoints.
  4. Click Run on current file. The table appears in the center panel.
  5. Load more logs and click Add current file to table to fill sparse cells.
  6. Export as CSV, copy for paste, or export PNG/PDF.

Tables are session-level, not per-file: switching tabs or tools does not lose a table. The active tab only decides which file Run reads.


Reading a table

Each cell shows the median of every accepted event that landed in that RPM × load cell. The small badge in the corner is the sample count, colored by confidence:

Confidence Rule Display
Empty no events dark cell
Low fewer than 3 events, or spread (MAD) more than half the median value in italics, red badge
Medium 3 or more events amber badge
High 8 or more events with a tight spread green badge

Empty and low cells are never interpolated. Export leaves them blank by default ("Blank low-confidence cells"); untick that to export everything.

Hover a cell for median, spread, count and confidence. Click a cell to open the event inspector: every event in that cell with its time, source log and diagnostic note. Jump switches to Log Viewer at that moment so you can see what the sensors did.

Below the toolbar, each log reports what it found and why events were rejected, for example 208 events found · 206 rejected: 109 unsteady, 93 overlap, 4 wrong direction. This tells you what kind of driving to log next.


Lambda Delay

Measures the time between an injector pulse-width step and the wideband's response, binned by RPM × load (MAP or TPS). This is the number your ECU's closed-loop O2 control wants in its delay table.

What to log

  • Open loop. With closed-loop O2 correction active, the ECU's own trims cause pulse-width steps and contaminate the measurement. Map a correction or closed-loop state channel and the tool rejects contaminated events; leave it unmapped and the report warns that results assume open loop.
  • Warm engine. Map coolant temperature and events below the threshold are rejected.
  • Trim bumps. Hold a steady RPM and load, then bump fuel by 8–10 % up and back down. Each bump is one event. A driving log works too with the relaxed profile, but expect most events to be rejected as unsteady.

Channel roles

Role Required Notes
Engine speed yes
Manifold pressure / Throttle position one of them Choose the load axis with the Load axis toggle
Injector pulse width yes Per-injector on time, average PW, or duty cycle all work: the step test is relative
Lambda / AFR yes λ or AFR is detected from the data. Prefer a single sensor over a bank average, which smears the response
Fuel cut flag no Events during DFCO are rejected
Closed-loop correction no See What to log
Coolant temperature no Events below Min coolant temp (default 60 °C) are rejected
Clutch state no

Measures

Switch the measure dropdown to view any of these over the same events:

  • Dead time (ms) — first significant deflection. The primary value for an O2 delay table.
  • T63 (ms) — time to 63 % of the settled response. Useful for judging sensor speed.
  • Response magnitude and step size — diagnostics.

The measured dead time includes about half an engine cycle of injection scheduling and about one cycle of exhaust transport. That is what the ECU's delay table should contain, so it is reported, not subtracted.

Units on export

Delay exports in milliseconds, engine cycles (ms × RPM / 120000, four-stroke) or ignition events (cycles × cylinders ÷ 2). Set Cylinders when using ignition events. Conversion uses each cell's center RPM.

ECU Table unit
MegaSquirt MS3 EGO delay, AEM Infinity, MoTeC M1, Link, Emerald ms
Haltech O2 control, Speeduino EGO delay engine cycles or ignition events (check your ECU)

Parameters

Parameter Default What it does
Gating profile strict Strict: RPM ±200, 600 ms spacing. Relaxed: RPM ±400, 400 ms; cells fed by relaxed events cap at Medium confidence
Min PW step (%) 8 Minimum relative pulse-width change to count as a step
Step window (ms) 150 The step must complete within this
Event spacing (ms) 600 Closer steps are rejected as overlapping
Response k 3 Response threshold as a multiple of the sensor's measured noise
Min response (λ) 0.005 Floor for the threshold (×14.7 for AFR channels)
Response timeout (ms) 1500 No response by then → rejected
PW floor 1.0 Pulse width below this is treated as fuel cut
Injector dead time (ms) 0 Subtracted before the step test when your PW channel includes dead time (Haltech Injector 1 On Time does)
Steady RPM / MAP / TPS bands ±200 / ±8 / ±5 The window must stay inside these
Closed-loop movement 1 % Correction movement around the step that rejects the event

Sample rate

The tool measures the wideband's effective update rate, which is often lower than the log rate (a CAN wideband updating at 10 Hz inside a 100 Hz log). Delays are interpolated between sensor updates, and the report warns when the update rate limits resolution. Logs below 10 Hz get a warning; below 4 Hz the run refuses.


Accel Enrichment

Detects tip-ins, shifts the lambda window by the measured delay, and measures the lean or rich excursion against target, binned by RPM × throttle rate. It suggests a starting correction per cell.

Channel roles

Role Required Notes
Engine speed yes
Throttle position yes
Throttle rate no A native derivative channel (TPS DOT, Throttle Position Derivative, TPS Delta) is preferred; otherwise it is computed. The detected scale is shown
Manifold pressure no MAP-rate fallback trigger when there is no TPS
Lambda / AFR yes
Lambda / AFR target no Reference for the excursion; else the pre-event baseline
ECU accel enrichment no See Additional vs absolute
Clutch state, Coolant temperature no

Additional vs absolute

If you map an ECU accel-enrichment activity channel (Haltech transient throttle, rusEFI Fuel: TPS AE Active, Speeduino/MegaSquirt Accel Enrich), the ECU was already adding fuel during the event, so the measured excursion is the residual. The suggested correction is then a multiplier on your current AE value, and the table is labelled additional. Events with no ECU activity are rejected so one cell never mixes the two kinds.

With no activity channel mapped the table is absolute: the suggestion is the whole enrichment.

For ECUs whose AE table is in ms added (MegaSquirt MS2/MS3), multiply the cell's base pulse width by the factor rather than pasting a percent.

Measures

  • Suggested correction (%) — signed: negative means the ECU is over-enriching.
  • Depth (λ) — peak deviation from reference.
  • Duration (ms) — time outside the lean band.
  • Area-based correction (%) — dose over the accel time, for ECUs that apply enrichment as a decaying dose.
  • Excursion area and delay compensation — diagnostics.

Lambda-delay compensation

If a Lambda Delay table exists in the session, each tip-in uses the matching cell's delay when that cell is Medium or High confidence. Otherwise it uses the Assumed lambda delay (ms) parameter and the event note says so. Generate the lambda delay table first for best results.


Export formats

Format Contents
CSV Value grid, sample-count grid and spread grid with # comment headers; blank cells stay blank
Copy for paste Bare tab-separated value grid for tuning software
PDF Values, counts, confidence markers (* medium, ? low) and axis labels
PNG Colored cells and grid lines only

All four honour the same blanking and unit options.

Clone this wiki locally