I will be editing and adding a lot of info for the past progress and what I have done so far, the engine was previously turbo'd and tuned on its stock internals & engine management (MS43) by myself, I recently decided to build it completely and go full standalone.

So far: Engine starts and the tuning process has started :)

I took the stock harness out of the car and modifying it to fit the ecu. Some mods to the harness include removal of SAP, Purge Valve, PCV, front & rear O2 sensors, deletion of MAP controlled thermostat, fitting a drive-by-cable throttle body instead of the DBW because of the limitation of VEMS. Still more fine tuning and additions to come.

I will remove this introduction once I feel the documentation is complete or I added enough information





  • primary trigger: HALL sensor 60-2 mounted on the block
  • secondary trigger: HALL sensor (intake cam)
  • third trigger: HALL sensor (exhaust cam)
Actually, commonly the exhaust cam must be used as secondary trigger (if the intake has multiple pulses evenly spaced it's not suitable for secondary trigger, but still suitable for third trigger). No big deal as it can be triggerlogged and than swapped easily. However VERY IMPORTANT: write in the order comment: HALL,HALL,HALL, that is thirdtrigger=HALL so you get the third trigger wired to econoseal pin (not hidden inside).
  • Above info are taken from BMW engine manuals

Note on HALL & VR sensors:

Measure resistance for each sensors (both VR and HALL typically has 3 pin. 2 pin is rare, but that is always VR). If you find 2 pins which measures same resistance in both directions (normally between 300..1400 Ohm) that is VR, otherwise HALL.

M54 triggers note: contradiction here !

Several questions arise:

Usually HALL sensors are supplied from 5V, but if 12V used for these =>

A: Keep stock wiring for trigger sensors.

Now I got a nice cranking with RPM reading & sensors are ok, but the engine just doesn't start. I am kinda not sure what to do, as I believe I revised them all, I am almost sure it is a problem with the primary trigger, I tried TDC as 54, 64. I read somewhere that the TDC is 324 after the missing tooth, which is 54 teeth. So it should work, but it didn't. I uploaded my cfg & triggerlog files at:

Your configuration looks good enough to start (i have the same engine but m54b25) but reduce dwell (1.5 msec is enough for these coils) most likely cause is firing order does not match configuration. My first cylinder to fire in sequence is 5, rotate real cylinder order right (once) and make sure the outputs match cylinder number e.g. cyl5, ignition output goes to cyl#5 coil en so on. - DB

  • I have the TDC after trigger set to 64 deg, engine runs fine, but I suspect it because the car runs really rich. Could it be set wrong and ignition occurs in real so late that some unburnt fuel gives me that rich reading???
  • Also a very silly problem: The car starts just fine, when right after start I have to give it a throttle blip and smoothen the idle with my foot for couple of second, then it stabilizes and idles just fine (rich though). And at ANY time, if I press the throttle and let it, the RPM just drops and engine stalls. I have to "support" it with the throttle and let it decrease slowly so it catches up. I played around with idle settings, and with VE with the same results...What can I do??

A: Hints provided in sharing center report, more hints - DB


Perhaps the most interesting specific engine application in BMW

The M54 is a double VANOS engine, each cam is controlled by a single solenoid that pushes in & out to varies the time. That's different from the ///M engines that use 2 seloinds/cam for an independent push/pull.

Each solenoid is connected directly to switched ign +12v & is PWMed from the DME to move it in/out.

My box came populated with 4 pFETs on P259s. I used P259 ch6&7; 36-31 & 36-30; to control the intake/exhaust solenoids respectively.

  • Q1: What are other uses for these ports???
  • A1: With some rewiring they can be used for DISA and/or Boost control solenoid.
  • Q2: I have two extra IGN ports that I used one already for the DISA, the other was planned for the boost solenoid. If I use them for the VANOS sols, where can I plug the DISA & boost??
  • A2: If you have free injector channel (and you do not want to do rewiring to use pfet outputs) you could use those.

The last resort (&probably the easiest) would be hooking the +ve supply from the harness to the GND instead as you mentioned.


The radiator fan is controlled by a final stage box mounted on the fan shroud, it has three wires coming in:

1. +12v

2. GND

3. PWM signal from the ECU, this one is confirmed to be from 10-100Hz, fan is only on between 10%-90% duty (From BMW catalogues)

Then two wires coming out to the fan motor, +12v & GND from the final stage.

We need extra software support from VEMS firmware to get coolant-temperature dependent PWM signals.

  • I hope there is an incoming update for that very specific purpose, what's needed is a CLT/PWM table to control the fan, I currently control it manually (turn it on & off & vary the PWM depending on the CLT which is not practical, and I don't want to change everything all over again to fit a normal fan with a relay, PWM is cool)

The above sentence is VERY true, and although I can drive the fan (hardware works perfect), software is handicapped, the secondary PWM DC table is a function of kPa & RPM, I've have been thinking of a way to drive the fan based on that, as to be reliable for the time being, how can I do that? Ideas?

Firmware support for the E-Fan function is being implemented, expect support for this in the next upcoming firmware release - DB


DISA is the variable intake system implemented by BMW. At low speed (up to ~3750-4000 RPM) the solenoid is energized by +12v switched to ground from the DME, at higher speeds it is released (0v) so the flap opens & the itake manifold volume increases.

Since DISA requires switched ground i would recommend using either a free injector or ignition channel, switched using one of the misc output channels to switch in the desired range - DB


Concerning the wheel speed input1 (EC18-8) & wheel speed input2 for traction control, I would like to have more info about it, specifically regarding the input signal:


BMW's IAC is a double solenoid that is PWMed @ 100Hz.


As I am now preparing to start my engine for the first time (crossing fingers, I am actually too worried, first start on a fresh built engine, with a new controller); I was thinking the last two days about the CAN abilities of VEMS. I've been searching up & down about the topic, especially the AIM protocol which looks to me as CAN protocol with a different taste. I am not sure about this.

The E46 instrument cluster receives the coolant temperature (&possibly RPM signal via CAN, is there a way to implement this? The other solution would be either to live with a coolant gauge in the red, & may be a non working RPM gauge, or trying to get more work done with an Arduino with a CAN shield, & am not that experienced in electronics.

Also the A/C unit powers up the compressor via a CAN msg to the DME which is apparently not there

Can I use the AIM output somehow?

I feel lost about this

In terms of motorsport and current automotive technology CAN is the king of data transports. VEMS should have a CAN interface where signals can be brought in via CAN and sent out via CAN. It would improve every aspect of the ecu as a whole. If anything 2014 should be the year spent implementing CAN to VEMS and letting AIM protocol go.
  • Multiple more analog/digital channels, not reliant on VEMS hardware configuration (MAP over CAN, Wheelspeeds (straight from Bosch ABS modules for instance, ABS modules also contain accelerometers), suspension, steering, strain gauges, pito tubes, Antilag switch over CAN, A/B map switch over CAN the options are endless).
  • Easy stream export of great magnitude to a CAN logger, where Vemstune can then interpret the CAN stream after downloading. VEMS CAN logger could have USB for greater download speeds. a 1MBIT stream can contain a great deal of channels and or high frequencies which is currently lacking at only 25Hz-ish (adjustable frequency for each channel to save bandwith for air temp and such).
  • Electronic dash/device compatibility , not only aftermarket but automotive as well.
  • Making VEMS 3.x more competitive and compatible as it moves forward.
  • CAN does not have to be complicated for the user interface either - Bosch RaceCon? software shows that. Manual is available on the Bosch Motorsport website.

Electronic Throttle

I am still not yet done with the build, meanwhile, I was very happy to see the new firmware 1.2.14 implementing ETC. I updated the v3 to 1.2.15 and here is a plan for the ETC:

In BMW the electronic throttle body is called EDK, and the pedal module is PWG

EDK: 6-pin module:

1. TPS signal 1 BR/VI: 0.5v @0% to 4.5v @100%

2. Power BR/WS: +5v??

3. Motor Drive 1 GR/WS

4. TPS singal 2 BR/BL: 4.5v @0% to 0.5v @100%

5. Motor Drive 2 BR/SW


PWG: 6-pin module:

1. GND

2. GND

3. Power 2 GE/GN: +5v??

4. Signal 1 WS: 0.5v to 4.5v

5. Power 1 GE: +5v??

6. Signal 2 WS/GN: 0.5v to 2v

Plan & questions: