Aide pour pilotage d'un injecteur de voiture essence

Bonjour, Stephen, je suis débutant dans le monde de l'arduino.

Je voudrais utiliser une arduino nano avec un mofset IRF520 pour piloter un injecteur essence de voiture.
Je voudrais piloter cet injecteur avec une variation de régime 1000, 2000, 3000, 4000, 5000, 6000 tr/min.
Cette variation interviendrai toutes les 10s, avec 10s d'attente à la mise sous tension du système, ce qui fait un temps total du programme de 70s.
Pour les régimes j'ai déterminé les fréquences d'envoi de courant en milliseconde.
J'ai lu plein de tutos sur les différentes choses à faire en arduino, mais je sais pas trop quelle formule utiliser pour commencer ce projet.

Dans l'attente d'une réponse je vous remercie.

Comment se traduit le pilotage, en termes arduino? C'est l'envoi d'une impulsion, un changement d'état d'une sortie GPIO ?

Par le biais du mosfet il faut envoyer du 12v sur les 2 bornes de l'injecteur avec des fréquences différentes pour simuler le régime moteur. En cherchant un peu j'ai trouvé les fréquences suivantes pour les différents régimes: 16.7htz-1000tr/min; 33.3hts - 2000tr/min; 50htz - 3000tr/min; 66.7htz - 4000tr/min; 83.3htz - 5000tr/min; 100htz - 60000tr/min.
Je sais pas trop ce qu'il faut utiliser pour lancer le pilotage et passer d'une plage de régime à l'autre sachant que je souhaiterai rester 10s sur la même plage à chaque fois.
Dans l'après je souhaiterai également relié un écran lcd qui m'indiquera sur quelle plage de régime je suis, mais ça c'est après, déjà je souhaiterai arrivé faire fonctionner l'injecteur.

Tu as un circuit electronique pour mettre ton MOSFET en oeuvre ?

oui j'ai un module déjà tout près voici le liens

A force de chercher chercher j'ai trouvé un moyen peut être pas le meilleur mais ça fonctionne.

Merci

L'Arduino ne peut pas générer des signaux sinusoïdaux, mais seulement des signaux carrés. La bonne nouvelle c'est que ton module les accepte (voir la doc, qui dit qu'il est compatible du PWM de l'Arduino).

La mauvaise nouvelle c'est qu'il n'est pas sûr qu'on puisse générer avec un nano des signaux carrés aux fréquences que tu veux.

Je ne suis pas un expert du PWM et des registres associés, mais il existe une bibliothèque qui gère ça simplement.

En gros, elle pilote les registres pour générer des signaux à des fréquences déterminées, qui sont des sous-multiples de la fréquence d'horloge. Pour un nano (équipé d'un Atmega328P), le code est ici :

void setPWMPrescaler(uint8_t pin, uint16_t prescale) {
  
  byte mode;
  
  if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
    switch(prescale) {
      case    1: mode = 0b001; break;
      case    8: mode = 0b010; break;
      case   64: mode = 0b011; break; 
      case  256: mode = 0b100; break;
      case 1024: mode = 0b101; break;
      default: return;
    }
    
  } else if(pin == 3 || pin == 11) {
    switch(prescale) {
      case    1: mode = 0b001; break;
      case    8: mode = 0b010; break;
      case   32: mode = 0b011; break; 
      case   64: mode = 0b100; break; 
      case  128: mode = 0b101; break;
      case  256: mode = 0b110; break;
      case 1024: mode = 0b111; break;
      default: return;
    }
  }
  
  if(pin==5 || pin==6) {
    TCCR0B = TCCR0B & 0b11111000 | mode;
  } else if (pin==9 || pin==10) {
    TCCR1B = TCCR1B & 0b11111000 | mode;
  } else if (pin==3 || pin==11) {
    TCCR2B = TCCR2B & 0b11111000 | mode;
  }
}

Si je comprends bien ...
On voit que sur les pins 3 et 11, les diviseurs possibles sont : 1, 8, 32, 64, 128, 256 et 1024. Partant d'une fréquence de 31250 Hz, on obtient les fréquences possibles de 31250, 3906, 976, 488, 244, 122 et 61 Hz. Donc, pas celles que tu veux. On peut descendre à 31 Hz sur la pin 10 avec un prescaler de 1024.

EDIT : je vois que tu as réussi, partage ta solution... As-tu les moyens de vérifier (à l'oscillo par exemple) les fréquences générées ?

EDIT2 : à ces fréquences, on peut certainement générer ces signaux sans faire du PWM, mais en mettant une sortie à HIGH et LOW selon les valeurs de millis() ou micros() pour faire plus précis: voici un exemple pour 100 Hz

int freq = 1000; // dixièmes de hertz (1000 pour 100Hz, 333 pour 33.3 Hz)
unsigned long chrono;
unsigned long periode;
bool level = LOW;
const int pinMOSFET = 10;

void setup() {
  pinMode (pinMOSFET, OUTPUT);
  digitalWrite (pinMOSFET, level);
  periode = 10000000ul / freq / 2; // microsecondes (demi période)
  chrono = micros();
}

void loop() {
  while (micros() - chrono < periode);
  chrono = micros();
  level = !level;
  digitalWrite (pinMOSFET, level);
}