Hallo zur Webseite von
DL1DMW





Funktionsgenerator mit ESP32:
Sinus, Rechteck, Dreieck



Bild 1: Ausgabe des Sinussignals mit 2700 Hz, oben das Nutzsignal (GPIO26/DAC2), unten das auf GPIO25 ausgegebene Signal.

Zum Basteln benötigt man ab und zu einen Funktionsgenerator. Was tun, wenn keiner zur Hand ist? Mit einem ESP32 hat man in 5 Minuten einen NF-Funktionsgenerator mit Sinusschwingungen bis 250 kHz oder 20 kHz für Rechteck- und Dreiecksignale mit einer Spannung von Spitze-Spitze 3,3 Volt. Wer höhere Spannungen benötigt, schaltet einen NF-Verstärker nach. Kleinere Spannungen gewinnt man mit einem Spannungsteiler.


<- Bild 2: Ausgabe eines Rechtecksignals mit selber Frequenz, auch hier oben das Nutzsignal auf dem ESP32 Pin GPIO26/DAC2.


Im Internet bin ich auf der Suche nach einer schnellen Lösung für einen Funktionsgenerator zuerst bei [1-3] fündig geworden. Gerald Lechner beschreibt im ersten Teil seines Blogbeitrags eine Software für den ESP32, die über den seriellen Monitor der Arduino IDE bedient wird. Genau das benötigte ich, eine Software, die man schnell auf den ESP32 aufspielt, sie nutzt und anschließend den ESP32 für andere Zwecke verwendet. Der Autor des Programms geht in seiner Beschreibung in Teil 2 und Teil 3 jedoch weiter: Die Bedienung wird auf Taster umgestellt und die Hardware in ein selbstgedrucktes Gehäuse integriert. Soweit wollte ich nicht gehen, schließlich ging es mir nur um eine schnelle Lösung für ein Sinussignal.



<- Bild 3: Dreiecksignal mit 2700 Hz.


Sein ESP32-Programm, das man mit der Arduino IDE lädt und kompiliert, habe ich nur geringfügig auf deutschsprachige Befehle umgestellt und die Eingabeaufforderung, die man im seriellen Monitor lesen kann, so gestaltet, dass nach längerer Nichtbenutzung keine Fragen zur Bedienung bzw. zu den Kommandos auftreten. Aus Zeitgründen greift der Programmierer direkt auf die Register des Timers, des 8-Bit-DAC und der I2S-Schnittstelle zu. Gibt der Benutzer eine Wunschfrequenz vor, etwa 10.000 Hertz, antwortet die Software mit einer angenäherten Frequenz, die von dieser meist nur um wenige Hertz abweicht (hier: 10001.25Hz). Die leichte Differenz ist in der Hardware des ESP32 begründet. Die Software versucht, die reale Frequenz möglichst der Wunschfrequenz anzunähern – das funktioniert sehr gut.


<- Bild 4: Bei einer Frequenz von 20kHz weist das Signal deutliche Treppenstufen auf, während der Sinus und das Rechteck bei 20kHz einwandfrei sind.


Am ESP32 nimmt man das Signal an Pin GPIO26 ab. Das ist der DAC2-Ausgang. Auf GPIO25 (DAC1) kann man ebenfalls eine Ausgabe feststellen, wie die Bilder des Oszilloskops zeigen.







Bild 5: Zur Bedienung des Programms dient der serielle Monitor aus der Arduino IDE.


Die Bedienung erfolgt über einige kurze Befehle, die man über die Zeile oben des seriellen Monitors eintippt:

F##### Eingabe der Frequenz in Hz (# = Ziffern, max. 20.000 Hz)
T## Eingabe des Tastverhältnisses für Rechteck und Dreieck in Prozent
MS Modus Sinus
MR Modus Rechteck
MD Modus Dreieck
Statt der Großbuchstaben sind auch kleine Buchstaben zugelassen. Den seriellen Monitor stellt man auf 9600 Baud ein.

Beispiele:
F1000
Stellt die Frequenz auf 1000 Hz ein.

ms
Stellt die Ausgabe auf Sinus um.

MD
Ausgabe Dreiecksignal.

mr
Ausgabe Rechtecksignal.

T10
Das Tastverhältnis wird auf 10% eingestellt.

In der zum Download bereit stehenden Datei (siehe den Button unten) finden Sie den modifizierten Arduino-Sketch ESP_FuncGen1.ino. Für eine detaillierte Beschreibung der internen Abläufe zur Erzeugung der Signale empfehle ich den Blogeintrag des Programmierers bei [1].


<- Bild 6: Ein NF-Verstärker mit LM358 erzeugt höhere Spannungen. Quelle: [1-3].



… und nun Sinus bis 250 kHz

Es muss doch noch etwas schneller gehen, mag man denken, schließlich besitzt der ESP32 im DAC einen eigenen Sinusgenerator! Fündig wurde ich bei [4]. Helmut Weber hat mit Hilfe von anderer Seite [5] ein freies Beispielprogramm geschrieben, dass einen Sinus bis 250 kHz ausgibt. Das schafft eine PC-Soundkarte nicht! Ich habe es ESP32_FuncGen2 genannt und es für die Arduino IDE portiert. Weil man die Frequenz nicht einstellen konnte – sie war fest vorgegeben – kam noch die Abfrage der seriellen Schnittstelle hinzu und der Sketch wurde mit einem simplen Befehl zur Einstellung der Frequenz ausgestattet. Der lautet

F###### oder
f######

<- Bild 7: Sinussignal etwas über 250 kHz mit dem Sketch ESP32_FuncGen2.


und wird wie zuvor im seriellen Monitor eingetippt und gesendet. Beachten Sie, dass Sie hier sechs Ziffer angeben können. Eingaben über 250000 wirken aber nicht. Rechteck und Dreieck leistet dieser Sketch nicht. Das Signal können Sie an dem ESP32-Pin GPIO25/DAC1 oder auch bei GPIO26/DAC2 abnehmen. Nutzen Sie beide, ist es ein phasengleiches Stereo-Sinussignal. Bild 7 zeigt beide Signale bei 255 kHz und Bild 8 die Ausgabe des Sketches auf dem seriellen Monitor der Arduino IDE.


<- Bild 8: Ausgabe des Programms ESP32_FuncGen2 auf dem seriellen Monitor der Arduino IDE.


Viel Spaß mit diesen beiden Programmen!

Datei esp32_fgen.zip laden


Literatur/Verweise:
[1] ESP32_FuncGen1:
https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/funktionsgenerator-mit-dem-esp32-teil1
[2] ESP32_FuncGen1:
https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/funktionsgenerator-mit-dem-esp32-signalverstaerker-teil2
[3] ESP32_FuncGen1:
https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/funktionsgenerator-mit-dem-esp32-display-und-gehaeuse-teil-3
[4] ESP32_FuncGen2:
https://www.esp32.com/viewtopic.php?t=10321
[5] Sinus-Routine für ESP32_FuncGen2:
https://github.com/krzychb/dac-cosine




Mehr Zeugs
  • Schaun mer mal
  • Moin
  • Bast scho

Hier gibt es was zu lesen

Adresse etc.

  • Op: Michael, DL1DMW
  • ITU Region 1, Zone 14, DL, JO41CO
  • Bad Sassendorf
  • NRW / Germany