Table des matières:

Générateur de formes d'onde Arduino : 5 étapes (avec images)
Générateur de formes d'onde Arduino : 5 étapes (avec images)

Vidéo: Générateur de formes d'onde Arduino : 5 étapes (avec images)

Vidéo: Générateur de formes d'onde Arduino : 5 étapes (avec images)
Vidéo: Массимо Банци: Как Arduino пробуждает воображение 2024, Juillet
Anonim
Générateur de forme d'onde Arduino
Générateur de forme d'onde Arduino

Mise à jour de février 2021: découvrez la nouvelle version avec un taux d'échantillonnage 300x, basée sur le Raspberry Pi Pico

En laboratoire, on a souvent besoin d'un signal répétitif d'une certaine fréquence, forme et amplitude. Il peut s'agir de tester un amplificateur, vérifier un circuit, un composant ou un actionneur. De puissants générateurs de formes d'onde sont disponibles dans le commerce, mais il est relativement facile d'en créer un vous-même utile avec un Arduino Uno ou un Arduino Nano, voir par exemple:

www.instructables.com/id/Arduino-Waveform-…

www.instructables.com/id/10-Resister-Ardui…

Voici la description d'un autre avec les caractéristiques suivantes:

* Formes d'onde précises: sortie 8 bits utilisant R2R DAC, forme de 256 échantillons

* Rapide: taux d'échantillonnage de 381 kHz

* Précis: plage de fréquence par pas de 1 mHz. Aussi précis que le cristal Arduino.

* Opération facile: forme d'onde et fréquence réglables avec un seul encodeur rotatif

* Large gamme d'amplitudes: millivolts à 20V

* 20 formes d'onde prédéfinies. Simple pour ajouter plus.

* Facile à faire: Arduino Uno ou Nano plus composants standard

Étape 1: Considérations techniques

Faire un signal analogique

Un inconvénient des Arduino Uno et Nano est qu'ils ne disposent pas de convertisseur numérique-analogique (DAC), il n'est donc pas possible de lui faire sortir une tension analogique directement sur les broches. Une solution est l'échelle R2R: 8 broches numériques sont connectées à un réseau de résistances afin d'atteindre 256 niveaux de sortie. Grâce à l'accès direct au port, l'Arduino peut définir 8 broches simultanément avec une seule commande. Pour le réseau de résistances, 9 résistances de valeur R sont nécessaires et 8 de valeur 2R. J'ai utilisé 10kOhm comme valeur pour R, qui maintient le courant des broches à 0,5mA ou moins. Je suppose que R = 1kOhm pourrait également fonctionner, car l'Arduino peut facilement fournir 5mA par broche, 40mA par port. Il est important que le rapport entre les résistances R et 2R soit vraiment de 2. Cela se fait le plus facilement en mettant 2 résistances de valeur R en série, pour un total de 25 résistances.

Accumulateur de phases

Générer une forme d'onde revient ensuite à envoyer de manière répétitive une séquence de nombres de 8 bits aux broches Arduino. La forme d'onde est stockée dans un tableau de 256 octets et ce tableau est échantillonné et envoyé aux broches. La fréquence du signal de sortie est déterminée par la vitesse à laquelle on avance dans le réseau. Un moyen robuste, précis et élégant de le faire est d'utiliser un accumulateur de phase: un nombre de 32 bits est incrémenté à intervalles réguliers, et nous utilisons les 8 bits les plus significatifs comme index du tableau.

Échantillonnage rapide

Les interruptions permettent d'échantillonner à des moments bien définis, mais la surcharge des interruptions limite la fréquence d'échantillonnage à ~ 100 kHz. Une boucle infinie pour mettre à jour la phase, échantillonner la forme d'onde et régler les broches prend 42 cycles d'horloge, atteignant ainsi un taux d'échantillonnage de 16MHz/42=381kHz. Tourner ou pousser l'encodeur rotatif provoque un changement de broche et une interruption qui sort de la boucle pour changer le réglage (forme d'onde ou fréquence). A ce stade, les 256 nombres du tableau sont recalculés de sorte qu'aucun calcul réel de la forme d'onde n'ait besoin d'être effectué dans la boucle principale. La fréquence maximale absolue qui peut être générée est de 190 kHz (la moitié du taux d'échantillonnage) mais il n'y a alors que deux échantillons par période, donc pas beaucoup de contrôle de la forme. L'interface ne permet donc pas de régler la fréquence au dessus de 100kHz. À 50 kHz, il y a 7 à 8 échantillons par période et à 1,5 kHz et en dessous, les 256 nombres stockés dans la matrice sont échantillonnés à chaque période. Pour les formes d'onde où le signal change en douceur, par exemple l'onde sinusoïdale, sauter des échantillons n'est pas un problème. Mais pour les formes d'onde avec des pointes étroites, par exemple une onde carrée avec un faible rapport cyclique, il existe le risque que pour les fréquences supérieures à 1,5 kHz, l'absence d'un seul échantillon puisse entraîner un comportement incorrect de la forme d'onde.

Précision de la fréquence

Le nombre par lequel la phase est incrémentée à chaque échantillon est proportionnel à la fréquence. La fréquence peut ainsi être réglée avec une précision de 381kHz/2^32=0,089mHz. En pratique, une telle précision n'est pratiquement jamais nécessaire, de sorte que l'interface limite le réglage de la fréquence par pas de 1 mHz. La précision absolue de la fréquence est déterminée par la précision de la fréquence d'horloge Arduino. Cela dépend du type d'Arduino mais la plupart spécifient une fréquence de 16.000MHz, donc une précision de ~10^-4. Le code permet de modifier le rapport de la fréquence et de l'incrément de phase pour corriger les petits écarts de l'hypothèse 16MHz.

Tampon et amplification

Le réseau de résistances a une impédance de sortie élevée, de sorte que sa tension de sortie chute rapidement si une charge est connectée. Cela peut être résolu en tamponnant ou en amplifiant la sortie. Ici, la mise en mémoire tampon et l'amplification se font avec un ampli-op. J'ai utilisé le LM358 car j'en avais. Il s'agit d'un amplificateur opérationnel lent (taux de balayage de 0,5 V par microseconde), donc à haute fréquence et à haute amplitude, le signal est déformé. Une bonne chose est qu'il peut gérer des tensions très proches de 0V. La tension de sortie est cependant limitée à ~2V sous le rail, donc l'utilisation d'une alimentation +5V limite la tension de sortie à 3V. Les modules élévateurs sont compacts et bon marché. En alimentant +20V à l'ampli-op, il peut générer des signaux avec une tension allant jusqu'à 18V. (NB, le schéma indique LTC3105 car c'était la seule amélioration que j'ai trouvée dans Fritzing. En réalité, j'ai utilisé un module MT3608, voir les images dans les étapes suivantes). J'ai choisi d'appliquer une atténuation variable à la sortie du R2R DAC puis d'utiliser l'un des amplis op pour tamponner le signal sans amplification et l'autre pour amplifier par 5,7, afin que le signal puisse atteindre une sortie maximale d'environ 20V. Le courant de sortie est plutôt limité, ~10mA, donc un amplificateur plus puissant peut être nécessaire si le signal doit piloter un gros haut-parleur ou un électro-aimant.

Étape 2: Composants requis

Pour le générateur de signaux de base

Arduino Uno ou Nano

Écran LCD 16x2 + trimmer 20kOhm et résistance série 100Ohm pour le rétroéclairage

Encodeur rotatif à 5 broches (avec bouton-poussoir intégré)

25 résistances de 10kOhm

Pour le tampon/amplificateur

LM358 ou autre double opamp

module élévateur basé sur le MT3608

Résistance variable 50kOhm

Résistance 10kOhm

Résistance 47kOhm

Condensateur 1muF

Étape 3: Construction

Construction
Construction
Construction
Construction

J'ai tout soudé sur une carte prototype 7x9cm, comme indiqué sur la photo. Comme il y avait un peu de désordre avec tous les fils, j'ai essayé de colorer les fils qui transportent une tension positive en rouge et ceux qui transportent la terre en noir.

L'encodeur que j'ai utilisé a 5 broches, 3 d'un côté, 2 de l'autre. Le côté à 3 broches est l'encodeur proprement dit, le côté à 2 broches est le bouton poussoir intégré. Côté 3 broches, la broche centrale doit être connectée à la masse, les deux autres broches à D10 et D11. Du côté à 2 broches, une broche doit être connectée à la terre et l'autre à D12.

C'est la chose la plus moche que j'aie jamais faite mais ça marche. Ce serait bien de mettre dans un enclos, mais pour l'instant le travail supplémentaire et le coût ne le justifient pas vraiment. Le Nano et l'écran sont attachés avec des en-têtes de broche. Je ne referais pas ça si j'en construisais un nouveau. Je n'ai pas mis de connecteurs sur la carte pour capter les signaux. Au lieu de cela, je les ramasse avec des fils de crocodile provenant de morceaux de fil de cuivre saillants, étiquetés comme suit:

R - signal brut du R2R DAC

B - signal tamponné

A - signal amplifié

T - signal de minuterie de la broche 9

G - terre

+ - tension 'haute' positive du module élévateur

Étape 4: le code

Le code, un croquis Arduino, est joint et doit être téléchargé sur l'Arduino.

20 formes d'onde ont été prédéfinies. Il devrait être simple d'ajouter n'importe quelle autre vague. Notez que les vagues aléatoires remplissent le tableau de 256 valeurs avec des valeurs aléatoires, mais le même modèle se répète à chaque période. Les vrais signaux aléatoires ressemblent à du bruit, mais cette forme d'onde ressemble beaucoup plus à un sifflet.

Le code définit un signal de 1 kHz sur la broche D9 avec TIMER1. Ceci est utile pour vérifier la synchronisation du signal analogique. C'est ainsi que j'ai compris que le nombre de cycles d'horloge est de 42: si je suppose 41 ou 43 et que je génère un signal de 1 kHz, il a clairement une fréquence différente de celle du signal sur la broche D9. Avec la valeur 42, ils correspondent parfaitement.

Normalement, l'Arduino interrompt toutes les millisecondes pour garder une trace du temps avec la fonction millis(). Cela perturberait la génération précise du signal, de sorte que l'interruption particulière est désactivée.

Le compilateur dit: "Sketch utilise 7254 octets (23 %) d'espace de stockage du programme. Le maximum est de 30720 octets. Les variables globales utilisent 483 octets (23 %) de mémoire dynamique, laissant 1565 octets pour les variables locales. Le maximum est de 2048 octets." Il y a donc amplement d'espace pour un code plus sophistiqué. Attention, vous devrez peut-être choisir "ATmega328P (ancien chargeur de démarrage)" pour télécharger avec succès sur le Nano.

Étape 5: Utilisation

Le générateur de signal peut être alimenté simplement via le câble mini-USB de l'Arduino Nano. Il est préférable de le faire avec une banque d'alimentation, de sorte qu'il n'y ait pas de boucle de masse accidentelle avec l'appareil auquel il peut être connecté.

Lorsqu'il est allumé, il génère une onde sinusoïdale de 100 Hz. En tournant le bouton, l'un des 20 autres types d'ondes peut être choisi. En tournant tout en maintenant enfoncé, le curseur peut être réglé sur l'un des chiffres de la fréquence, qui peut ensuite être modifié à la valeur souhaitée.

L'amplitude peut être réglée avec le potentiomètre et le signal tamponné ou amplifié peut être utilisé.

Il est vraiment utile d'utiliser un oscilloscope pour vérifier l'amplitude du signal, en particulier lorsque le signal fournit du courant à un autre appareil. Si trop de courant est tiré, le signal écrêtera et le signal sera fortement déformé

Pour les très basses fréquences, la sortie peut être visualisée avec une LED en série avec une résistance de 10kOhm. Les fréquences audio peuvent être entendues avec un haut-parleur. Assurez-vous de régler le signal très petit ~ 0,5 V, sinon le courant devient trop élevé et le signal commence à saturer.

Conseillé: