Bonjour à tous,
Il y a un bout de temps, j'avais sollicité votre aide pour réaliser un compte-tours (moteur 2 temps à 2 étincelles par tour).
Après moult expérimentations, je me trouve confronté à un problème logiciel.
Avec ce code donné par l'un d'entre vous, dont l'entrée est simulée par une pwm fixée à 500 Hz (ce qui doit me donner 15000 rpm), la valeur affichée est environ 13700 rpm et fluctue presque à chaque mesure d'environ 300 rpm.
volatile byte rpmcount;
volatile unsigned int rpm;
unsigned long timeold;
void setup()
{
Serial.begin(57600);
attachInterrupt(0, rpm_pulse, FALLING);
digitalWrite(2, HIGH);
}
void loop()
{
noInterrupts(); // interdit les interruptions / la modification des compteurs
uint32_t t_now = micros(); // lit l'heure
uint32_t rpmc = rpmcount;
rpmcount = 0;// lit et réinitialise les compteurs
interrupts(); // autorise les interruptions / la modification des compteurs
uint32_t delta_t = t_now - timeold; // calcule la durée du comptage effectué
timeold = t_now; // mémorise l'heure de départ du nouveau comptage
rpm = rpmc * 6.0e7 / delta_t;
rpm = rpm / 2 ;
Serial.println(rpm);
delay(200);
}
void rpm_pulse()
{
rpmcount++;
}
J'ai donc tenté l'autre méthode qui mesure le temps entre chaque impulsion.
Cette fois-ci ça fonctionne j'ai un beau 15000 rpm rafraichi toutes les 200ms mais disons une fois toutes les secondes, il m'affiche 9990 rpm.
volatile unsigned int freq;
volatile unsigned int rpm;
float start;
float elapsed;
void setup()
{
Serial.begin(57600);
attachInterrupt(0, rpm_pulse, FALLING);
digitalWrite(2, HIGH);
}
void loop()
{
Serial.println(rpm);
delay(200);
}
void rpm_pulse()
{
elapsed = millis() - start;
start = millis();
freq = 1000UL / elapsed;
rpm = freq * 30;
}
Même si je commence à avoir un peu de recul sur les arduinos, je reste un débutant, j'ai cru comprendre que gérer des timers (ce que je n'ai encore pas assimilé) permet d'alléger la charge de travail du microcontroleur, est-ce la solution ?
Le reste de mon code implique déjà beaucoup de choses donc je cherche la solution moins gourmande en ressources sachant que je n'ai besoin d'une précision qu'à 100 rpm.
Une explication à mon problème ?