Table des matières:

Comment mesurer simultanément la haute fréquence et le cycle de service à l'aide d'un microcontrôleur : 4 étapes
Comment mesurer simultanément la haute fréquence et le cycle de service à l'aide d'un microcontrôleur : 4 étapes

Vidéo: Comment mesurer simultanément la haute fréquence et le cycle de service à l'aide d'un microcontrôleur : 4 étapes

Vidéo: Comment mesurer simultanément la haute fréquence et le cycle de service à l'aide d'un microcontrôleur : 4 étapes
Vidéo: Initiation aux Microprocesseurs / Microcontrôleurs / FPGA -Architectures, Fonctionnement, Couscous 2024, Novembre
Anonim
Comment mesurer la haute fréquence et le cycle de service, simultanément, à l'aide d'un microcontrôleur
Comment mesurer la haute fréquence et le cycle de service, simultanément, à l'aide d'un microcontrôleur
Comment mesurer la haute fréquence et le cycle de service, simultanément, à l'aide d'un microcontrôleur
Comment mesurer la haute fréquence et le cycle de service, simultanément, à l'aide d'un microcontrôleur
Comment mesurer la haute fréquence et le cycle de service, simultanément, à l'aide d'un microcontrôleur
Comment mesurer la haute fréquence et le cycle de service, simultanément, à l'aide d'un microcontrôleur

Je sais ce que vous pensez: « Hein ? Il y a beaucoup d'Instructables sur la façon d'utiliser des microcontrôleurs pour mesurer la fréquence du signal. Bâillement. Mais attendez, il y a une nouveauté dans celui-ci: je décris une méthode de mesure de fréquences bien supérieures à ce qu'un microcontrôleur (MCU) peut supporter et le rapport cyclique du signal - le tout en même temps !

La plage de fréquences de l'appareil s'étend de ~43 Hz à ~450 kHz, tandis que le cycle de service varie de 1 % à 99 %.

Permettez-moi d'expliquer la partie "peut supporter": un MCU mesure la période d'un signal d'onde carrée, T, en suivant le temps entre deux événements de transition ultérieurs. Par exemple, une tension faible à élevée saute sur l'une de ses broches d'E/S. Il le fait en comptant le nombre d'impulsions de sa propre horloge interne. Naïvement, la limite supérieure des fréquences mesurées devrait obéir au théorème d'échantillonnage de Nyqvist-Shannon; c'est-à-dire qu'elle serait à peu près égale à la moitié de la fréquence d'horloge des MCU. En réalité, la limite est beaucoup, beaucoup plus basse, car le MCU doit exécuter du code pour gérer les interruptions, enregistrer les variables, effectuer des opérations arithmétiques, afficher les résultats, etc. Dans mes expériences avec un MCU à 48 MHz, le nombre minimal de cycles d'horloge entre les transitions mesurables était environ 106. Par conséquent, la limite supérieure de la gamme de fréquences mesurables dans ce cas serait de 48 000 / 212 / 2 = 226,4 kHz.

Alors que le MCU mesure la période du signal, il peut également déterminer sa largeur d'impulsion, P: le temps pendant lequel la tension du signal reste élevée. En d'autres termes, le temps entre les transitions bas-à-haut et haut-bas. Le rapport cyclique du signal est alors défini comme le pourcentage suivant:

Devoir = 100% * P/T

Tout comme dans le cas de la fréquence, il existe une limite pratique sur la largeur d'impulsion. En utilisant l'exemple ci-dessus, 106 cycles d'horloge limiteraient la largeur d'impulsion à pas moins de 2,21 microsecondes. Soit pas moins de 50 % à 226,4 kHz.

L'un des moyens d'augmenter la limite de fréquence supérieure des signaux d'onde carrée est l'application de diviseurs numériques qui utilisent des bascules. Diviser la fréquence d'entrée par n étendrait la plage supérieure mesurable n fois. C'est une excellente nouvelle, les diviseurs numériques ont un défaut fondamental: le signal divisé perd les informations sur la largeur d'impulsion (et le rapport cyclique) ! En raison de la façon dont les diviseurs fonctionnent, leur sortie a toujours un facteur de marche de 50 %. Dommage…

Dans les pages suivantes, cependant, je montrerai comment diviser numériquement la fréquence et préserver la largeur d'impulsion d'origine me permettant de mesurer des signaux bien au-delà des limites imposées par le comptage direct.

Étape 1: Division de fréquence numérique

Division de fréquence numérique
Division de fréquence numérique
Division de fréquence numérique
Division de fréquence numérique
Division de fréquence numérique
Division de fréquence numérique

Les diviseurs de fréquence numériques traditionnels utilisent des bascules; ce tutoriel explique bien les principes de construction de diviseurs à l'aide de bascules JK standard. Cela résout le problème des fréquences d'entrée trop élevées pour le MCU, mais présente un inconvénient majeur: le signal divisé a un cycle de service de 50 % quel que soit le service du signal d'entrée ! Pour voir pourquoi c'est le cas, regardez les deux premiers chiffres. Le signal d'origine avec une période T et une largeur d'impulsion P est introduit dans la broche d'horloge d'une bascule JK tandis que ses broches J et K sont maintenues hautes à tout moment (première figure). Une logique de 3,3 V est supposée tout au long. Supposons que la bascule est déclenchée par le front positif (c'est-à-dire montant) de l'horloge. Dans ces conditions, des changements d'état de la broche de sortie ("flips" et "flops" individuels) se produisent chaque fois que la broche d'horloge passe de bas en haut. La transition de haut en bas de l'horloge (c'est-à-dire le front négatif) est complètement ignorée. Voir la deuxième figure. La broche de sortie, Q, émet un signal dont la période est deux fois plus longue que la période d'origine, c'est-à-dire que sa fréquence est réduite de moitié. La largeur d'impulsion de la sortie est toujours égale à T. Par conséquent, la largeur d'impulsion d'origine, P, est perdue.

L'ajout d'une autre bascule JK dans une configuration illustrée dans la troisième figure divise la fréquence d'origine par 4. L'ajout de bascules supplémentaires de la même manière séquentielle divise la fréquence par les puissances suivantes de 2: 8, 16, 32, etc.

Problème: comment diviser la fréquence d'une onde carrée tout en préservant sa largeur d'impulsion ?

L'idée est d'ajouter correctement une bascule JK déclenchée par un front négatif au mix. Appelons-le "Neg FF"; voir quatrième figure. Ici, "correctement" signifie que les broches J et K de la nouvelle bascule sont liées aux broches de sortie Q et Qbar, respectivement, du diviseur par 4 ("Pos FF") illustré dans la figure précédente. (Ici, "bar" est la barre horizontale au-dessus du symbole Q indiquant une négation logique.) Pour voir ce que cela permet, jetez un œil à la table des fonctions du "Neg FF" dans la cinquième figure: broches de sortie de Neg, Q et Qbar, reflète l'état de ses broches d'entrée, J et K, respectivement. Ce qui signifie qu'ils reflètent l'état du Pos' Q et Qbar. Mais, l'action de bascule de Neg doit attendre le front négatif du signal d'origine, qui arrive au temps P après le front positif. Ah !

Les formes d'onde résultantes sont illustrées dans la sixième figure. "Pos Q" produit un signal à la fréquence 1/4, "Pos Qbar" est inverse, "Neg Q" suit "Pos Q" décalé de la largeur d'impulsion P et "Neg Qbar" est son inverse. Vous pouvez vérifier que le ET logique de "Pos Qbar" et "Neg Q" produit un train d'impulsions caractérisé par la largeur d'impulsion d'origine P et 1/4 de la fréquence. Bingo !

Au début, j'ai utilisé exactement ce signal de sortie pour alimenter le MCU. Cependant, cela s'est avéré problématique pour des largeurs d'impulsion très courtes en raison de la limitation de 106 cycles du MCU mentionnée dans l'introduction. J'ai résolu ce petit problème en choisissant une autre sortie: "Pos Qbar" ET "Neg Qbar" à la place. Un coup d'œil aux formes d'onde devrait vous convaincre que la largeur d'impulsion de cette forme d'onde particulière, P', varie entre T et 2T au lieu de (0, T) pour P. Le P peut être facilement récupéré à partir de P' en:

P = 2T - P'

Étape 2: Matériel recommandé

Matériel recommandé
Matériel recommandé
Matériel recommandé
Matériel recommandé
Matériel recommandé
Matériel recommandé

J'aime vraiment le nouveau venu pour les amateurs d'électronique: les microcontrôleurs Atmel SAM D21 basés sur le processeur ARM Cortex M0+ 32 bits fonctionnant à une fréquence d'horloge de 48 MHz, beaucoup plus élevée que les anciens Atmels. Pour ce projet j'ai acheté:

  • Carte MCU ItsyBitsy M0 Express d'Adafruit
  • J'avais une batterie LiPo rechargeable d'Adafruit
  • Écran OLED monochrome 128x32 SPI (vous l'aurez deviné: Adafruit)
  • Double bascule JK déclenchée sur front positif SN74HC109 de Texas Instruments
  • Double bascule JK déclenchée sur front négatif SN74HC112 de Texas Instruments
  • Quadruple ET porte CD74AC08E de Texas Instruments
  • Quadruple OU porte CD74AC32E de Texas Instruments

Étape 3: Le circuit

Le circuit
Le circuit
Le circuit
Le circuit

La première figure montre un schéma simplifié du fréquencemètre/dutymètre. La logique CMOS 3,3 V est supposée partout. Par conséquent, l'amplitude de l'onde carrée d'entrée doit être comprise entre le V correspondantHI (c'est-à-dire 2 V) et 3,3 V. Sinon, vous devez l'augmenter ou le réduire en conséquence. Dans la plupart des cas, un simple diviseur de tension suffirait. Si vous souhaitez concevoir votre version du compteur à un niveau logique différent, vous devez utiliser un autre microcontrôleur (MCU), une batterie et un écran qui fonctionnent au niveau souhaité. Les portes logiques et les bascules utilisées dans ce projet fonctionnent avec des niveaux logiques compris entre 2 V et 6 V et devraient fonctionner correctement dans la plupart des cas.

Comme indiqué, le MCU ItsyBitsy utilise les broches 9 à 13 pour communiquer avec l'écran via le protocole logiciel SPI. La broche 3V alimente l'ensemble du circuit. La broche d'entrée numérique 3 accepte le signal analysé, tandis que les broches 2 et 4 contrôlent la source du signal: soit un signal direct provenant de la porte AND3 (fréquences d'entrée basses), soit un signal divisé par 4 via la porte AND4 (fréquences d'entrée élevées) comme décrit à l'étape 2 Le code, abordé à l'étape suivante, détecte automatiquement la gamme de fréquences entrantes et commute de manière appropriée la source du signal.

Le schéma ne montre pas la véritable complexité des connexions de puces numériques. La deuxième image montre à quoi ressemblerait le projet sur une maquette. Le signal d'entrée passe par un fil rouge jusqu'à la broche 2CLK de la bascule à double front positif. ATTENTION: Normalement, toutes les broches J et K de cette bascule doivent être maintenues hautes, mais SN74HC109 en particulier comporte la broche Kbar - une broche K inversée - à la place. Par conséquent, cette broche doit être mise à la terre ! La première bascule à front négatif du SN74HC112 a ses broches 1K et 1J connectées aux broches 1Q et 1Qbar du SN74HC109. La deuxième bascule du SN74HC112 est inutilisée et ses broches d'entrée (2K, 2J, 2CLRbar) sont mises à la terre. Toutes les autres broches supplémentaires PREbar (préréglé) et CLRbar (clair) dans toutes les bascules doivent être connectées au niveau logique haut. Les broches d'horloge et de sortie non utilisées ne sont pas connectées. De même, les broches d'entrée inutilisées de toutes les portes sont mises à la terre, tandis que les broches de sortie inutilisées restent non connectées. Comme je l'ai discuté dans mon Instructable « Invisible Killer of the Phone Ring », la mise à la terre des broches d'entrée inutilisées des puces logiques élimine les oscillations aléatoires et économise l'énergie de la batterie.

Étape 4: Le code et la mesure des basses fréquences

Naturellement, toute l'action se passe dans le code lié ci-dessous. Lorsque l'entrée entrante sur la broche 3 passe du numérique bas au haut, le MCU commence à compter les impulsions de son horloge interne de 48 MHz. Il note le moment de la transition de haut en bas et continue le décompte jusqu'au prochain commutateur bas à haut, lorsqu'il redémarre l'ensemble du processus. Le premier compte représente la largeur d'impulsion, tandis que le compte entier représente la période du signal. Et c'est tout le secret.

La CPU note ces transitions via des interruptions matérielles. Le SAMD21 possède plusieurs horloges; mon code utilise un TC3. Au départ, j'ai commencé par lire la fiche technique du M0, ce qui me préparait à beaucoup d'efforts pour coder le gestionnaire d'interruption, mais j'ai rapidement découvert un code très similaire dans les messages du forum Arduino des utilisateurs electro_95, MartinL et Rucus dont la contribution est dûment reconnu. J'ai incorporé et modifié leur code combiné dans le mien; me fait gagner beaucoup de temps !

Comme je l'ai mentionné précédemment, la résolution du signal est limitée à environ 106 cycles CPU pour exécuter le code entre les interruptions. La division numérique avec préservation de la largeur d'impulsion prend en charge les hautes fréquences. Les basses fréquences, en revanche, posent un autre défi: comme le compteur d'horloge TC3 a une longueur de 16 bits, il déborde après avoir franchi la limite des 65 536 comptes. On peut gérer cette situation en ajoutant une interruption de débordement, mais en choisissant une solution différente: TC3 peut utiliser une horloge CPU pré-échelonnée (c'est-à-dire divisée par logiciel) au lieu de l'horloge matérielle 48 MHz. Ainsi, si la période du signal approche de la limite de débordement, le code peut demander à TC3 d'utiliser des comptes de 24 MHz pour la période suivante et, le tour est joué, le compteur tombe en dessous de 32 768 comptes. Pour des fréquences encore plus basses, le TC3 peut être chargé de compter des impulsions de 12 MHz, etc. Le pré-échelonneur approprié est automatiquement déterminé en fonction de la fréquence du signal, avec hystérésis, afin de maintenir le compteur TC3 dans la limite de débordement. En conséquence, l'extrémité inférieure de la plage de l'appareil est d'environ 43 Hz.

Vous êtes invités à dupliquer le code et à l'utiliser dans votre projet, mais veuillez mentionner sa source lors de la publication des résultats.

Lien vers le code.

Conseillé: