Salut,
Je pense qu'il y a trop (beaucoup trop) de questions dans ton message Par exemple, je sais ce qu'est un mélangeur et comment il fonctionne (signal reçu (RF), oscillateur local (LO), les fréquences intermédiaire (IF) + la fréquence image etc...) et pour autant je ne comprends pas ce que tu essayes de faire ? Un fréquencemètre ça compte simplement les périodes.
Comment faire un fréquencemètre avec un microcontrôleur ? (Certain micro ont des choses internes qui facilitent la vie mais comme je ne les connais pas tous, je vais rester générique).
1) Régler l'horloge interne de son micro. Idéalement sur un quartz externe (car très précis) si le hardware le prévoit puis configurer tous les diviseurs (ou autres prescaler internes) afin de connaître exactement la fréquence interne du micro.
2) Régler un Timer sur la fréquence interne du micro par exemple, ou sur un multiple de cette fréquence interne en réglant des diviseurs.
A partir de là, tu as un Timer qui va s'incrémenter de 0 à 65535 (2 octets) de manière très très précise puis qui va déborder, en repassant à 0, de manière extrêmement régulière et indéfiniment.
3) Régler son Timer pour qu'il déclenche une interruption à chaque débordement car c'est super important de savoir qu'il a fait un tour complet. On incrémentera une variable.
Maintenant, tu as un compteur autonome et précis qui tourne dans ton micro et il compte aussi le nombre de fois où il déborde. Pour fixer les idées, imaginons un quartz de 20MHz, un micro qui ne divise pas l'horloge interne donc 20MHz aussi et un Timer réglé sur le bus interne sans aucune division non plus, donc qui s'incrémente à 20MHz aussi. Ce Timer va démarrer à 0 puis s'incrémenter de 1 toutes les 50ns et arrivé à 65535 il se sera écoulé précisément 3,27675ms puis on recommence à 0 en ayant, juste avant, déclenché une interruption dans la quelle on incrémentera une variable pour compter les débordement.
Si d'un coup le programme principal prend un photographie du Timer et de cette variable et qu'il lit respectivement 705 et 3 voici ce qu'il faut comprendre ; 705 * 50ns = 35.25µs mais la variable qui compte les débordements est à 3 ce qui implique qu'il s'est déjà passé 3 * 3,27675ms = 9,83025ms. Donc au moment de la photo je sais qu'il s'est passé 9,83025ms + 35.25µs = 9,8655ms depuis le tout premier démarrage du Timer.
4) Régler un Timer en mode capture sur front montant et lui demander de déclencher une interruption pour être sur de ne louper aucun front.
Et c'est pour ainsi dire fini...Voici l'idée.
Au premier front montant, le programme va sauter dans une interruption qui aura pour rôle de prendre une photo du timer (qui tourne tout seul, indépendamment et de manière hyper précise) on dira photo 1. Au second front montant le programme va sauter à nouveau dans l'interruption qui prend une photo du timer, appelons là photo 2. Reste plus qu'a faire photo 2 - photo 1 et on connait quasi exactement le temps entre les deux fronts montant. Ce temps est la période et il suffit de faire 1 / par ce temps pour avoir la fréquence.
Après il peut y avoir plein de variante de fonctionnement. Est il utile de compter les débordements ? Si on connait à peu prés l'ordre de grandeur de la fréquence a mesurer, n'est il pas plus judicieux ici de régler plus finement le Timer pour pouvoir faire quelques chose de bien plus efficace : premier front montant = un RESET timer et second front montant = photo du Timer (on a la période) ainsi de suite. Si le Timer est bien réglé on a plus besoin de soustraction.
Partager