Inhaltsverzeichnis:

Arduino Wellenformgenerator - Gunook
Arduino Wellenformgenerator - Gunook

Video: Arduino Wellenformgenerator - Gunook

Video: Arduino Wellenformgenerator - Gunook
Video: Cheap DIY Waveform Generator with TFT - Part 1 2024, Juli
Anonim
Arduino-Wellenformgenerator
Arduino-Wellenformgenerator

Update Feb. 2021: Testen Sie die neue Version mit 300-facher Abtastrate, basierend auf dem Raspberry Pi Pico

Im Labor benötigt man oft ein sich wiederholendes Signal einer bestimmten Frequenz, Form und Amplitude. Es kann sein, einen Verstärker zu testen, eine Schaltung, ein Bauteil oder einen Aktor zu überprüfen. Leistungsstarke Wellenformgeneratoren sind im Handel erhältlich, aber es ist relativ einfach, mit einem Arduino Uno oder Arduino Nano selbst einen nützlichen zu erstellen, siehe zum Beispiel:

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

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

Hier ist die Beschreibung eines anderen mit den folgenden Funktionen:

* Präzise Wellenformen: 8-Bit-Ausgabe mit R2R-DAC, 256-Sample-Form

* Schnell: 381 kHz Abtastrate

* Präzise: Frequenzbereich in 1-mHz-Schritten. So genau wie der Arduino-Kristall.

* Einfache Bedienung: Wellenform und Frequenz einstellbar mit einem einzigen Drehgeber

* Breiter Amplitudenbereich: Millivolt bis 20V

* 20 vordefinierte Wellenformen. Einfach mehr hinzufügen.

* Einfach zu machen: Arduino Uno oder Nano plus Standardkomponenten

Schritt 1: Technische Überlegungen

Ein analoges Signal erzeugen

Ein Manko des Arduino Uno und Nano besteht darin, dass es keinen Digital-Analog (DAC)-Wandler hat, so dass es nicht möglich ist, eine analoge Spannung direkt an den Pins auszugeben. Eine Lösung ist die R2R-Leiter: 8 digitale Pins werden mit einem Widerstandsnetzwerk verbunden, sodass 256 Ausgangspegel erreicht werden können. Durch direkten Portzugriff kann der Arduino mit einem einzigen Befehl 8 Pins gleichzeitig setzen. Für das Widerstandsnetzwerk werden 9 Widerstände mit dem Wert R und 8 mit dem Wert 2R benötigt. Ich habe 10kOhm als Wert für R verwendet, der den Strom von den Pins auf 0,5mA oder weniger hält. Ich denke, R = 1 kOhm könnte auch funktionieren, da der Arduino problemlos 5 mA pro Pin und 40 mA pro Port liefern kann. Es ist wichtig, dass das Verhältnis zwischen den Widerständen R und 2R wirklich 2 beträgt. Dies wird am einfachsten erreicht, indem 2 Widerstände mit dem Wert R in Reihe geschaltet werden, also insgesamt 25 Widerstände.

Phasenakkumulator

Das Generieren einer Wellenform läuft dann darauf hinaus, wiederholt eine Folge von 8-Bit-Zahlen an die Arduino-Pins zu senden. Die Wellenform wird in einem Array von 256 Byte gespeichert und dieses Array wird abgetastet und an die Pins gesendet. Die Frequenz des Ausgangssignals wird dadurch bestimmt, wie schnell man durch das Array geht. Ein robuster, präziser und eleganter Weg, dies zu tun, ist ein Phasenakkumulator: Eine 32-Bit-Zahl wird in regelmäßigen Abständen inkrementiert, und wir verwenden die 8 höchstwertigen Bits als Index des Arrays.

Schnelle Probenahme

Interrupts ermöglichen das Abtasten zu genau definierten Zeiten, aber der Overhead von Interrupts begrenzt die Abtastfrequenz auf ~100 kHz. Eine Endlosschleife zum Aktualisieren der Phase, Abtasten der Wellenform und Setzen der Pins benötigt 42 Taktzyklen, wodurch eine Abtastrate von 16MHz/42=381kHz erreicht wird. Das Drehen oder Drücken des Drehgebers bewirkt eine Pinänderung und einen Interrupt, der aus der Schleife herauskommt, um die Einstellung (Wellenform oder Frequenz) zu ändern. In diesem Stadium werden die 256 Zahlen im Array neu berechnet, sodass keine tatsächlichen Berechnungen der Wellenform in der Hauptschleife durchgeführt werden müssen. Die absolute maximale Frequenz, die erzeugt werden kann, beträgt 190 kHz (die Hälfte der Abtastrate), aber dann gibt es nur zwei Abtastungen pro Periode, also nicht viel Kontrolle über die Form. Die Schnittstelle erlaubt somit keine Frequenzeinstellung über 100kHz. Bei 50 kHz gibt es 7-8 Abtastungen pro Periode und bei 1,5 kHz und darunter werden alle 256 im Array gespeicherten Zahlen pro Periode abgetastet. Bei Wellenformen, bei denen sich das Signal sanft ändert, zum Beispiel bei der Sinuswelle, ist das Überspringen von Samples kein Problem. Bei Wellenformen mit schmalen Spitzen, beispielsweise einer Rechteckwelle mit kleinem Tastverhältnis, besteht jedoch die Gefahr, dass bei Frequenzen über 1,5 kHz das Fehlen eines einzelnen Abtastwertes dazu führen kann, dass sich die Wellenform nicht wie erwartet verhält

Genauigkeit der Frequenz

Die Zahl, um die die Phase bei jedem Abtastwert erhöht wird, ist proportional zur Frequenz. Die Frequenz kann somit auf eine Genauigkeit von 381kHz/2^32=0,089mHz eingestellt werden. In der Praxis wird eine solche Genauigkeit kaum benötigt, daher beschränkt sich die Schnittstelle darauf, die Frequenz in Schritten von 1 MHz einzustellen. Die absolute Genauigkeit der Frequenz wird durch die Genauigkeit der Arduino-Taktfrequenz bestimmt. Dies hängt vom Arduino-Typ ab, aber die meisten geben eine Frequenz von 16.000MHz an, also eine Genauigkeit von ~10^-4. Der Code ermöglicht es, das Verhältnis der Frequenz und des Phaseninkrements zu modifizieren, um kleine Abweichungen von der 16-MHz-Annahme zu korrigieren.

Pufferung und Verstärkung

Das Widerstandsnetzwerk hat eine hohe Ausgangsimpedanz, sodass seine Ausgangsspannung schnell abfällt, wenn eine Last angeschlossen wird. Das kann durch Puffern oder Verstärken der Ausgabe gelöst werden. Hier erfolgt die Pufferung und Verstärkung mit einem Operationsverstärker. Ich habe den LM358 verwendet, weil ich welche hatte. Es handelt sich um einen langsamen Operationsverstärker (Slew-Rate 0,5 V pro Mikrosekunde), sodass das Signal bei hoher Frequenz und hoher Amplitude verzerrt wird. Eine gute Sache ist, dass es Spannungen nahe 0V verarbeiten kann. Die Ausgangsspannung ist jedoch auf ~ 2 V unterhalb der Schiene begrenzt, so dass die Verwendung von + 5 V Leistung die Ausgangsspannung auf 3 V begrenzt. Step-up-Module sind kompakt und günstig. Er speist den Operationsverstärker mit +20 V und kann Signale mit einer Spannung von bis zu 18 V erzeugen. (NB, der Schaltplan sagt LTC3105, weil das die einzige Verbesserung war, die ich in Fritzing gefunden habe. In Wirklichkeit habe ich ein MT3608-Modul verwendet, siehe Bilder in den nächsten Schritten). Ich entscheide mich für eine variable Dämpfung am Ausgang des R2R DAC und verwende dann einen der Operationsverstärker, um das Signal ohne Verstärkung zu puffern und den anderen um 5,7 zu verstärken, so dass das Signal eine maximale Ausgabe von etwa 20 V erreichen kann. Der Ausgangsstrom ist ziemlich begrenzt, ~10mA, daher kann ein stärkerer Verstärker erforderlich sein, wenn das Signal einen großen Lautsprecher oder einen Elektromagneten antreiben soll.

Schritt 2: Erforderliche Komponenten

Für den Kernwellenformgenerator

Arduino Uno oder Nano

16x2 LCD-Display + 20kOhm Trimmer und 100Ohm Vorwiderstand für Hintergrundbeleuchtung

5-poliger Drehgeber (mit integriertem Taster)

25 Widerstände von 10kOhm

Für den Puffer/Verstärker

LM358 oder ein anderer Dual-Opamp

Step-Up-Modul auf Basis des MT3608

50kOhm variabler Widerstand

10kOhm Widerstand

47kOhm Widerstand

1muF Kondensator

Schritt 3: Konstruktion

Konstruktion
Konstruktion
Konstruktion
Konstruktion

Ich habe alles auf eine 7x9cm Prototypenplatine gelötet, wie im Bild gezeigt. Da es mit all den Drähten etwas unordentlich wurde, habe ich versucht, die Leitungen mit positiver Spannung rot und diejenigen mit Masse schwarz zu färben.

Der von mir verwendete Encoder hat 5 Pins, 3 auf der einen Seite, 2 auf der anderen Seite. Die Seite mit 3 Pins ist der eigentliche Encoder, die Seite mit 2 Pins ist der integrierte Taster. Auf der 3-Pin-Seite sollte der mittlere Pin mit Masse verbunden werden, die anderen beiden Pins mit D10 und D11. Auf der 2-Pin-Seite sollte ein Pin mit Masse und der andere mit D12 verbunden werden.

Es ist das hässlichste, was ich je gemacht habe, aber es funktioniert. Es wäre schön, ein Gehäuse einzubauen, aber im Moment rechtfertigen der zusätzliche Aufwand und die Kosten dies nicht wirklich. Der Nano und das Display sind mit Stiftleisten befestigt. Ich würde das nicht mehr machen, wenn ich ein neues bauen würde. Ich habe keine Anschlüsse auf die Platine gelegt, um die Signale aufzunehmen. Stattdessen hebe ich sie mit Krokodilkabeln aus hervorstehenden Kupferdrahtstücken auf, die wie folgt beschriftet sind:

R - Rohsignal vom R2R DAC

B - gepuffertes Signal

A - verstärktes Signal

T - Timersignal von Pin 9

G - Masse

+ - positive 'hohe' Spannung vom Aufwärtsmodul

Schritt 4: Der Code

Der Code, eine Arduino-Skizze, ist beigefügt und sollte auf den Arduino hochgeladen werden.

20 Wellenformen sind vordefiniert. Es sollte einfach sein, jede andere Welle hinzuzufügen. Beachten Sie, dass die Zufallswellen das 256-Werte-Array mit Zufallswerten füllen, aber das gleiche Muster wird jede Periode wiederholt. Echte Zufallssignale klingen wie Rauschen, aber diese Wellenform klingt viel mehr wie eine Pfeife.

Der Code setzt ein 1-kHz-Signal an Pin D9 mit TIMER1. Dies ist nützlich, um das Timing des analogen Signals zu überprüfen. So habe ich herausgefunden, dass die Anzahl der Taktzyklen 42 beträgt: Wenn ich entweder 41 oder 43 annehme und ein 1-kHz-Signal erzeuge, hat es eindeutig eine andere Frequenz als das Signal an Pin D9. Mit dem Wert 42 passen sie perfekt zusammen.

Normalerweise unterbricht das Arduino jede Millisekunde, um die Zeit mit der Funktion millis () zu verfolgen. Dies würde die genaue Signalerzeugung stören, so dass der jeweilige Interrupt deaktiviert wird.

Der Compiler sagt: "Sketch verwendet 7254 Byte (23%) des Programmspeicherplatzes. Das Maximum beträgt 30720 Byte. Globale Variablen verwenden 483 Byte (23%) des dynamischen Speichers, so dass 1565 Byte für lokale Variablen übrig bleiben. Das Maximum sind 2048 Byte." Es gibt also genügend Platz für komplexeren Code. Beachten Sie, dass Sie möglicherweise "ATmega328P (alter Bootloader)" auswählen müssen, um erfolgreich auf den Nano hochzuladen.

Schritt 5: Verwendung

Der Signalgenerator kann einfach über das Mini-USB-Kabel des Arduino Nano mit Strom versorgt werden. Dies geschieht am besten mit einer Powerbank, damit keine versehentliche Erdschleife mit dem Gerät entsteht, an das es angeschlossen werden kann.

Beim Einschalten wird eine 100Hz Sinuswelle erzeugt. Durch Drehen des Knopfes kann einer der anderen 20 Wellentypen ausgewählt werden. Durch Drehen bei gedrückter Taste kann der Cursor auf eine beliebige Stelle der Frequenz gesetzt werden, die dann auf den gewünschten Wert geändert werden kann.

Mit dem Potentiometer lässt sich die Amplitude regulieren und entweder das gepufferte oder das verstärkte Signal verwenden.

Es ist sehr hilfreich, ein Oszilloskop zu verwenden, um die Signalamplitude zu überprüfen, insbesondere wenn das Signal ein anderes Gerät mit Strom versorgt. Wenn zu viel Strom gezogen wird, wird das Signal abgeschnitten und das Signal ist stark verzerrt

Bei sehr niedrigen Frequenzen kann der Ausgang mit einer LED in Reihe mit einem 10kOhm-Widerstand visualisiert werden. Audiofrequenzen können mit einem Lautsprecher gehört werden. Stellen Sie sicher, dass das Signal sehr klein ~ 0,5 V eingestellt wird, da sonst der Strom zu hoch wird und das Signal abschneidet.

Empfohlen: