Bonjour,
J'ai trouvé un programme pour faire un TACHYMETRE.
Il fonctionne très bien quand il y a des signaux, mais à l'arrêt
le programme me donne un nombre long et aberrant et toujours le meme.
Je pense que c'est parcequ'on divise par la periode et comme elle est nul à l'arret, diviser par 0
doit faire buger le programme.
Comment puis-je faire?
Car j'aurais besoin plus tard de mesurer l'acceleration et la deceleration
Merci pour votre aide
Voici le programme
/**
- Tachymétre minimaliste avec une carte Arduino
*/
/* constantes pour la broche de mesure */
const byte PIN_SIGNAL = 2;
/** Fonction setup() */
void setup() {
/* Initialise le port série */
Serial.begin(9600);
/* Met la broche en entrée */
pinMode(PIN_SIGNAL, INPUT_PULLUP);
}
/** Fonction loop() */
void loop() {
/* Mesure la durée de la (demi) période */
unsigned long periode = pulseInCycle(PIN_SIGNAL, HIGH, 1000000);
/* Affiche le résultat de la mesure en RPM
// avec juste un signal par tour */
// Serial.println(1000000 / periode * 60);
// avec 40 signaux par tour car
// disque de 20 trous soit 202 =40 etat/tour)/
Serial.print ("tourparmin");
Serial.println ( 1000/periode4060);
//exemple lire 55700 comme 55,7 tours/min
/* Affiche le résultat mesure en RPS tours/s /
Serial.print ("tourparsec");
Serial.println ( 1000/periode40);
//lire 55700 comme 55,7 tours/s
delay(1000);
}
unsigned long pulseInCycle(byte pin, byte startState, unsigned long timeout) {
/* Compute low-level bitmask and port for direct I/O reading /
byte bitmask = digitalPinToBitMask(pin);
volatile byte port = portInputRegister(digitalPinToPort(pin));
byte mask = startState ? bitmask : 0;
/* Get the starting time (for the timeout handling) */
unsigned long startMicros = micros();
/* Wait the end of the current starting state (avoid partial measure) */
while ((*port & bitmask) == mask) {
if (micros() - startMicros > timeout)
return 0;
}
/* Wait for the next starting state */
while ((*port & bitmask) != mask) {
if (micros() - startMicros > timeout)
return 0;
}
/* Start the counter */
unsigned long start = micros();
/* Measure the starting state duration */
while ((*port & bitmask) == mask) {
if (micros() - startMicros > timeout)
return 0;
}
/* Measure the ending state duration */
while ((*port & bitmask) != mask) {
if (micros() - startMicros > timeout)
return 0;
}
/* Compute the total duration */
return micros() - start;
}