-
-
Notifications
You must be signed in to change notification settings - Fork 9
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:
- Load a log and pick the tool.
- Check the channel roles in the Tool Properties panel (auto-detected;
⚠marks a near-tie you should confirm). - Adjust the axes if your ECU table uses different breakpoints.
- Click Run on current file. The table appears in the center panel.
- Load more logs and click Add current file to table to fill sparse cells.
- 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.
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.
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.
- 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.
| 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 |
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.
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) |
| 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 |
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.
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.
| 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 |
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.
- 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.
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.
| 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 |
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.
Links