On Euro 4/5 diesel models fuel level is being measured by BIU and sent onto CAN-bus as sensor 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.
Tables (2D Maps)
So far all Euro 4 diesel ROMs contain this table:
From Euro 5 ROMs, slightly different:
Did some work using GNU Octave – import table data (ScoobyRom export as CSV), applying formulas, plot (gnuplot backend) – all on GNU/Linux of course. Btw, Octave comes with built-in interpolation functions.
“The Octave language is quite similar to Matlab so that most programs are easily portable.”
Example Octave formula:
function retval = FuelLevelVoltage (R1, R2, Vin) retval = Vin * R2 / (R1 + R2) endfunction
For above voltage divider, where:
- Vin: Battery Voltage (assumed const in this case)
- R1: const 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].
Results: volume [litre] vs. resistance [ohm]
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)