Mazda Miata trigger

The "lost sync" issue is solved and the car runs fine, the trigger sensor developed an intermittent fault which became more apparent with time. It was quite consistent at the end, the trigger sensor seemed to lock up and stay high until the next tooth arrived, it then went low and sent out a short pulse again. The total number of teeth per turn stayed the same but everything moved.

The wierd thing is that the stock ECU runs fine when the trigger sensor is acting up, I guess that it's common enough for them to have made a workaround.

It is possible that changing the trigger edge could make the car work better when the trigger occur or that the error detection could be improved by activating the filters, but the car runs now and the error is not something that you can miss.

Vemscfg from the tuning session:

Vemslog from the only time it happened when not hitting the revlimiter, ignition was cycled at the end and the engine starts:

Can someone take a look at this?

Do you see a trigger error when this happens ? A vemslog of containing configuration used would be helpfull or us to try to diagnose and reproduce this issue. - DB

Nope, no trigger error indication when it happened. Additional information supplied above. -JK

I have tested this at various rpms ranging from 200-8200 applying advance range 9-45 degrees, tested scenarios injected primary tooth, missing primary tooth, sectrig goes missing, sectrig in wrong place. All are properly detected flagging trigger error and causing resync. To narrow it down (and fix) i need to be able to reproduce it, what exactly happens at the error rpm range/point does ignition shutdown or happen at wrong place, please verify with strobe and elaborate your findings. Could you take some scopeshots of trigger at or around that problem rpm ? Thanks! - DB

Thanks for testing it, I will try to recreate it enough times to be able to strobe and scope the engine while it happens. As it only happens once in a while when hitting the revlimiter it's not easy. -Jörgen

I found that with 1.2.31 TDC_after_trigger had to be set at 9deg when strobing the engine. I strobed the car on #1 cylinder on 0,10,20,30 and 40 deg and it worked fine. It also drove fine when I did the initial tune. There is an exception which allow 0-10 deg TDC_after_trigger when using coil type trigger. I think that applies for this trigger as well and that is why it can be driven at all. The only thing I notice is a hickup when the car starts up, IIRC this happens on the cars where the 0-10deg setting has to be used.

I'm afraid that something was not correct with the documentation I supplied for the trigger development. I took by scoping another car and made the trigger pattern below based on that car.

I payed to much attention to the longgap/shortgap selection for The MiataNb? in 1.2.32. The car now runs fine and is strobed: The config only works on 1.2.32 and up.

Thanks for implementing this trigger system quickly! -Jörgen


The Mazda Miata is one of the most popular spec race cars in use in Sweden. One very successful combination is to put the 99-01 NB engine in the early

90's cars. The leading race car drivers here in Sweden wish to run with the stock trigger as they want the option to run the car on the stock engine

management system if there is a problem.

I am developing a plug and play harness for these cars and I would like us to look at the trigger to see if we can make this work reliably.

Trigger system

The crank and cam sensors are hall triggers on the 99-01 Miata NB engine. The teeth on the crank look like they are made for a VR trigger but it really

is a Hall trigger.

This is what I found when scoping the car. This should be sufficient for implementing the trigger. It could be a degree or two off here and there as it

was taken with a scope on an idling car.

As the crank trigger pattern is not symetric it's probably simplest to decode to a 4+1 trigger by counting and ignoring teeth.

Possible pseudo code for the input filter:

Primtrig / Crank interrupt routine:
if( secondarytriggercount ){
 if( secondarytriggercount > 1 ){
   if (primarytriggercount == 0){  initial sync found ...}
   primarytriggercount = 1; // tooth_wheel = ..

 secondarytriggercount = 0;// Reset every crank pulse.

if (primarytriggercount == 0) return; // not in sync yet

if( (primarytriggercount++) & 1 ){ // return if it was odd
  return(); // Return if it's the first tooth after cam sync ()
//tooth at 50 deg found if this point is reached.

sectrig / cam interrupt routine:

if (secondarytriggercount++ == 0)
  return(); // ignore single cam pulse
// dual teeth cam sync pulse found if this point is reached.

Note: this implementation depends on sectrig : Even if it has distributer (which I don't know), and same ignchannel configured for all 4 entries;

it depends on working camsync, and will NOT limphome with broken sectrig.