Tendre problemas??

Hola, soy nuevo en el foro, pero llevo 3 años usando arduino y muy contento con el. Ahora estoy planteandome un sistema para control de un motor de gasolina. Bien llegando a este punto, tengo un coche que usa platinos, de cada cual cojo la señal a 5, pero el problema es el siguiente: Tenemos 4 cilindros = 4 bujias = 4 interrupciones con muy poco tiempo de diferencia. Tendre problemas con las interrupciones? Adjunto codigo para que lo veais bien.

//ECU Seat Marbella 1988
//Control de Carburacion y Encendido
//Tomando como valores Presion Turbo y otros Valores
//Escrito por JOSEMA
//USAR ARDUINO MEGA

#include <EEPROM.h>
int pinbuji1;
int pinbuji2;
int pinbuji3;
int pinbuji4;
byte tempo;
bool atraso;
int atrasoint;
volatile unsigned long cont_rpm;

void setup()                    
{
atraso = EEPROM.read(0);
pinMode(2,INPUT); 
pinMode(3,INPUT);
pinMode(21,INPUT);  
pinMode(20,INPUT);  
pinMode(23, OUTPUT);
pinMode(24, OUTPUT);
pinMode(25, OUTPUT);
pinMode(26, OUTPUT);
pinMode(27, OUTPUT);
atraso = false;
attachInterrupt(0, bujia1, RISING);
attachInterrupt(1, bujia2, RISING);
attachInterrupt(2, bujia3, RISING);
attachInterrupt(3, bujia4, RISING);
Serial.begin(9600);
}

void bujia1()
{
  cont_rpm++;
  if (atraso){
  digitalWrite(pinbuji1, HIGH);
  delayMicroseconds(tempo);
  digitalWrite(pinbuji1, LOW);
  }else digitalWrite(pinbuji1, HIGH);digitalWrite(pinbuji1, LOW);
  cont_rpm++;
}

void bujia2(){
 if (atraso){
  digitalWrite(pinbuji2, HIGH);
  delayMicroseconds(tempo);
  digitalWrite(pinbuji2, LOW);
  }else digitalWrite(pinbuji2, HIGH);digitalWrite(pinbuji2, LOW);
}

void bujia3(){
  if (atraso){
  digitalWrite(pinbuji3, HIGH);
  delayMicroseconds(tempo);
  digitalWrite(pinbuji3, LOW);
  }else digitalWrite(pinbuji3, HIGH);digitalWrite(pinbuji3, LOW);
}

void bujia4(){
  if (atraso){
  digitalWrite(pinbuji4, HIGH);
  delayMicroseconds(tempo);
  digitalWrite(pinbuji4, LOW);
  }else digitalWrite(pinbuji4, HIGH);digitalWrite(pinbuji4, LOW);
}

void loop()                    
{
  static unsigned long rpm_ant;
  static unsigned long t_anterior;
  static float rpm_actuales;
  rpm_ant=cont_rpm;
  t_anterior=millis();
  
  delay(100);  

  rpm_actuales=(cont_rpm-rpm_ant)/(2.0*(millis()-t_anterior)/60000);
  Serial.println(rpm_actuales);
  delay(1000);
  
 if (Serial.available()) {
   tempo = Serial.read();
   EEPROM.write(0, tempo);
    }
    
 atrasoint = digitalRead(27);
 
 if(atrasoint == 1)   {
 atraso = true;
 }else atraso = false;
 
  }

Como veis ahi 4 interrupciones, cada una de ella lleva un If, que si quiero atraso de la chispa debido al turbo. (Parece mas una clase de Mecanica que de Electronica :smiley: ) Me llevara todo a tiempo??? Necesito hacer algun cambio???

Muchas Gracias por adelantado :grin:

Bueno yo no soy amigo de usar

  delayMicroseconds(tempo);

por mas que sea microsegundos.

En este caso deberias hacer un análisis de tiempos y establecer que tiempo tienes entre cilindro y cilindro que garantice que no vas a perder una interrupción.
Sino debes usar otro criterio de retardo.

Ejemplo: Usaria un timer a 10 uSeg o sea 100khz por decir algo. Cuento ticks del timer y hago lo mismo sin demorar una interrupción.

Cuando el tiempo de ejecucion es crucial puedes substituir algunas funciones por otras que utilizan menos ciclos de reloj:

Porque no nos pones en situación.
De que tiempos críticos hablas?
4 cilindros a 3000 o 4500 rpm vamos a suponer como mucho.

4500 rpm = 4500 /60 seg = 75 rev/seg o 75 Hz

Ahora si son 4 en un motor de 4 tiempos tenemos que cada uno debe aportar en cada tiempo para proporcionar empuje. Seria logico pensar que cada 1/75 hz = 14 mseg tenemos 4 interrupciones
14/4= 3500 uSeg
Es una eternidad o me parece a mi?

Claro que es una eternidad pero debo actuar en esos tiempos.

Esta bien este análisis?

A mi, en su día, también se me pasó por la cabeza hacer una ecu, pero para una moto de circuito monocilíndrica, que más adelante debería evolucionar a inyección, pero se me quitaron las ganas por el montón de parámetros que necesitaba tener en cuenta. Con esto, no te quiero desanimar, en absoluto, pero tienes que tener en cuenta algunas cosas.

Para empezar, creo que para este proyecto, es más adecuado para un due que no para un mega, básicamente por la velocidad del procesador.

Lo siguiente a tener en cuenta, olvida los delays. No uses delays en un proyecto así. Es más, he visto un delay(1000) en el loop, y eso es terrible para todo el funcionamiento de un motor. En 1 segundo, pasan muchas cosas, y no puedes permitirte el lujo de que el microcontrolador esté "durmiendo" durante ese tiempo.

No sé si has trabajado con ECU's programables. Yo sí, en competición, y habría que plantear el tema del encendido variable, con al menos una tabla en la que tengas los datos de avance de encendido con respecto a las rpm del motor. Actualmente, en motores de inyección, la tabla también tiene en cuenta los valores de apertura del gas, tanto para encendido, como para inyección, a parte de otros valores como presión atmosférica, temperatura del aire y del refrigerante del motor, presión de aire en la admisión, valores lambda en el escape...

Y programación en fuzzy logic que hoy es la que domina estos casos.
Supongo que se puede implementar fuzzy logic en arduino. NO lo he investigado.