Table des matières:
- Étape 1: Considérations techniques
- Étape 2: Composants requis
- Étape 3: Construction
- Étape 4: le code
- Étape 5: Utilisation
Vidéo: Générateur de formes d'onde Arduino : 5 étapes (avec images)
2024 Auteur: John Day | [email protected]. Dernière modifié: 2024-01-30 09:06
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
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é:
Fonction DIY/Générateur de forme d'onde : 6 étapes (avec photos)
Générateur de fonction/forme d'onde DIY : Dans ce projet, nous examinerons brièvement les générateurs de fonction/forme d'onde commerciaux afin de déterminer quelles fonctionnalités sont importantes pour une version DIY. Ensuite, je vais vous montrer comment créer un générateur de fonctions simple, l'analogique et le chiffre
Générateur de musique basé sur la météo (Générateur Midi basé sur ESP8266): 4 étapes (avec images)
Générateur de musique basé sur la météo (Générateur Midi basé sur ESP8266): Bonjour, aujourd'hui, je vais vous expliquer comment créer votre propre petit générateur de musique basé sur la météo. Il est basé sur un ESP8266, qui ressemble un peu à un Arduino, et il réagit à la température, à la pluie et l'intensité lumineuse. Ne vous attendez pas à ce qu'il fasse des chansons entières ou un programme d'accords
Générateur d'onde sinusoïdale triphasée basé sur Arduino Due : 5 étapes
Générateur d'onde sinusoïdale à 3 phases basé sur Arduino Due : le but de ce partage est d'aider quelqu'un qui essaie d'utiliser les meilleures performances de Due + le manque de référence + la fiche technique non utile. Ce projet est capable de générer jusqu'à 3 phases d'onde sinusoïdale @ 256 échantillons / cycle à basse fréquence (<1kHz) et 16 s
Générateur de formes d'onde à faible coût (0 - 20 MHz) : 20 étapes (avec images)
Générateur de forme d'onde à faible coût (0 - 20MHz): ABSTRATH Ce projet vient de la nécessité d'obtenir un générateur d'onde avec une bande passante supérieure à 10 Mhz et une distorsion harmonique inférieure à 1%, le tout avec un prix de revient bas. Ce document décrit une conception d'un générateur d'ondes avec une bande passante supérieure
Support pour ordinateur portable Wave (création de formes 3D dans Illustrator) : 8 étapes (avec images)
Support pour ordinateur portable Wave (création de formes 3D dans Illustrator) : je voulais un support pour ordinateur portable plus agréable. Je voulais faire quelque chose avec une belle forme organique. Et je travaille chez Instructables, j'ai donc accès à un superbe découpeur laser Epilog. La forme que vous voyez dans les images ci-dessous est le résultat. Je suis plutôt content