Vitesse rotation et interruptions

Bonjour/bonsoir à tous,

Afin d'occuper au mieux mon confinement, je me suis mis dans la tête de fabriquer un petit robot, utilisant ces moteurs.

Pour cela, j'utilise le programme suivant :

const byte interruptPin = 2;
volatile int temps_tour_avant = 0;
int interval_temps_millis = 0;
int compteur_du_loop = 0;

int temps_millis;

volatile int compteur = 0;

void setup()
{
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), interruption, RISING);
  Serial.begin(9600);
}

void loop()
{
  //Etape 1 : récupérer la valeur du compteur et la valeur du temps au même moment pour être en mesure de faire les calculs corrects
  compteur_du_loop = compteur;
  temps_millis = millis();

  //Etape 2 : calculer l'interval de temps
  interval_temps_millis = temps_millis - temps_tour_avant;

  //Etape 3 : remettre les compteurs à 0
  compteur = 0;
  temps_tour_avant = millis();

  //Affichage port série
  Serial.print(millis());
  Serial.print("\t");
  Serial.print(compteur_du_loop);
  Serial.print("\t");
  Serial.println(interval_temps_millis);
  delay(1000);

}

void interruption()
{
  compteur = compteur+1;
}

Les valeurs suivantes me sont fournies pour les variables :

  • compteur_du_loop : 1315
  • interval_temps_millis : 1001

J'ai donc 1315 impulsions montantes sur un codeur en 1 seconde environ.

Sachant que mon codeur a une résolution de 64 impulsions par tour avec une réduction de 131.25 selon la datasheet, le calcul suivant est effectué pour avoir des trs/min sur l'arbre de sortie :

Nombre d'impulsions par tour sur l'arbre de sortie : 64*131.25 = 8400
Donc 1315 impulsions équivaut à 1315/8400 = 0.156 tour
Conversion des millisecondes en minutes : 1001/1000/60 = 0.016
Donc mon régime de rotation est de 0.156/0.016 = 9.75trs/min

Problème : quand je compte le nombre de tours pendant 1 minute...j'ai environ 40 tours!

J'ai beau tourner le problème dans tous les sens je ne comprends pas. Comme il y a deux encodeurs peut-être que j'ai mal compris la datasheet et que j'ai une résolution de 32 impulsions/encodeur (soit 64 au total) mais j'ai toujours environ un facteur de 2 qui se trimbale.

J'ai revérifié la référence du réducteur et le rapport de réduction est bien de 131.25.

Je n'arrive pas à trouver mon erreur, au point que je me demande si l'Arduino MEGA que j'utilise est assez puissante pour avoir un nombre aussi important d'interruption par tour (j'ai calculé à 40 tours ça fait 5600 interruptions/seconde).

Avez vous une idée de mon erreur?

Merci d'avance à vous pour vos réponses.

La nuit portant conseil et remettant les yeux en face des trous, j’ai relu la datasheet et cette magnifique phrase :

By counting both the rising and falling edges of both the A and B outputs, it is possible to get 64 counts per revolution of the motor shaft.

Donc j’ai la réponse! La résolution n’est pas de 64 fronts montants par encodeur, mais de 32 changements d’état sur un seul encodeur! Mon facteur 4 est donc trouvé!

Je ne sais pas comment j’ai fait pour passer à côté !

Désolé pour le dérangement !