problème de timer

Bonjour!

Je cherche à asservir la vitesse de rotation du mcc d’un tourne-disque.

J’ai percé 4 trous dans le plateau tournant et une diode et un phototransistor de part et d’autre du plateau. La fonction compteur compte le nombre de trous.

Toutes les x secondes, la fonction calcul_vitesse est appelée. Seulement, en observant les données reçues dans le moniteur série, je me rends compte que la fonction calcul_vitesse est appelée bien plus rapidement que je ne le demande (j’ai abaissé la fréquence de calcul jusqu’à s pour pouvoir me rendre compte du problème)

J’ai essayé avec d’autres bibliothèques comme SimpleTimer et MsTimer2 mais ça ne changeait rien.

Voici le code

#include <FlexiTimer2.h>

#include <PinChangeInterrupt.h>
#include <PinChangeInterruptBoards.h>
#include <PinChangeInterruptPins.h>
#include <PinChangeInterruptSettings.h>


int tick_par_tour_codeuse=4;
float frequence_calcul=1.0;
int tick_codeuse=0;
float rapport_reducteur=1;


void setup() {
  // put your setup code here, to run once:
  attachInterrupt(digitalPinToInterrupt(2),compteur,FALLING);    //on incrémente le compteur dès que le capteur capte un trou
  FlexiTimer2::set(1.0/frequence_calcul,calcul_vitesse);   //on calcule la vitesse toutes les 1/frequence_calcul sec
  FlexiTimer2::start();
  Serial.begin(9600);
}


void compteur() {
  tick_codeuse++;
}


void calcul_vitesse(){
  float frequence_codeuse=frequence_calcul*tick_codeuse;
  float nb_tour_par_sec=(float)frequence_codeuse/(float)tick_par_tour_codeuse/float(rapport_reducteur);
  Serial.println(nb_tour_par_sec);  //on affiche le résultat du calcul, normalement à chaque périodede calcul
  tick_codeuse=0;    //on réinitialise le tick de la codeuse
}

void loop(){
  
}

Auriez-vous une idée de la source du problème? Merci par avance :slight_smile:

Bonjour,

Tu n'as pas besoin d'utiliser une librairie timer pour quelque chose d'aussi simple.
Il suffit d'utiliser la fonction millis()

int tick_par_tour_codeuse = 4;
int tick_codeuse = 0;
float rapport_reducteur = 1;
const unsigned long periodeCalcul = 1000;


void setup() {
  // put your setup code here, to run once:
  attachInterrupt(digitalPinToInterrupt(2), compteur, FALLING);  //on incrémente le compteur dès que le capteur capte un trou
  Serial.begin(9600);
}


void compteur() {
  tick_codeuse++;
}


void loop() {
  static unsigned long millisPrec = millis();

  unsigned long millisCourant = millis();
  if (millisCourant - millisPrec >= periodeCalcul)
  {
    // calcul de la vitesse
    float frequence_codeuse = (float)tick_codeuse / (millisCourant - millisPrec) * 1000;
    float nb_tour_par_sec = (float)frequence_codeuse / (float)tick_par_tour_codeuse / float(rapport_reducteur);
    Serial.println(nb_tour_par_sec);  //on affiche le résultat du calcul, normalement à chaque périodede calcul
    tick_codeuse=0;
    millisPrec=millisCourant;
  }
}

Par contre la méthode que tu as adopté pour la mesure de la fréquence (comptage du nombre de tops) n'est pas du tout adaptée à la mesure des fréquences basses.
Il faut que tu mesures la période pour avoir une résolution convenable.