There are several layers of tricky things going on in an ECU, and although the outputs at 750RPM might be 725Hz and 37.5Hz, the inputs to the ECU isn't Hertz. Is voltage ?
ECU needs a bit of camshaft information to know which half of the 4-cycle cycle the crankshaft is in. The M30 engine doesn’t have camshaft sensor. It has crankshaft sensor only for secondary ignition. And it has cylinder identification sensor which informs the engine ECU which cylinder is in power stroke right now has been fired. This sensor is attached on cylinder number 6 spark plug wire. It sends a very low voltage around 0.25-1.5 volts only to the engine ECU.
CID cylinder identification sensor send a signal when ignition spark plug cylinder number six fire. It sent low voltage from 0.25 to 1.5 volts.
Probably it will be good to connect this sensor to the Arduino input it will be easier to control injector banks sequentially. Both sensors more information for the Arduino microcontroller process to. One sensor will be crankshaft position sensor and another sensor will be cylinder identification sensor which will tell the cylinder number six is fired or it could give any other information to Arduino to separate injector banks and fire them sequentially.
I have worked on Bosch, Hilborn, Lucas and Pi Cosworth fuel injection systems both electronic and mechanical. In all those system the injector fires as the intake valve opens.
Also have built motors and spent time on dyno to set final mapping.
The system needs to connect to mass air flow, throttle position, timing and knock sensors and it does this via the Can Bus and based on mapping the ECU determines when to fire spark
plug and when and how much fuel is needed at that throttle position. Did anyone mention if you upset the Can Bus it will go into limp mode or not work? One other detail Bosch systems get very unhappy at Non Bosch parts.
This sensor under item number 9 and attached to the cylinder number six secondary ignition high voltage wire. Cylinder identification sensor send a signal to the engine ECU then the engine ECU fires both injector banks sequentially if sensor is not working then the engine ECU goes default mode and fires both injector banks all 6 injectors at the same time with pulse width 5 milliseconds no matter what the engine crankshaft speed are. To address this issue the Arduino can be installed just for one purpose to control both injector banks sequentially. Injector bank 1 is on during 360 degrees rotation of the engine crankshaft and Injector bank 2 is off and so on. The injector bank pulse width is good timing for activation pulse width for 5 milliseconds at 330 degrees of the crankshaft position. Each revolution each injector bank.
11&12 look like a distributor rotor and cap. So ignition sparks every 120 degrees of the crankshaft, it gets distributed through the distributor, then the sensor on cyl 6 sends a spark-indicating pulse back to something-or-other-control every 720 degrees.
You could count teeth on the trigger wheel, and reset when you get the cyl6 signal, ((60-2)*2=116 teeth/720 degrees ) then choose a couple approriate counts to switch from one side to the other.
It could be much like:
...but with 120 teeth, and resetting on the cyl6 signal.
I want crankshaft position sensor reads the pulses of the crankshaft reluctor wheel and at the 330 degrees position of the crankshaft Arduino inject fuel into combustion chamber just for 5 milliseconds for injector bank 1 and next engine revolution same for next injector bank. Every 360 degrees each injector bank is its turn to inject fuel.
At the end of 720 degrees the sequence repeats.
Ignition Advance
The spark does not occur exactly at TDC 0 degrees but slightly before depending on the ignition timing advance.
For example:
At idle ignition typically occurs 10-15 degrees before TDC BTDC.
At higher RPMs ignition may advance further, up to 30-40 degrees BTDC depending on engine load and speed.
If ignition sparks before top dead centre is 10 degrees equals 360-10=350 at the engine idle speed and if RPM is higher ignition gets advance further up to 30 degrees equals 360-30=330 degrees.
At 330 degrees of the crankshaft position is equals 55th tooth. So if the ignition sparks at 30 degrees before top dead centre that is equals 58th tooth of the reluctor wheel and if ignition sparks at 120 degrees it is equals 20th tooth it is a bit early. Isn’t ?
It is better to still think in terms of angles / tooth position. At 330 degrees begins injection for 5 milliseconds is equal around 3 pulses and 3 pulses is equals 18 degrees. So every engine revolution fuel injection time begins at 330 degrees then finishes at 348 degrees because after 348 degrees there is gap with 2 missing teeth. And next engine revolution same way for next injector bank. Is that so difficult to write a code for it ?
In my simplistic world, I would think the teeth pass by the sensor at a different pace depending on how fast the engine goes. So in 5ms (absolute timing) you'll get more or less teeth in front of the sensor if the speed is not the same.
The two missing teeth in the reluctor wheel is good gap for resets to switch another injector bank on. We don’t even need cylinders identification sensor. All job can do crankshaft position sensor. Two missing teeth is a 12 degree of the crankshaft position it is taking 2.76 milliseconds only at the engine idle speed RPM750 that is enough time for switch injector bank for next one. Isn’t ?
Of course the microprocessor can count teeth and handle it speeds. Higher speed on the crankshaft reluctor wheel then pulses pass crankshaft position sensor faster and time decreased.
If is not built in Arduino then we can added speed calculator. Or this is not possible ?
Unfortunately, that’s a very naive observation. An unemployed hooker standing at the bar is also ‘ ready to chat anytime and anywhere you are’.
How can you assess the quality of the response if you don’t understand the question, objectives and methods ?
I suspect you’re relying on Al to perform all your queries and thoughts, which ties in with my understanding of the current Al scene -Assisted laziness,
I was asking with regard to the idea that everything coud be "teeth counting" based (ie inject fuel into combustion chamber between the 55th tooth and 58th tooth for example).
So your answer is that it's always 5ms regardless of the speed so counting tooth is not sufficient for the state machine, you also need to maintain time based events.
(can the crankshaft reluctor wheel spins at a speed such that 5ms would be a significant part of a full turn ?)
Sure, it's enough time to do a switch, but how can you know that you started injecting on the proper bank or the on other one? If you get that wrong, you would be injecting on the wrong strokes.
There's 120° (20 teeth) between each sequential firing/bang stroke, and 360°(60 teeth) between a cylinder's bang and suck strokes. Injecting on the bangs will suck.
If crankshaft speed is RPM750 in 80 milliseconds then pulse width is 5 milliseconds. What pulse width will be at RPM2250 ?
To calculate the pulse width at RPM 2250 we first need to establish the relationship between RPM revolution time and pulse width. Here’s the breakdown:
At RPM 750:
One engine revolution = 80 milliseconds.
Pulse width = 5 milliseconds as given.
Relationship Between RPM and Pulse Width:
The pulse width is proportional to the time per revolution. As RPM increases the time per revolution decreases and so does the pulse width. The scaling factor is the ratio of the RPMs.
Calculate the Scaling Factor:
Scaling factor RPM at 750 divide RPM at 2250 = 750 divide 2250 = 1 divide 3
Calculate the Pulse Width at RPM 2250:
Pulse width at 2250 RPM = pulse width at 750 RPM multiply scaling factor.
Pulse width at 2250 RPM = 5 ms multiply 1 divide 3 = 1.67 seconds.

Final Answer:
The pulse width at RPM 2250 will be approximately 1.67 milliseconds.