Sylvain Mahé Le site Web Retour à l'accueil Principes Partager mes idées et mes projets librement et gratuitement. Thématiques Mécatronique du système embarqué, artisanat pluridisciplinaire, bricolage commun, esthétique logicielle et matérielle, minimalisme fonctionnel, conceptualisation alternative, rédaction technique et littéraire, partage pédagogique documenté. Contact ✆ Téléphone : 06.45.49.96.98
✉ E-mail : contact@sylvainmahe.site
✎ Site Web : sylvainmahe.site
Écriture de la page : Sylvain Mahé
Mesurer une période avec la classe Period La classe Period permet en un minium de lignes de programmation d'effectuer des mesures avec une relative précision (pour le microcontrôleur utilisé) du temps écoulé entre chaque appels à une fonction, qui en interne se charge de soustraire le temps écoulé courant par rapport au temps écoulé précédent. La seule contrainte technique pour vos projets est la suivante : La durée de la période doit être supérieure au temps d'exécution des fonctions mises en œuvre dans le programme (nous ne sommes pas en matériel pur, mais bien en logiciel). Exemple d'utilisation de la classe Period : #include <Period.h> int main() { Period myPeriod = Period(); while (true) { myPeriod.state(); //myPeriod.s est la période mesurée en secondes //myPeriod.ms est la période mesurée en millisecondes //myPeriod.us est la période mesurée en microsecondes } return 0; } Dans l'exemple ci-dessus, un objet myPeriod de type Period est déclaré, ne prenant aucun paramètre, il sert uniquement à stocker et calculer des temps écoulés. Plus loin dans la boucle while, la fonction state de l'objet myPeriod est appelée ce qui permet d'initialiser une première fois le temps courant, celui-ci devenant le temps précédent aux tours de boucle suivants en étant soustrait à de nouveaux temps courants pour en déduire la période. Tout ceci est invisible au programmeur, et a pour effet de mettre à jour les variables s (secondes), ms (millisecondes), et us (microsecondes) que vous pourrez utiliser par la suite dans votre programme. L'exemple présenté ici avec la classe Period est simple, peut être effectué via quelques calculs à l'aide de la classe Timer, mais dans ce cas présent offre l'avantage d'avoir ce principe intégré dans son fonctionnement ce qui simplifie la programmation. Pour mesurer la périodicité d'un phénomène il est vivement recommandé d'utiliser les interruptions de programme. En effet, la spontanéité du principe même des interruptions (quelques cycles d'horloges tout au plus) permet de mesurer avec une relative précision (pour le microcontrôleur utilisé) un phénomène périodique. Exemple de mesure d'un phénomène périodique avec les interruptions : #include <InterruptRead.h> #include <Period.h> Period _myPeriod = Period(); void myEvent() { _myPeriod.state(); } int main() { InterruptRead myInterrupt = InterruptRead (3); myInterrupt.start (myEvent, true, false); while (true) { //_myPeriod.s est la période mesurée en secondes //_myPeriod.ms est la période mesurée en millisecondes //_myPeriod.us est la période mesurée en microsecondes } return 0; } Dans cet exemple la fonction state de l'objet _myPeriod est appelée dans la fonction myEvent exécutée lors d'une interruption. Comme l'exemple précédent, ceci mettra à jour les variables s (secondes), ms (millisecondes), et us (microsecondes) que vous pourrez utiliser par la suite dans votre programme. En exemple d'application, ce programme pourrait être associé à un capteur à effet Hall connecté au port GPIO 3 de l'automate programmable, ce qui permettrait par exemple de mesurer la période de rotation d'un moteur pour en déduire le nombre de tours par minute. Autre fonction disponible : Une fonction supplémentaire reset permet de réinitialiser les variables s, ms, et us, ainsi que le dernier temps (précédent) calculé en interne dans le fonctionnement de la classe, ceci ayant pour but une remise à zéro, ou retour aux conditions initiales des mesures périodiques effectuées. Références : Récapitulatif des fonctions et variables de cette classe : unsigned long long s = 0; unsigned long long ms = 0; unsigned long long us = 0; Period(); void state(); void reset();