Go Down

Topic: Mesure de la durée d'un pulse (Read 3 times) previous topic - next topic

Raoul6391

Bonjour

Je cherche à résoudre (sans succès) le problème suivant. J'espère que quelqu'un sur ce forum pourra m'aider.
J'utilise une ArduinoMega.

Je voudrai mesurer la durée d'un pulse parmi une série de pulses identiques, j'ai plusieurs entrées à gérer "simultanément".

Je souhaitai réaliser un programme à base de routine d'interruption plutôt que de lire en boucle  les entrées car d'autres actions sont à réaliser dans la boucle et je ne veux pas rater d'entrées.
J'utilise les interruptions, déclenchées sur le premier changement d'état (qui indique une nouvelle  série de pulses) je mesure la durée du prochain pulse avec PulseIn, cela fonctionne. Ce que je ne sais pas faire c'est comment "sortir" de cette routine d'interruption  pour libérer le calculateur jusqu'à l'arrivée de la série suivante... En effet comme je dois surveiller plusieurs entrées je ne veux pas rester "bloquer" dans une routine d'interruption et rater une autre interruption (une autre série de pulses).
La durée de la série d'un pulse est non déterminée et peut varier de quelques millisecondes millisecondes à quelques dizaines de millisecondes. La durée minimale d'un pulse est de 64 microsecondes, la durée maximale est de 512 microsecondes. Chaque série peut réapparaitre toutes les 5 à 15 secondes. Il y a en tout 6 entrées à surveiller (voir photo attachée).

Merci de m'aider si vous avez une idée ou des pistes à me suggérer.

Pour information, le projet consiste à identifier le signal (carré) émis par la diode embarquée sur une voiture de circuit électrique digital Carrera. Chaque voiture émet en permanence un signal carré dont la longueur du pulse identifie la voiture (la voiture numéro 1 présente un pulse de 64 microsecondes, la voiture suivante 64 microsecondes + 64 microsecondes et ainsi de suite pour un maximum de 8 voitures). Le signal est lu lors du passage de la voiture sur un photo-transistor placé sur la piste. Une fois l'identification des voitures réglé il sera facile de réaliser un compte-tours et une application de chronométrage.


Korman

#1
Feb 09, 2011, 02:50 pm Last Edit: Feb 09, 2011, 02:56 pm by Korman Reason: 1
En dépendance de ce que le reste de ton programme doit encore gérer, tu as les option de faire ceci par polling ou par des interruptions. La version avec le polling est plus simple et peut être plus efficace, mais elle nécessite que ta boucle central boucle suffisamment rapide et n'aie pas de parties qui prennent trop de temps. La version avec interruptions est plus compliquée à programmer et la précision de mesure est toujours dépendant des autres interruptions possibles simultanées. Pour les premiers essais la version avec le polling est préférable à mon avis.

Assumons que ta boucle centrale ne prend pas plus que 30 µs, soit quelques 400 instructions, tu devrais avoir assez de temps pour différencier entre la voiture avec le signal à 64µs et celle à 128µs. Cela devrait suffire comme  précision.

Pour lire les entrées, je doute que tu puisses utiliser digitalRead. Une bonne idée est de brancher tous les signaux d'entrée sur broches du même port (par exemple port L, les broches 42 à 49). Cela te permets de lire tous les signaux simultanément en utilisant le registre PINL dans ce cas.

Le fragment de code pour tas boucle sera quelque chose comme:
Code: [Select]

unsigned long startTime[8];
...
void loop () {
...
 unsigned long isNow = micros();

 static uint8_t lastPinL = 0;
 uint8_t currPinL = PINL;  // Lire toutes les entrées
 unit8_t changed = currPinL ^ lastPinL;
 uint8_t newHigh = changedPinL & currPinL;
 uint8_t newLow = changedPinL & lastPinL;

 // Traiter les signaux qui viennent de commencer
 if (newHigh) {
   for (int8_t i = 0; i < 8; i++) {
     if (newHigh & (1 << i)) {
       startTime[i] = isNow;
     }  
   }
 }

 // Traiter les signaux qui viennent de finir
 if (newLow) {
   for (int8_t i = 0; i < 8; i++) {
     if (newLow & (1 << i)) {
       unsined long duree = isNow - startTime[i];
       // Identifier la voiture à base de la durée etc.
       ...
     }  
   }
 }
 lastPinL = currPinL;  // Sauver valeur pour prochain tour
 ...
}


Ce code n'est, comme toujours, pas testé de tout et peut être optimisé.

Peut-être ça t'aide un peu.

Korman

Jean-François

#2
Feb 09, 2011, 03:25 pm Last Edit: Feb 09, 2011, 03:35 pm by Jean-François Reason: 1
Juste un problème.... qu'advient t'il si les 8 voitures (ou même simplement 2) passent en même temps avec 0,01/1000 de secondes de décalage entre chaque (c'est purement hypothétique  :smiley-mr-green:).

Mon avis est que tu devrais avoir une horloge RTC et autant d'Arduino que de voiture à contrôler, plus un Arduino qui te servirait à centraliser tout ça.
Tu peux faire des standalone pour limiter les couts.
Ainsi la programmation par module serait simplifiée et seul reste un peu compliqué la gestion de la communication et de l'horloge.
MacBook intel core 2 duo  os X snow Leopard 10.6
 eMac PPc G4  os X Leopard 10.5
powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Korman


Juste un problème.... qu'advient t'il si les 8 voitures passent en même temps avec 0,01/1000 de secondes de décalage entre chaque (c'est purement hypothétique  :smiley-mr-green:).


Tout simple: si les signaux ont commencé dans la même itération de la boucle, les voitures sont passées en même temps. La valeur de startTime te donnes le temps de passage. Mais c'est plutôt hypothétique,  comme 10µs à 100km/h sont une différence de 0.28mm.

Korman

Jean-François

#4
Feb 09, 2011, 03:44 pm Last Edit: Feb 09, 2011, 05:22 pm by Jean-François Reason: 1
Oui, comme je le disais cela reste hypothétique, mais c'est un constat d'une lacune du système envisagé et c'est une question à soulever.

On est pas en F1.... mais dans un grand prix ces 0,28 mm ferait toute la différence, après il faut voir si l'on se contente de cette précision.

Je maintiens que la méthode envisagée n'est pas la bonne.

Combien de temps dure la reconnaissance d'une voiture au moment de son passage ?
Ou plutôt combien de temps met l'Arduino pour être prêt à détecter la voiture suivante lors du passage d'une voiture.
Si les voitures sont trop près l'une de l'autre, la seconde voiture pourrait ne pas être prise en compte.....

C'est toujours hypothétique....  XD
MacBook intel core 2 duo  os X snow Leopard 10.6
 eMac PPc G4  os X Leopard 10.5
powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Go Up