Ardu? No!Bric-à-brac ≫ Mesure d'une fréquence

Mesure d'une fréquence avec une Uno

Pour mesurer la fréquence ou la période d'un signal avec un microcontrôleur, il y a deux mesures possibles:
- on fait une mesure directe de la fréquence (on compte le nombre de fronts montants par unité de temps), et on peut en déduire par calcul la période
- on fait une mesure de la période (on mesure le temps entre deux fronts montants) et on peut en déduire par calcul aussi la fréquence.

Du fait de la résolution de 62,5 ns d'une Uno, on voit tout de suite que pour des périodes de l'ordre de 500ns, on n'aura pas un bon résultat si on mesure une seule période. Si on compte les périodes d'un signal voisinant les 10 hertz, en comptant le nombre de fronts montants sur 1 s, je vais trouver 9 ou 10 et la mesure n'est pas fameuse. En fait compter le nombre de périodes peut toujours donner un bon résultat car l'horloge est précise mais à une mauvaise résolution. Mais pour avoir une mesure à 0,1% d'un signal à 1 Hz, il faut 1000 périodes, soit 1000 secondes (environ 1/4 d'heure). Dans ce cas, il vaut mieux mesurer la période que la fréquence.

La question qui peut se poser est si il vaut mieux mesurer la période ou la fréquence.

Si je dispose d'un temps infini pour faire la mesure, il suffirait de mesurer la fréquence avec un temps très long pour les fréquences faibles. Mais en général, on veut avoir une mesure dans un laps de temps maximum donné. Par exemple, je veux faire un affichage de cette fréquence toutes les secondes. Plus souvent, on a un affichage qui clignote et c'est désagréable). Dans ce cas, je vais chercher quand la mesure de la période est meilleure que celle de la fréquence. Le choix est uniquement ici un problème due à la résolution de la mesure, la précision de l'horloge va dégrader le résultat en pourcentage de la même façon pour les deux méthodes. Nous allons donc ignorer cette erreur qui s'ajoutera dans les deux cas.

Si on veut une mesure sur au maximum N secondes (par exemple N=1 si je veux un affichage toutes les secondes) avec une Uno capable de faire des mesures avec une résolution de t (compter 62,5ns avec un timer ou 125ns si on le fait avec des interruptions), et si le signal à mesurer a une période de T:
− si je mesure sa période, je vais compter jusqu'à T/t (plus ou moins 1)
− si je compte sa fréquence, il va y avoir N/T fronts montants en N secondes (plus ou moins 1)
Comme dans ces comptages je fais la même erreur (je compte à 1 près) plus les nombres sont grands, meilleure est la mesure. Si un des nombres est petit, l'autre mesure donnera un nombre plus grand et donc un meilleur résultat. La plus mauvaise mesure sera quand les deux nombres sont égaux: T/t=N/T soit pour T2=N/t soit T=√(N/t)

Application: je veux faire une mesure sur une Uno (t=62,5ns) qui ne dépasse pas 1 seconde. La limite est pour une période de T=√(1s/0,0000000625s) soit 250µs (4kHz)
− en dessous d'une période de 1s, je ne peux pas mesurer car je ne verrais pas une période complète
− pour les fréquences entre 1Hz et 4kHz, je dois mesurer la période, et j'aurais une précision qui va de 100/16.000.000% à 1Hz à 100x0,062µs/250µs (0,025%) à 4kHz.
− pour les fréquences supérieures à 4kHz, je compte pendant 1 seconde le nombre de périodes. à 4kHz, j'aurais une précision de 0,025% (100x0,000250s/1s) et si la fréquence augmente, la précision va augmenter.
− je serais sans doute limité par le comptage lui même, en passant directement par le timer, je dois être synchrone avec l'horloge système, je suppose que l'on ne doit pas pouvoir dépasser les 8MHz. Mais le compteur n'est que sur 16 bits. Avec les interruptions la routine va prendre dans les 5µs mini, et je serais limité à 200kHz. En combinant les deux, il est sans doute possible de mesurer jusqu'à 8 MHz mais je n'ai pas fait l'essai.

Pour faire un programme

On peu faire les deux mesure et ne garder que le plus grand nombre des deux: pour un signal de 2kHz, je vais compter 2000 périodes pendant une seconde (image de la fréquence), et pendant une période qui dure 500µs, je vais compter 500/0.0625=8000 coups d'horloge système. 8000 étant plus grand que 2000, je garde 8000. Je dis alors que la période vaut 8000 fois 62.5ns et que la fréquence c'est l'inverse de cette valeur. Mais en faisant cela, li peut me falloir jusqu'à 2 secondes de mesure.

Pour améliorer les choses, on mesure la période et si on trouve moins que 250µs, on mesure la fréquence.

Il y a de l'aspirine dans le placard.