Renseignements Ordonnanceur/Scheduler/ Real time

Bonjour chers amis!

Je suis tout nouveau parmi vous, j'ai récemment fait l'acquisition de 2 arduinos.
ça faisait un bout de temps que l'idée me trottait dans la tête et j'ai fini par céder.

Donc me voilà! :slight_smile:

J'ai pas mal bourlingué sur les différents sites à la recherche d'idées, de pistes, et finalement je me tourne vers la communauté qui saura certainement me mettre sur la voie.

J'ai un petit niveau en C, je suis pas un nul accompli, mais pas un foudre de guerre non plus, et certains codes, même commentés, me restent inaccessibles.

Pour la partie intéressante:

J'ai un projet qui consiste à essayer de reproduire un ECU (Engine Unit Control) avec un Arduino Uno.
Je lis partout que ces petites bébètes ne sont pas assez costaudes pour répondre assez vite, et je constate qu'on en atteint assez vite les limites :slight_smile: .

Mais je souhaite essayer, ça reste très formateur.

Dans un premier temps, je veux juste essayer de contrôler l'allumage des bougies d'un 4 cylindres, qui en plus de ça ne tourne pas très vite.

Pour ça, j'ai besoin de réaliser plusieurs opérations en quasi simultané:

  • compter les états logiques hauts d'un signal externe (sonde effet hall sur couronne de démarreur)
  • calculer la fréquence
  • effectuer des calculs pour l'allumage
  • envoyer une série d'impulsions sur des broches dédiées ou une seule, avec un demuxeur derrière.

Je me pose ce problème parce que je ne peux pas utiliser pulseIn() qui est bloquante, et que j'ai besoin d'une vitesse d'exécution assez élevée, de l'ordre de la centaine de kHz.

Je suis tombé sur par mal d'articles concernant les ordonnanceurs/schedulers.
Ce qui m'a conduit sur la gestion d'interruptions.

Et c'est là où je perds pied, je comprends le concept général, mais pas comment il est mis en place.

Si vous avez d'éventuelles pistes....

Quelques pistes que j'ai déjà trouvées:

Et j'ai paumé les quelques autres que j'avais ^^

Merci à vous de m'avoir lu!

Rebonjour,

j’ai trouvé quelques pistes sur les interruptions et j’ai pu faire quelques tests pour comprendre comment ils fonctionnaient.

Voici le code que j’ai utilisé pour le tester:

#define vect 10

 float duree;     // Ce paramètre me sert à calculer le temps entre chaque interruption
 float fre;       // fre va recevoir divers calculs qui conduisent à ma fréquence
 float tab[vect]; // Je crée un tableau de 10 nb pour enregistrer les valeurs de frequence, et pour en faire une moyenne glissante
 int i=0;        
 
void analyse();  // prototype de ma fonction d'interruption

void setup() {
  attachInterrupt(0,analyse,HIGH);    // initialisation de l'interruption, 0= pin digitale n°2 ; timer n°0 ; fct° analyse ; se déclenche à chaque fois qu'on passe sur un état Haut
  pinMode(13,OUTPUT);            
  tone(13,50);                        // J'initie la pin 13 avec une fréquence de 50 Hz
 
  Serial.begin(9600);                 // Pour afficher les valeurs sur l'ordi, en contrôle
}

void loop() {
 
  //digitalWrite(13,state);
}


void analyse()
{
  duree=millis()-duree;              // calcul de la durée séparant chaque appel de "analyse" -> entre la fin du dernier créneau et le début du créneau actuel, 
  //duree=micros();                  
  fre=1000/(2*duree);                // C'est à dire une demie période, puisqu'on a un rapport cyclique de 50%
  if(i==vect)i%=vect;                // i est un incrément qui me permet de remplir le tableau tab[vect], puis lorsque i=vect-1, on réinitialise i à 0 pour remplir le tableau à nouveau
  tab[i]=fre;                        // chaque case du tableau reçoit une valeur calculée de la frequence
  fre=0;                             // Je réinitie fre avant de m'en servir pour faire la moyenne glissante, juste en dessous
  for(int j=0;j<vect;j++) fre+=tab[j];
  fre=fre/vect;                      // Calcul de la moyenne glissante
  i++;                               // et on incrémente i pour le prochain tour de tableau
  //duree=micros()-duree;
  Serial.println(fre);               // j'affiche finalement la valeur
  
  //digitalWrite(2,LOW);
  duree=millis();                    // et on réinitialise duree.
  
  }

J’ai juste connecté la broche 13 à la broche 2 via une résistance (47kOhm) pour avoir les résultats.

Le problème reste néanmoins le même: dans ce cas précis j’ai besoin d’utiliser une pin pour faire une interruption externe, mais je risque d’en avoir plus que ça, et je n’ai pas de gestion de priorité.

Mais je reconnais que c’est bien pratique tout ça!

Si ça peut servir à quelqu’un…

A bientôt :slight_smile: