Nombre interruption maximum par sec

Bonjour,

Je réalise un compteur de vitesse,

Pour ce faire j'ai un roue dentée de 36 dents qui déclenche un attachinterrupt.

Tout fonctionne mais arrivée à plus de 430-450 interruptions par sec (soit environ une toute les 2 ms), la détection ne compte plus correctement et affiche des valeur incorrect entre 100 et 200 interruption par sec.

Cela viendrait il de l'aruino qui sature ? Ou de mon capteur qui sature ?

Mon capteur : %product-title% - Conrad Electronic France

long timestamp_de_reference=0;
long delai=1000;
int analog_in = 3;
volatile float comptage_impultions=0;

void incrementation ()
{
	comptage_impultions = comptage_impultions + 1; // incrémente comptage_impulsion
}



void setup() {

	Serial.begin(115200);
	attachInterrupt(1, incrementation , RISING);
	timestamp_de_reference = millis()-1;
	pinMode(analog_in, INPUT);

}

void loop()
{
	if (millis()>(timestamp_de_reference+delai))
	{ 
		timestamp_de_reference = timestamp_de_reference + delai;
		Serial.print("Nombre Impulsions par seconde = "), Serial.println(comptage_impultions); // affiche impulsions/sec
		int kmh = comptage_impultions/36*1.5856*3600/1000; //(nombre_impultion_par_sec / nombre_de_dents * distance_parcourue_par_la_roue * 3600_sec_en_une_heure / divisé_par_1000_pour_affichage_en_kmh)
		Serial.print("Km/h = "), Serial.println(kmh); // affiche vitesse en km/h 
		comptage_impultions=0; 
	}

}

Pourquoi comptage_impultions est un float ??

Non vous pouvez avoir bcp plus d’interruption que cela (plusieurs centaine de milliers si le code est efficient) il faudrait que l’affichage du résultat soit en section critique avec interruptions désactivées (au moins le temps de faire une copie de comptage_impultions)

Votre test sur millis() doit être écrit dans l’autre sens avec une soustraction pour gérer proprement le rollover et le variable temps sont des unsigned long

Merci pour les informations,

Oui le float est une erreur lorsque j'ai écrit le code.

il faudrait que l'affichage du résultat soit en section critique avec interruptions désactivées

Pourrais-je avoir un peu plus de précisions ? Cela fait t il intervenir detachInterrupt ?

Bonjour,

C'est pour éviter que le compteur ne soit modifié pendant son traitement

void loop()
{
  if (millis()-timestamp_de_reference>=delai)
  { 
    cli();  // interdit les interruptions pour éviter que le compteur ne soit modifié par une interruption
    unsigned cpt=comptage_impultions;
    comptage_impultions=0; 
    sei();
    timestamp_de_reference = timestamp_de_reference + delai;
    Serial.print("Nombre Impulsions par seconde = "), Serial.println(cpt); // affiche impulsions/sec
    float kmh = (float)cpt/36*1.5856*3600/1000; //(nombre_impultion_par_sec / nombre_de_dents * distance_parcourue_par_la_roue * 3600_sec_en_une_heure / divisé_par_1000_pour_affichage_en_kmh)
    Serial.print("Km/h = "), Serial.println(kmh); // affiche vitesse en km/h 
  }
}

Merci je vais tester cela

Hello
J'apporte ma touche :

   static unsigned precedent = 0;
    cli();  // interdit les interruptions pour éviter que le compteur ne soit modifié par une interruption
    unsigned releve=comptage_impulsions;
    sei();
    unsigned cpt = releve - precedent;
    precedent = releve;
    //et on continue avec cpt qui donne le nombre d'impulsions relevées depuis la dernière fois
    ...

A ce stade, il ne reste qu'une affectation d'entier sur deux octets, entre cli() et sei().
J'ai un doute sur la nécessité de maintenir ces appels.

PS : ça me piquait trop les yeux, j'ai remis un s à impulsion :slight_smile:

Parfait, je vous remercie ça fonctionne