Objectifs
- Savoir mesurer la vitesse de rotation d’un moteur
- Savoir mesurer la fréquence d’un signal (deux méthodes)
- Savoir utiliser un tachymètre pour la mesure de la vitesse
- Savoir réduire l’erreur de la mesure
- Savoir mesurer la largeur d’une impulsion
- Etc.
Comment mesurer la vitesse de rotation ?
La mesure de la vitesse de rotation en (tr/min) est équivalente à la mesure de la fréquence de rotation en nombre de cycles par seconde (Hz). En effet, 60 tr/min est égale à 60 cycles/min=60 cycles/(60 secondes) = 1 Hz! D’une autre façon, la vitesse de rotation en (tr/min) et 60 fois inférieure à la fréquence de rotation en (Hz). Par conséquence, la mesure de vitesse est réduit à la mesure de la fréquence de rotation. Dans ce tuto, on va aborder deux fonctions qui vont nous permettre la mesure de la fréquence d’un signal tout ou rien, en particulier un signal carré. La formule de la vitesse en tours par minute (rpm) en Hertz (Hz) est donnée par F=N/60. Avec :
la fréquence en Hertz (Hz) la vitesse angulaire en tours par minute (rpm ou tr/min)
La fonction pulseIn()
La fonction pulseIn() comme son nom l’indique, elle permet de mesurer la largeur ou la durée d’une impulsion. Le type de l’impulsion peut être niveau bas ou niveau haut. Dans le cas d’un signal carré, les deux durées sont identiques. La fréquence est donc l’inverse de la somme des deux niveaux ou le double de l’un des deux. La fonction prend en entrée la numération du pin digital, le type du niveau ainsi le timeout (optionnel). Elle retourne la durée de l’impulsion en nombre de cycles en µS. Par exemple, si la valeur du retour est égale à 1000, alors la durée réelle de l’impulsion est égale à 1000*10^(-6)=1 ms. Par conséquent, la fréquence est égale à 1/(2*1ms)=500 Hz. Le timeout par défaut est égal à 1 seconde s’il n’est pas spécifié.
La fonction peu uniquement mesurée la fréquence dans un pin digital. Du coup, il faut lui fournir un signal ayant des niveaux compatibles avec la carte (0-5V, 0-3.3V, etc.). Ci-desosus la définiton de la fonction
Ci-dessous l’exemple du code utilisé pour la mesure de la fréquence du signal branché dans le pin squareOut+1 (voir le tuto pour plus de détails).
La fonction getFreqHz()
La fonction getFreqHz() est une fonction fait maison dédiée à la mesure directe de la fréquence d’un signal carré (ou non) branché dans un pin analogique. Elle est basée sur la fonction micros() pour la mesure du temps en µS. La fonction prend en entrée la numérotation du pin, anis le seuil maximale et le seuil minimal (non utilisé) de la détection. Si par exemple le signal branché dans le pin analogique varié entre 0 et 500. Alors, on peut définir un seuil maximal de l’ordre de la moitié de la dynamique (~250) afin de discriminer entre le niveau bas et le niveau haut réel du signal. Ensuite la fonction dérive le signal pour en extraire seulement le font montant (dérivée > seuil) ou le front descendant (dérivée <-seuil). De plus, un front est disponible par période. Par conséquent, on lance une temporisation T0=micros() à la détection du premier front, puis on mesure la fréquence au prochain front (F=1/(micros()-T0)), etc. Ci-dessous la définition de la fonction.
Attention : La fonction effectue une lecture du signal par appel. Alors, il faut faire des multiples appels qui garantissent la détection de la transition du signal et garantir une bonne résolution de la mesure. La mise à jour la fréquence ne s’effectuée qu’à la détection d’une transition. Il ne faut pas intégrer aussi les retards dans la boucle qui peuvent prolonger la durée de la détection et introduire des fausses mesures.
Programme complet
N’oublier de nous laisser un commentaire 🙂