Why would anyone want VEMS in a Maserati Biturbo:

  • When it has injection, often it is without Lambda sond at all. This is the case for models up to later than 1990.
  • Ignition and injection are separate and don't "talk to each other". Knock detection/boost control is only in the ignition unit and cannot affect injection.
  • The special 2-level distributor and rotor can cost as much as a complete VEMS system!
  • The original just reads on/off status from aircon. It cannot tell it to not run the compressor during acceleration. VEMS can do this. A misc-output can be configured to disable the AC compressor at, say RPM >2000 and MAP > 95kPa and TPS>95% (or whatever you like). Maybe you want to keep it disabled for a minimum time (say 30sec) because the AC might not like frequent on/off (this needs a bit new code).
  • The old carburetted engines destroy the gaskets in the carb, and are notoriously difficult to get to run properly. The carb is placed inside the plenum under turbo pressure and the heat soak makes for all kind of problems. The changes to the manifold to install injectors is fairly simple. And the MABC can be thrown out as VEMS can handle the waste gate control. MABC is well known for lowering boost if you have the slightest valve clatter or piston slap. (It's not timed.) VEMS is timed to measure knock at the time when knock would happen and so less sensitive to engine noise.

It has been established that the Maserati V6 engines are odd fire.

An hopefully easy to understand example in engine degrees:

0 +90

90 +150

240 +90

330 +150

480 +90

570 +150


If we remove 360deg from all values >= 360 we get:








If we interlace them and apply the 90/150 degree rule to the table:


90 (90-90=0)

120 ignore

210 ignore

240 (240-150=90)

330 (330-90=240)

0 ignore

90 ignore

120 (360+120-150=330)

210 (210-120=90)

240 ignore

330 ignore

0 (360+0-150=210)

90 (90-90=0)

120 ignore

210 ignore

240 (240-150=90)

330 (330-90=240)

0 ignore

90 ignore

120 (360+120-150=330)

210 (210-120=90)

240 ignore

330 ignore

0 (360+0-150=210)

90 (90-90=0)

We find that we want to ignore two triggs and then act on two triggs. We also see the 30/90 pattern in the triggerwheel that can be used to update rpm. This definitely can be done without stabilizing the trunk code, applying some code in multitooth.c.

Some thinking also show how the Buick odd fire engine can be run with wastefire! As usual with waste fire grouping we take the Buick fire order:

1-6-5-4-3-2, write on two rows:



The columns are grouped on each wastespark coil. Adding 90+150+90give us 330 degrees betweeen #1 and #4 TDC's and that means that #4 is 30 deg BTDC in it's exhaust stroke when #1 is in compression TDC. That should be ok. Counting the other way around starting from #4 compression TDC give 150+90+150=390 which would indicate that #1 is 30 degrees into it's intake stroke when #4 is at compression TDC. I get a feeling that late timing might be bad as if we were to fire at TDC the #1 cylinder would start to fill up with fresh mixture!

Here is a link to a place showing the engine, also sliced (scroll down). The indexer pins on the pulley can be seen clearly. It corresponds with my estimate that the 1st of the 2 pins are almost at the same angle as the frontmost crank throw. The pickup is straight below the pulley.

I have a .GIF showing graphically the different events on a timeline. The accuracy is believed to be +-10 degrees.


State engine, 12 states:

  • Start timing is only done after phasing is successful (State > 3).
  • Init: Attempt to phase starts in state 1 and remain there until cam event.
  • Odd states lasts 90 degrees. Cam event (where applicable) is appx. 50 degrees after transitition into state.
  • Even states lasts 30 degrees.
  • TDC for the cyl where spark timer starts is appx. 90-100 degrees (S1,5,9) or 120-130 degrees (S3,7,10).
  • Cam event in any state except 1 and 3 is a HW error. IAW resets, we may just phase again?
  • Spark event is when spark timer expires.
  • Knock amp is turned on and sampled appx. 30 degrees into states 1, 5 and 9 and immediately after entry to states 3, 7 and 10. But any knock detected is caused by cylinder fired in state X-2.
  • Actual firing initiated in S3, 7 and 10 may happen in same state or next.
  • Dwell is not considered here, but must of course be figured out. I believe IAW times it off the spark event.

1: Cam sensor event required. State change without it means we're not phased (or HW fault).

Start timing of Cyl6 ign on state entry.

2: Nothing.

3: Cam sensor event required. State change without it means we're not phased (or HW fault).

Start timing of Cyl2 ign on state entry. If not phased yet, and no cam event goto state 5.

4: Nothing.

5: Start timing of Cyl5 ign on state entry.

6: Nothing.

7: Start timing of Cyl3 ign on state entry.

8: Nothing.

9: Start timing of Cyl4 ign on state entry.

10: Nothing.

11: Start timing of Cyl1 ign on state entry.

12: Nothing. Next state is 1.

TPS: With 5V 10mA input:

  • Idle: 0,2V
  • Open1: 2,15V
  • WOT: 4,5V

Idle Bypass valve. Opening is a function of voltage.

  • Opening at 1,3V 0,2A
  • Fully open at 5V 0,75A

Inector: Weber IW 031 green 2938/02.

  • 0,6A @ 10V

April 6th 2010.

I totally lost interest in VEMS several years ago as I discovered it was not open source any more. And it is far from plug & play in my odd-fire engine. Please email me if you have successfully used it in an odd-fire 90degree V6. I might un-mothball it. Pity such a nice hardware should end up like that.



So it seems something is happening with the odd fire case?

I may contribute with measurements made on a running injection V6 as I just bought another car.

I have a 4ch digital storage scope and other logging possibilities, so I can do non-intrusive measurements on the running electronics.

If a codewheel makes it easier, I can make one (or many) on a CNC mill.

The car will not be used during winter, so any road test measurements will have to be done before that.

Scope logs at different detail level. Much more data in the .CSV files. Put them in Excel and get 2484 samples. Make a graph in Excel.

CH1 - Cam sensor input at the ECU.

CH2 - Crank sensor input at the ECU.

CH4 - Coil output at the ECU. One coil serves 3 cylinders through a 2-coil input distributor.




I can hook up CH3 to the other coil when the scope have recharged.

OK. Got some charge into it. Here is one at around 3000RPM to see a different (less) advance.

The ones above was at idle, where the advance should be 12 degrees. In the previous shots you can actually see the other coil fire as noise in CH4.


It would be a great feature if Vems could control 6 coils to make the distributor redundant!

Einar (Spamcheck-AT) Sjaavik (Spamcheck-DOT) com

Maserati odd-fire(90,150) V6 trigger and spark example



Primary trigger settings:


Cylinder spark delay settings:


Config-(Note use only for primary secondary and cylinder settings)