Category Archives: Math

Fuel Consumption

Consumption Display Correction

It is the ECU software that estimates fuel consumption as it calculates all individual injections (multiple per stroke) anyway. Based on injection quantity demand it will calculate injector drive time, taking conditions like rail pressure and fuel temperature into account. It cannot measure fuel flow directly as this would require expensive equipment – tracking fuel flow + return flow accurately, all temperature compensated.
In reality most drivers notice some trip computer offset vs. actual consumption calculated at gas station fill-up. Usually the displayed value is too optimistic. The offset may depend on driving conditions and fuel quality. Often enough it is roughly constant for an individual driver so it is still useful information.

We offer fuel consumption display correction by patching ECU software.
Simple solution is to derive a constant factor.

E.g. indicated 6.6 litre/100km vs. 7.0 actual → correction factor = 7.0 / 6.6 = 106.1 %.
After modifying and reprogramming ECU ROM, fuel consumption CAN value (ECU output, [mm³/s]) will be adjusted accordingly, to be picked up by combination meter computer. This one calculates all trip values, finally sends display control commands to center display over serial connection.

Injecting complex ECU subroutine f(torque, temp, rpm, …) and/or table data is also possible, requires measurement data in the first place, though.

DPF Active Regeneration

As you may have noticed, active DPF regeneration has a big impact on instant fuel consumption. All injection parts are included in CAN consumption value, therefore post-injections are noticeable in center display when it is set to current consumption mode.
Collected CAN data showed ~300 % actual fuel consumption at idle when active regeneration is in progress, mainly due to post-injections and intake air throttling in order to heat up the DPF, compared to normal idling with regeneration off.

Idling at 800 rpm, coolant temperature ~90°C both times:

Item Unit Normal Active Regeneration
Injection Amount mm³/st 3.3 12 1
Fuel Consumption mm³/s 88 319
cm³/s 0.088 0.319
litre/h 0.32 1.15

1) Calculated from CAN value, SSM2 item “Final Injection Amount” would indicate 4.0 mm³/st (!). Logged data suggests this SSM2 parameter matches CAN consumption value as long as post-injections are not occurring (DPF active regeneration). To get fuel consumption, best way is to parse the CAN fuel flow value instead.


Other Brands

Mazda CX-5 (SkyActiv-D 2.2)

Fuel consumption algorithm and correction works similarly.

Fuel Level


On Euro 4/5 diesel models fuel level is being measured by BIU and transmitted on CAN-bus as resistance value in ohms (Ω). The ECU parses this and does some processing. First it calculates artificial fuel level voltage using standard voltage divider formula. Voltage value is being damped because the source info fluctuates a lot with fluid moving. Then the damped result is being used for LUT (Lookup table).

Euro 6: Fuel level is being digitized by combination meter.


Did some math, using exact ROM table data (ScoobyRom, export as CSV), applying formulas, creating plots.

For above voltage divider, where:

  • Vin: Battery Voltage (assumed constant in this case)
  • R1: constant series resistor
  • R2: variable fuel level resistance (two sensors in series)
  • Vout: fuel level voltage (artificial ECU value in this case)

This way I eliminated ECU’s artificial fuel level voltage, creating direct relationship between resistance [ohm] (CAN value) and volume [litre].

ROM Tables and Calculated Results

gen1 Euro 4 (MY2008-2010)

Fuel tank capacity: 64 litres.

Fuel Tank Level, 2D table, Euro 4, ScoobyRom screenshot


gen2 Euro 5 (MY2010-2011)

Fuel tank capacity: 65 litres.

Fuel Tank Level, 2D table, gen2 Euro 5, ScoobyRom screenshot

gen3 Euro 5 (MY2012-2014) and gen4 Euro 6 (MY2015+)

Fuel tank capacity: 60 litres.

There seems to be a calibration data error as the vertical step (at 19 ↔ 23 litres) does not make sense! ECU’s LUT code can handle this but technically it is a flaw. The averaging algorithm after table lookup will mitigate this issue. Same map data was found in newer Euro 5 and Euro 6 ROMs.

Fuel Tank Level, 2D table, Euro 6, ScoobyRom screenshot

Diagnostic Trouble Codes

DTCs are triggered when (artificial) fuel level voltage is outside range. As usual it’s not that simple, many conditions may affect this, too – battery voltage, CAN state etc.

  • P0462 Fuel Level Sensor Circuit (Low Input)
  • P0463 Fuel Level Sensor Circuit (High Input)

For some reason, above codes are not publicly exposed in Euro 6 spec models, also not available in service manual DTC listing. They are processed internally however.