Sensor Reference
Acronym | Sensor |
ATS 80x05_intake_air_temp |
Air Temperature Sensor Located under the air filter. Measures the air temperature. |
CTS 80x03_coolant_temp |
Coolant Temperature Sensor Located under the injection unit. Measures the coolant (engine) temperature. |
CAS (CPS) 80x19_crankshaft_position_sensor |
Crank Angle Sensor (Crankshaft Position Sensor) Located at the front / side of the engine. Measures the position of the engine relative to TDC and is used to calculate the RPM. |
MAP 80x07_map_kpa |
Manifold Absolute Pressure Sensor Located in the ECU, connects via vacuum pipes and fuel trap from the rear of the inlet manifold. Measures the engine load |
TPS 80x09_throttle_pot |
Throttle Potentiometer Sensor Located right of the air filter connected to throttle linkage. Measures the throttle position |
IAC(V) 80x12_iac_position |
Idle Air Control (Valve) Controls the throttle / stepper motor to adjust air : fuel ratio when idling and smooth transition when lifting off the throttle. |
MemsFCR Log File Format and Applied Calculations to Raw Data
Metric | Description | Calculations Applied |
#time | event timestamp hh:mm:ss.sss | |
80×01-02_engine-rpm | The rotational speed of the engine calculated by the MEMS ECU using the crankshaft sensor. Faults in the crankshaft sensor or associated wiring may be indicated if this display reads 0 during engine cranking. | |
80x03_coolant_temp | This shows the coolant temperature as measured by the ECU. If the sensor is open circuit, a default value of about 60C will be displayed. During engine warm up, the value should rise smoothly from ambient to approximately 90C. Sensor faults may cause several symptoms including poor starting, fast idle speed, poor fuel consumption and cooling fans running continuously. | value – 55 |
80x04_ambient_temp | not used by the ECU, always returns 255 | value – 55 = 200 |
80x05_intake_air_temp | This shows the temperature measured by the ECU using the inlet air temperature sensor (if fitted). If the sensor is open circuit, then a fixed default value will be displayed. The inlet air temperature is used by the ECU to retard the ignition timing to avoid knock and trim the fuelling when hot. If the sensor is not operating correctly the engine performance may be impaired slightly. | value – 55 |
80x06_fuel_temp | not used by the ECU, always returns 255 | value – 55 = 200 |
80x07_map_kpa | Shows the pressure measure by the internal MEMS air pressure sensor. This value should show atmospheric pressure of 100 KPa when the engine is stopped and a lower value between 25 – 40 KPa during engine idle conditions. Very high values may indicate problems with the sensor inside the MEMS or more likely a blocked or disconnected vacuum pipe. Moderately raised values may indicate mechanical problems with the engine. | |
80x08_battery_voltage | This shows the voltage of the vehicle supply measured internally by the ECU. Large errors in this measurement will lead to possible poor starting and errors in idle CO. | value / 10 |
80x09_throttle_pot | This value shows the signal received by the ECU from the Throttle Position Sensor (Throttle Pot). The value is displayed in bits and has a range from 0(closed) to 255(open). The full range of values will not be seen in practice. | value * 0.02 |
80x0A_idle_switch | shows the state of the throttle switch, fitted on early vehicles. On systems without an actual throttle switch the value shown indicates whether the MEMS ECU has calculated that the throttle is closed by using the throttle position sensor. If the switch shows ‘ON’ when the throttle is closed, then the vehicle will not idle correctly and the closed throttle position may need to be reset. This procedure is performed by fully depressing and releasing the accelerator pedal 5 times within 10 or less seconds of turning on the ignition and then waiting 20 seconds. | |
80x0B_uk1 | unknown value | |
80x0C_park_neutral_switch | This shows the state of the park neutral switch as measured by the MEMS ECU. This switch is used to improve the quality of engine idle speed control on automatic or CVT (Constantly Variable Transmission) gearbox vehicles. A fault with this switch will cause the idle speed to dip or rise suddenly when the gear selection is changed between neutral and drive. This display will not work on manual gearbox vehicles. | true / false |
80x0D-0E_fault_codes | ECU fault codes:<br>Coolant temp sensor fault (Code 1)<br>Inlet air temp sensor fault (Code 2)<br>Fuel pump circuit fault (Code 10)<br>Throttle pot circuit fault (Code 16) | |
80x0F_idle_set_point | adjusts the idle rpm by the value shown. Adjusting idle speed will modify this value | |
80x10_idle_hot | This is the number of IACV steps from fully closed (0) which the ECU has learned as the correct position to maintain the target idle speed with a fully warmed up engine. If this value is outside the range 10 – 50 steps, then this is an indication of a possible fault condition or poor adjustment. This value can be forced for a short time using the function in the settings section. | value – 35 |
80x11_uk2 | unknown value | |
80x12_iac_position | Inlet Air Control valve (IACV) position (relates to expected Stepper Motor position) | |
80×13-14_idle_error | This is the current difference between the target idle speed set by the MEMS ECU and the actual engine speed. A value of more than 100 RPM indicates that the ECU is not in control of the idle speed. This indicates a possible fault condition. A quick addition of this value and the current engine RPM will also tell what the value is of the ECU’s target Idle Speed. | |
80x15_ignition_advance_offset | Shows the value of the service ignition offset currently being used by the MEMS ECU. This is a special service adjustment for countries which use low octane fuel. The value is set and can be cleared by using the MemsFCR | |
80x16_ignition_advance | This is a facility which is built into the MEMS ECU to overcome some situations during the service life of a vehicle where it might be wished to eradicate a problem such as a low octane fuel being constantly used or engine wear by slightly advancing the ignition timing. the idle speed of the engine. The function can be removed by resetting the adaptive values. | (value / 2) – 24 |
80×17-18_coil_time | This is the time for the ignition coil to charge up to its specified current, as measured by the MEMS ECU. With a battery voltage of about 14V, this value should be about 2-3mS. A high value for coil charge time may indicate a problem with the ignition coil primary circuit. | value * 0.002 |
80x19_crankshaft_position_sensor | position of the crankshaft from the position sensor (CPS) | |
80x1A_uk4 | unknown value | |
80x1B_uk5 | unknown value | |
7dx01_ignition_switch | status of the ignition switch | true / false |
7dx02_throttle_angle | shows the position of the throttle disc obtained from the MEMS ECU using the throttle potentiometer. This value should change from a low value to a high value as the throttle pedal is depressed. | value * 6 / 10 |
7dx03_uk6 | unknown value | |
7dx04_air_fuel_ratio | the current air:fuel ratio | value / 10 |
7dx05_dtc2 | diagnostic trouble code – unknown codes | |
7dx06_lambda_voltage | This shows the voltage across the oxygen sensor as read by the MEMS ECU. Once the engine is fully warm, during most idle and driving conditions, this voltage will switch rapidly between a value between 0.0v-0.2v to a value between 0.7v and 1.0v. The sensor detects the presence or absence of oxygen in the exhaust gas. When the exhaust gas has oxygen present the ECU will read a low voltage. | value * 5 |
7dx07_lambda_sensor_frequency | not used by the ECU, value reads 255 | |
7dx08_lambda_sensor_dutycycle | not used by the ECU, value reads 255 | |
7dx09_lambda_sensor_status | ECU O2 circuit status, 1 active | |
7dx0A_closed_loop | This shows whether the fuelling is being controlled using feedback from the oxygen sensors. A displayed value of 1 indicates that closed loop fuelling is active, a displayed value of 0 indicates fuelling open loop. On a fully warm vehicle, Loop Status should indicate closed loop under most driving and idling conditions. | |
7dx0B_long_term_fuel_trim | long term fuel trim (LTFT) displays ECU value to adjust fuelling. value of 128 = 0 | value – 128 |
7dx0C_short_term_fuel_trim | short term fuel trim (STFT) displays ECU value to adjust fuelling | |
7dx0D_carbon_canister_dutycycle | not used by ECU, value reads 0 | |
7dx0E_dtc3 | diagnostic trouble code – unknown codes | |
7dx0F_idle_base_pos | This is the number of steps from 0 which the ECU will use as guide for starting idle speed control during engine warm up. The value will start at quite a high value (>100 steps) on a very cold engine and fall to < 50 steps on a fully warm engine. A high value on a fully warm engine or a low value on a cold engine will cause poor idle speed control. Idle run line position is calculated by the ECU using the engine coolant temperature sensor. | |
7dx10_uk7 | unknown value | |
7dx11_dtc4 | diagnostic trouble code – unknown codes | |
7dx12_ignition_advance2 | ignition advance | value – 48 |
7dx13_idle_speed_offset | This is the current difference between the target idle speed set by the MEMS ECU and the actual engine speed. A value of more than 100 RPM indicates that the ECU is not in control of the idle speed. This indicates a possible fault condition. A quick addition of this value and the current engine RPM will also tell what the value is of the ECU’s target Idle Speed. | |
7dx14_idle_error2 | idle error | |
7dx14-15_uk10 | unknown value | |
7dx16_dtc5 | diagnostic trouble code – unknown codes | |
7dx17_uk11 | unknown value | |
7dx18_uk12 | unknown value | |
7dx19_uk13 | unknown value | |
7dx1A_uk14 | unknown value | |
7dx1B_uk15 | unknown value | |
7dx1C_uk16 | unknown value | |
7dx1D_uk17 | unknown value | |
7dx1E_uk18 | unknown value | |
7dx1F_jack_count | On systems using a throttle body where the idle air is controlled by a stepper motor which directly acts on the throttle disk (normally metal inlet manifold), the count indicates the number of times the ECU has had to re-learn the relationship between the stepper position and the throttle position. If this count is high or increments each time the ignition is turned off, then there may be a problem with the stepper motor, throttle cable adjustment or the throttle pot. On systems using a plastic throttle body/manifold, the count is a warning that the MEMS ECU has never seen the throttle fully closed. The count is increased for each journey with no closed throttle, indicating a throttle adjustment problem. | |
0x7d_raw | hexadecimal response from the ECU for command 0x7D | |
0x80_raw | hexadecimal response from the ECU for command 0x80 | |
engine_running | engine is running | true / false |
warming | engine is warming up to operating temperature | true / false |
at_operating_temp | engine is at operating temperature | true / false |
engine_idle | engine is idle | true / false |
idle_fault | hot or cold idle speed or idle offset is outside expected parameters | true / false |
idle_speed_fault | cold idle speed is outside expected parameters | true / false |
idle_error_fault | idle offset is outside expected parameters | true / false |
idle_hot_fault | hot idle speed is outside expected parameters | true / false |
cruising | rpm is stable but not idle; engine is cruising (differentiates from idle) | true / false |
closed_loop | ECU is operating in closed loop (using lambda to determine air:fuel ratio) | true / false |
closed_loop_expected | expecting the ECU to be in closed loop | true / false |
closed_loop_fault | closed loop fault | true / false |
throttle_active | the throttle pedal is depressed | true / false |
map_fault | MAP readings is outside expected parameters | true / false |
vacuum_fault | MAP and Air:Fuel ratio are outside expected parameters indicating a possible vacuum pipe fault | true / false |
iac_fault | IAC position invalid if the idle offset exceeds the max error, yet the IAC Position remains at 0 | true / false |
iac_range_fault | IAC readings outside expected parameters | true / false |
iac_jack_fault | high jack count indicating possible problem with the stepper motor, throttle cable adjustment or the throttle pot | true / false |
o2_system_fault | detected a potential o2 system fault | true / false |
lambda_range_fault | lambda sensor readings are outside expected parameters | true / false |
lambda_oscillation_fault | lambda sensor not oscillating as expected | true / false |
thermostat_fault | coolant temperature changes over time indicate thermostat fault (could also be a CPS fault) | true / false |
crankshaft_sensor_fault | crankshaft position sensor (CPS) reading is outside expected parameters | true / false |
coil_fault | coil is outside expected parameters | true / false |
MemsFCR <-> ECU Initialisation Sequence
sequenceDiagram
autonumber
Note over MemsFCR, ECU: Initialisation
MemsFCR ->>+ ECU: Connect
ECU ->>- MemsFCR: Connected
MemsFCR ->>+ ECU: 0xCA
Note right of ECU: Initialise Command A
ECU ->>- MemsFCR: 0xCA
MemsFCR ->>+ ECU: 0x75
Note right of ECU: Initialise Command B
ECU ->>- MemsFCR: 0x75
MemsFCR ->>+ ECU: 0xF4
Note right of ECU: Heartbeat
ECU ->>- MemsFCR: 0xF4
MemsFCR ->>+ ECU: 0xD0
Note right of ECU: ECU ID
ECU ->>- MemsFCR: 0x0D 0x99 0x99 0x99 0x99
Note over MemsFCR, ECU: Request Dataframe Loop
loop Every second
activate MemsFCR
MemsFCR ->>+ ECU: 0x7D
Note right of ECU: Dataframe 0x7D
ECU ->>- MemsFCR: 0x7D XX XX XX.. XX
MemsFCR ->>+ ECU: 0x80
Note right of ECU: Dataframe 0x80
ECU ->>- MemsFCR: 0x80 XX XX XX.. XX
deactivate MemsFCR
end
ECU Faults
graph LR
FaultCodesDTC0("80x0d-0e_fault_codes (0x0d byte)") --> |& b00000001|CTSFault(["CTS_fault = true"])
FaultCodesDTC0 --> |& b00000010|ATSFault(["ATS_fault = true"])
FaultCodesDTC1("80x0d-0e_fault_codes (0x0e byte)") --> |& b00000010|FuelPumpFault(["fuel_pump_circuit_fault = true"])
FaultCodesDTC1 --> |& b01000000|TPSFault(["TPS_circuit_fault = true"])
Operational Status
Is Engine Running?
If we have revs, the engine must be running 🙂
The engine start time is recorded to determine when the operating temperature is expected to be reached and when the O2 system should activate.
flowchart LR
Engine("80x01-02_engine-rpm (RPM) > 0") --> EngineRunning(["engine_running = true"])
EngineRunning --> EngineStartTime(["record engine_start_time"])
Is Engine at Operating Temperature?
Used in the diagnostics to determine if the engine has reached the operating temperature.
flowchart LR
Temp{{"80x03_coolant_temp (CTS) > 80°C"}} -- "false" ---> EngineWarming(["engine_warming = true"])
Temp -- "true" ---> EngineWarm(["engine_at_operating_temp = true"])
Is Engine at Idle?
RPM can’t be used as a reliable indicator of idle so the throttle is used to determine whether the engine is at idle.
flowchart LR
Running(engine_running) --> Metric
Metric("7dx02_throttle_angle * 6 / 10 <= 14°") --> Result([engine_idle = true])
Is Throttle Active?
If the RPM is above any cold start value OR the throttle is depressed (14° is pretty conservative) then the throttle is active.
flowchart LR
Engine("80x01-02_engine-rpm (RPM)> 1300") --> ThrottleActive(["throttle_active = true"])
Throttle("7dx02_throttle_angle * 6 / 10 > 14°") --> ThrottleActive
Is Closed Loop Mode Active?
The ECU controls the air : fuel mix based on the readings from the primary sensors, lambda, MAP and temperature.
If the ECU determines these systems are working correctly it will enter closed loop mode. The car is unlikely to pass the emissions tests if it cannot enter closed loop mode.
flowchart LR
Temp("7dx0A_closed_loop > 0") --> ClosedLoop(["closed_loop = true"])
Operational Faults
Is Battery Voltage too low?
The battery voltage is important for the sensors to provide correct values. A low battery can be the cause of a number of phantom faults.ß
flowchart LR
Metric("80x08_battery_voltage < 13V") --> Result(["battery_low = true"])
Is Coil faulty?
The time for the ignition coil to charge up to its specified current, as measured by the MEMS ECU. With a battery voltage of about 14V, this value should be about 2-3mS.
A high value for coil charge time may indicate a problem with the ignition coil primary circuit. A failing CAS sensor can also cause the coil time to increase.
flowchart LR
Running("engine_running") --> BatteryCheck
BatteryCheck("battery_low = false") --> Metric
Metric("80x17-18_coil_time * 0.0002 > 4ms") --> Result(["coil_fault = true"])
Is MAP too high?
The MAP sensor should be under 45kPA (ideally 35kPA) when the engine is at idle. A high value indicates a vacuum fault.
flowchart LR
Running("engine_idle") --> Metric
Metric("80x07_map_kpa > 45") --> Result(["map_fault = true"])
Engine Idle fault?
This Idle Base Position is the number of steps from 0 which the ECU will use as guide for starting idle speed control during engine warm up.
The value will start at quite a high value (>100 steps) on a very cold engine and fall to < 50 steps on a fully warm engine.
A high value on a fully warm engine or a low value on a cold engine will cause poor idle speed control.
Idle position is calculated by the ECU using the engine coolant temperature sensor.
flowchart LR
Running("engine_idle = true") --> EngineAtTemp{{"engine_at_operating_temp"}}
EngineAtTemp -- "true" ---> MetricHot
EngineAtTemp -- "false" ---> MetricCold
MetricHot("7dx0F_idle_base_pos > 55") --> Result(["idle_fault = true"])
MetricCold("7dx0F_idle_base_pos < 45") --> Result(["idle_fault = true"])
Engine Hot Idle fault?
The Hot Idle is the number of IACV steps from fully closed (0) which the ECU has learned as the correct position to maintain the target idle speed with a fully warmed up engine.
If this value is outside the range 10 – 50 steps, then this is an indication of a possible fault condition or poor adjustment.
flowchart LR
Running("engine_idle") --> PreCheck
PreCheck("engine_at_operating_temp = true") --> EngineAtTemp
EngineAtTemp ---> MetricLow
EngineAtTemp ---> MetricHigh
MetricLow("80x10_idle_hot < 10") ---> Result(["idle_hot_fault = true"])
MetricHigh("80x10_idle_hot > 55") ---> Result(["idle_hot_fault = true"])
Idle Air Control (IAC) Fault?
The stepper motor adjusts the idle air control valve (IACV) and is used to control engine idle speed and air flow from cold start up
A high number of steps indicates that the ECU is attempting to close the stepper or reduce the airflow a low number would indicate the inability to increase airflow
The position of the IACV stepper motor as calculated by the ECU. The ECU has no method of actually measuring this position but instead works it out by remembering how may steps it has moved the stepper since the last time the ignition was switched off. If a stepper motor fault exists, this number will be incorrect. This value will normally be changing during idle condition as the ECU makes minor changes to the idle speed. A value of 0 during idle conditions indicates a fault condition or poor adjustment, as does a very high value.
flowchart LR
Running("engine_idle") --> PreCheck
PreCheck("7dx13_idle_speed_offset > 50") --> Metric
Metric("80x12_iac_position > 0") --> Result(["iac_fault = true"])
Vacuum Pipe Fault?
The bane of all Mini Spi owners, the vacuum pipe system to read the manifold absolute pressure is fragile and prone to split or disconnected pipes.
The MAP values are essential for the ECU to determine the load on the engine and have a significant impact on performance and even basic idling.
When the engine is at idle, the MAP is expected to be less than 45kPa, in fact it should be around 35kPA. Higher than this will be due to a vacuum fault.
flowchart LR
Running("engine_idle") --> Metric
Metric("80x07_map_kpa > 45") --> Result(["vacuum_fault = true"])
Is Jack Count too high?
On systems using a throttle body where the idle air is controlled by a stepper motor which directly acts on the throttle disk (normally metal inlet manifold), the count indicates the number of times the ECU has had to re-learn the relationship between the stepper position and the throttle position. If this count is high or increments each time the ignition is turned off, then there may be a problem with the stepper motor, throttle cable adjustment or the throttle pot. On systems using a plastic throttle body/manifold, the count is a warning that the MEMS ECU has never seen the throttle fully closed. The count is increased for each journey with no closed throttle, indicating a throttle adjustment problem.
This "fault" is more of an indication that the jack count is higher than expected and is worth monitoring this value.
flowchart LR
Running("engine_idle") --> Metric
Metric("7dx1F_jack_count > 50") --> Result(["iac_jack_fault = true"])
Is Crankshaft Sensor (CPS/CAS) faulty?
The crankshaft sensor is used to determine the position of the engine so the ECU can manage the timing of the injection of fuel and ignition.
A failing CAS will show as 0 entries or high spikes in the graph trace. When the ECU fails to get a CAS reading, it will suspend firing the ignitions (this will show as a high coil time)
flowchart LR
Metric("80x19_crankshaft_position_sensor is 0") --> Result(["crankshaft_sensor_fault = true"])
Are Lambda readings out of range?
When the engine is running the lambda sensor voltage is expected to oscillate low to high rapidly.
If the readings are above 900mV or below 10mV this indicates a failing lambda sensor.
flowchart LR
Running("engine_running") --> MetricLow
Running ---> MetricHigh
MetricLow("7dx06_lambda_voltage < 10") ---> Result(["lambda_range_fault = true"])
MetricHigh("7dx06_lambda_voltage > 900") ---> Result(["lambda_range_fault = true"])
Is Lambda Sensor faulty?
When the engine is started the lambda sensor goes through a warm-up cycle.
The lambda has a build in heater and the ECU activates this via a relay.
The lambda should start oscillating from low to high volts after around 90s.
A failure in this activity will cause the ECU to change the lambda status to 0 and run in open loop mode. This is a fault condition.
flowchart LR
Running("engine_running") --> PreCheck
PreCheck("time since engine_start_time > 90s") --> IsOscillating
subgraph Is Lambda Sensor oscillating?
IsOscillating("standard deviation of 7dx06_lambda_voltage < 100") --> Result(["lambda_oscillation_fault = true"])
end
Result --> Metric
Metric{{"lambda_oscillation_fault is false"}} --> LambdaResult(["lambda_fault = true"])
Is O2 System faulty?
flowchart LR
Metric("7dx09_lambda_sensor_status = 0") --> Result(["o2_system_fault = true"])
Is Lambda Sensor oscillating?
The lambda sensor should oscillate low to high voltage at a high frequency.
A sample is used for calculating the standard deviation, which is used to determine whether the lambda is working as expected.
flowchart LR
Running("engine_running") --> Metric
Metric("standard deviation of 7dx06_lambda_voltage < 100") --> Result(["lambda_oscillation_fault = true"])
Is Thermostat faulty?
The coolant temperature is expected to rise at a rate of around 11s per degree.
If the coolant temperature hasn’t reached operating temperature (80°C) by that time, this indicates the thermostat could be faulty.
flowchart LR
Running("engine_running") --> Step1
subgraph Determine if the coolant temperature has reached operating temp as expected
Step1("degrees_to_warm = 80°C - 80x03_coolant_temp") --> Step2
Step2("expected_time_to_warm = 11s * degrees_to_warm") --> Step3
Step3("current_time > expected_time_to_warm") --> Step4
end
Step4("80x03_coolant_temp < 80°C") --> Result(["thermostat_fault = true"])
Is Idle Speed faulty?
Idle speed deviation indicates how far away the IAC is from the idle target
Idle base position indicates the target for IAC position
A mean value of more than 100 indicates that the ECU is not in control of the idle speed and indicates a possible fault condition.
flowchart LR
Running("engine_running") --> Metric
Metric("mean of 7dx0F_idle_base_pos > 100") --> Result(["idle_speed_fault = true"])