Electronic Fuel Injection

Engine Control Unit, May-2015

I’ve had enough of SU carburettors! They work great on standard engines but when you’re into modifying as I am, they become a real hinderance as they can’t be tuned properly without changing the metering needle and to select the right needle, you really need a rolling road session. So decided to fit a fuel injection system to my Mini 1275GT (which has a 1098 engine at the moment) that can be adapted and tuned without the expense of a rolling road. Having checked the various options, I baulked at the cost of commercial ECU’s. When I investigated what an ECU needs to do, it didn’t seem to be that difficult and with cheap, capable sensors and microcontrollers available nowadays, I decided to design my own.


In a fuel injection system, an electrically operated injector is used to meter a precise amount of fuel into the engine intake manifold to achieve optimum combustion. The amount of fuel metered is controlled by the width of an electrical pulse fed to the injector’s internal solenoid valve. i.e. Fuel flows from the injector when the electrical current is on; a computer is used to calculate the pulse width required to provide the correct amount of fuel.

To determine the amount fuel required on each stroke, we know that the ideal air-fuel mixture for efficient combustion is approximately 14:1 Air-Fuel Ratio (AFR). That is 14 parts air, by mass, to one part fuel.

So, for one stroke in one combustion chamber, with full open throttle and assuming the induction is 100% efficient, we can calculate the amount of fuel required and the corresponding pulse width:

Injector type, Bosch 0280 150 682 (as used in Classic Mini SPi)

Flow rate, R @normal operating pressure (1 Bar) = 38.2 lb/hour (0.0106 lbs/second)

Air density @ mean sea level = 1.225 Kg / m3 (0.000044256 lbs / cubic inch)

For a classic Mini 1098cc A-series engine: Cylinder Capacity = 274 cc (16.7 cubic inches)

Air mass per stroke, Ma = Air Density * Cylinder Capacity = 0.000044256 * 16.7 = 0.00074 lbs

Fuel Mass Required, Mf @ 14:1 AFR = Ma / 14 = 0.00074 / 14 = 0.0000529 lbs

Injector pulse width = 1000 * Mf / R = 1000 * 0.0000529 / 0.0106 = 5.0 milli-seconds. This is known as the Required Fuel parameter.

To calculate how much fuel is needed on each stroke, we need to measure the mass of air drawn into the cylinder. The air mass is directly proportional to the Load placed on the engine and the Load can be inferred from either the throttle position or the pressure in the inlet manifold. In fact, a Manifold Absolute Pressure (MAP) sensor is commonly used to determine load (and thus air mass), and that’s what I’ve used in this design.

As the engine load increases, MAP increases to near its maximum value of 100KPa (for a normally aspirated engine). 100KPa, or 1 Bar, is the “standard atmosphere”, i.e. mean atmospheric pressure at mean sea level. If the engine is running at part load, the pressure in the intake is reduced (i.e. vacuum increased), so that for a MAP value of, for example, 50KPa we can infer that half of the air mass identified in the Required Fuel calculation is being induced so the pulse width on this stroke should be 50% of the Required Fuel value. Therefore, the basic pulse width (PW) equation is as follows:

PW = Required Fuel * MAP / 100

If it were that simple, carburettors would have been banished decades ago! But sadly, there are other factors to consider.

The flow through an engine is not linear: at each combination of load vs RPM, and depending on the intake configuration, combustion chamber shape, etc, the flow through the engine has a corresponding efficiency, known as Volumetric Efficiency (VE).

The Volumetric Efficiency for an engine is usually defined in tabular form, with rows & columns representing Load and RPM bands. Each cell of the table defines the Volumetric Efficiency for the particular RPM / Load combination. In the example table below, Load is represented by MAP, so the Load units are KPa:

The VE value is a percentage representing the fraction of the maximum volume of air that can be drawn into the cylinder in each stroke. The appropriate VE value for each cell is normally determined through a rolling road session and is chosen to provide the required Air-Fuel Ratio.

The effect of pressing accelerator can result in a large increase in airflow which, coupled with lag in the MAP reading and other delays due to system latency, it can mean that fuel delivery lags the increase in airflow, causing the engine to hesitate. There needs be an acceleration compensation term analogous to the acceleration pump found in some carburettors. It is normal to use the rate-of-change from the throttle position sensor (TPS) as a basis for the acceleration compensation function.

When an engine is cold, the injected fuel can condense on the cold manifold wall and is lost from combustion, thus weakening the mixture. It is therefore necessary to provide cold engine enrichment in the same way that a mechanical choke does on a carburettor.

The last major compensation term (there are others) is the injector latency – i.e. the time it takes for an injector to open after receiving the injector pulse.

The basic pulse width calculation becomes:

PW = Required Fuel * MAP / 100 * VE { MAP, RPM } / 100 * Accel’n Compensation * Temp. Compensation + Injector Latency


There was a single-point injection (SPi) version of the Mini produced from 1991 to 1996, so the easiest route to fuel injection was to procure the SPi’s Throttle Body Injector (TBI) and manifold. There’s plenty available on Ebay and I managed to find a TBI plus manifold easily. Here’s the TBI stripped and cleaned:

It’s a Bosch unit similar to those fitted to the VW Polo and other vehicles. It comes with a Throttle Position Sensor (TPS) and stepper motor to control idle speed. Here’s some pertinant data:


Bosch injector (0280 150 682) and fuel regulator.
14mm x 1.5mm thread fuel couplings.
Injector impedance 1.3 Ohms.
Opens @ 0.5A.
Junior Power Timer 2 way connector.
Idle Control Stepper MotorDrives eccentric cam that operates a pushrod to achieve small throttle opening.
Airpax (Premotec) 9904 112 31833 (JZX.3062 2592) motor.
Unipolar design. Believed to be 7.5% per step.
Impedance Common-Winding #N ~16 Ohms.
Operates at 5V @ 0.4A current draw (static).
Econoseal 6 way connector.
Stepper Motor Connections
Throttle Position Sensor6.3K Ohms potentiometer. 
Junior Power Timer 3 way connector.


The ECU electronics need to:

  • Drive the injector
  • Drive the idle stepper motor
  • Read the following sensors: TPS, MAP, Lambda, Engine Temperature
  • Measure crankshaft position

The electronic components needed to implement above are fairly straight forward and compatible with automotive applications, i.e.

  • MPX4115 Manifold Absolute Pressure Sensor
  • LM1815 Adaptive Variable Reluctance Amplifier – for interfacing to a standard VR crankshaft position sensor
  • LM35 Precision Thermometer

Other inputs, e.g. for a standard Negative Thermal Coefficient (NTC) temperature sensor (for coolant temp) are conditioned before feeding directly into the microcontroller’s analogue inputs.

Actuator outputs for the stepper motor and injector are implemented using power MOSFETs. There’s also a stabilised supply for the injector to avoid variations in the car’s voltage affecting the fuel metering.

The microcontroller is the excellent Arduino Uno.

Here’s the prototype in a suitable ally box:

With Windows software written to provide an interface to the ECU and the ECU’s initial firmware developed, the system was tested on the bench to measure pulse widths, timing etc.

Here’s the voltage at the injector, which is fairly typical (10x probe on the ‘scope):

Note that the correct technique for driving this type of injector is “Peak & Hold” – i.e. a large initial current to open the valve, then a reduced current to hold it open. I didn’t realise this until later, so I’m applying the full current for the duration of the pulse. This should still work fine although the injector is being worked a little harder than it needs to be.

With TBI, manifold and ECU fitted to the Mini, and with a temporary fuel rig, the first trial runs were successful as shown in this short video. The engine started easily and ran smoothly apart from a rattly fan!:

With the basic operation verified, it was time to update the car’s fuel system and electrics to accomodate the EFi system:

Fuel return soldered into standard fuel tank:

Fuel pump and filter fitted in boot (the pump has since been moved under the boot floor mounted on rubber isolators ’cause its a noisy little bugger!):

And the engine bay, sans air box & filter:

There’s also an inertia switch fitted to cut the fuel in the event of a collision.


For tuning, I developed a set of Windows laptop tools to log and monitor various parameter, most importantly Lambda, RPM, Manifold Absolute Pressure, Throttle Position and injector Pulse Width:

I started off with an arbitrary map with all cells set at 75% IIRC. Initial tuning was aimed at getting it to idle steadily and rev up without stalling and Lambda readings less than 600 milli-volts wherever possible.

Once this was achieved, a few trips round the block allowed a rough tuning at medium RPM and loads.  Then it was time for a few longer runs on a long straight road where I could hold the car steady in various combinations – high RPM – low load, high RPM – high load, etc, etc. This provided maps of Lambda readings in each VE Map cell, so that you could easily see where the rich and lean spots were and adjust the VE Map accordingly.

It was difficult to get repeatable results however, and this made tuning a bit more hit-and-miss than expected. This is partly due to the coarseness of the narrow band Lambda sensor and difficulty in holding a steady RPM / load long enough to get a sufficient number of samples. This really illustrates why a rolling road is essential for precise tuning. I also need to investigate a wideband Lambda sensor in a future update.

Nevertheless, the car now starts easily from cold, without choke obviously, idles consistently, accelerates through the gears to full RPM with no hesitation. Also, the plugs are a nice sandy colour, evidence that the fuel/air mixture is close to ideal: