Ein einfacher Signal-Generator

Hier werden einzelne Projekte mit MicroPython vorgestellt
Antworten
Heinrichs
Beiträge: 202
Registriert: Do 21. Okt 2010, 18:31

Ein einfacher Signal-Generator

Beitrag von Heinrichs » Sa 18. Okt 2025, 17:57

Hier stelle ich ein einfaches Programm für einen Signal-Generator vor. Es kann folgende Signal-Typen produzieren:
  • Sägezahn
  • Dreieck
  • Sinus
  • Rechteck

Das Signal wird mit Hilfe der write-Methode der DAC-Klasse (Digital to Analog Conversion ) erzeugt: Die Maximal-Spannung beträgt 3,3 V; sie wird erreicht, wenn das Argument von write den Wert 255 hat. Mit dem folgenden Befehl

dac = DAC(Pin(25))

erzeugen wir eine Instanz der Klasse DAC; auf die analogen Signale kann man dann am Pin 25 zugreifen.

Den gewünschten Generator-Typ können Sie durch ein Auswahl-Menü festlegen. Beim Sinus-Signal können Sie die Frequenz in einem Bereich zwischen 10 Hz und 200 Hz einstellen, beim Rechteck-Signal im Bereich zwischen 10 Hz und und 10 kHz. In den anderen Fällen sind die Frequenzen festgelegt (Sägezahn: 480 Hz, Dreieck_1: 430 Hz, Dreieck_2: 450 Hz); durch kleine Änderungen im Quellcode können hier aber auch niedrigere Frequenzen erzielt werden.


Hier das zugehörige Programm:

Code: Alles auswählen


# DAC_1_2.py

# Einfacher Signal-Generator für die Typen
# - Sägezahn
# - Dreieck
# - Sinus
# - Rechteck

# 03.11.2025
# getestet mit Taschen-Oszilloskop DSO213 und Multimeter OW18B
# www.g-heinrichs.de


###################################### Signal-Generator ######################################
#                                                                                            #
#                               Das Signal liegt am Pin 25 an.                               #
#                              Die Maximal-Spannung ist 3,3 V.                               #
#                                                                                            #
##############################################################################################


from machine import DAC, Pin
from time import sleep, sleep_us, ticks_us, ticks_diff

dac = DAC(Pin(25))  # DAC-Objekt für Pin 25 erzeugen

print('DAC 1.2')
max = 255 # Maximalspannung: 3,3 V


################################ Funktionen ####################################

def saegezahn():
    # Sägezahn-Signal (max. ca. 480 Hz)
    print('Sägezahhn-Signal (ca. 480 Hz, Änderung der Frequenz im Quellcode) ' )
    while True:
        for i in range(max):  
            dac.write(i)      # analoger Rohwert (0 - 3,3 V)
            # sleep_us(10000) # für langsames Dimmen einer LED
            # sleep_us(5) # ca. 170 Hz
            # ohne sleep_us: f = 480 Hz


def dreieck_1():
    # Dreieck-Signal (Version 1; # ca. 430 Hz)
    print('Dreieck-Signal (Version 1, ca. 430 Hz)')
    signal = []
    for i in range(0, 256, 2): # 0, 2, 4, ..., 254
        signal.append(i)
    for i in range(0, 256, 2):
        signal.append(254 - i)
    # print(signal) # zum Testen
    while True: 
        for i in range(256):
            dac.write(signal[i])


def dreieck_2():
    # Dreieck-Signal (Version 2, ca. 450 Hz)
    print('Dreieck-Signal (Version 2, ca. 450 Hz)')
    while True:
        for i in range(0, 256, 2): # 0, 2, 4, ..., 254
            dac.write(i)
        for i in range(0, 256, 2): # 0, 2, 4, ..., 254
            dac.write(254 - i)   
   

def sinus():
    # Sinus-Signal
    from math import sin, pi
    # Signalwerte-Tabelle für 5 Perioden; 80 Messwerte für 1 Periode
    print('Sinus-Signal')
    f = int(input('Frequenz in Hz (ganze Zahl zwischen 10 und 200):'))
    if f >= 10 and f <= 200:
        a = 127 # Amplitude
        signal = []
        anzahl_Messpunkte = 80*5
        for t in range(anzahl_Messpunkte):
            s = round(a * (1 + sin(0.025 * pi * t))) 
            signal.append(s)
        print('f =', f, 'Hz')
        T = 1/f # in s
        print('T =', T, 's')
        delta_T = T/80 # Zeit für einen Signal-Punkt in s
        delta_T_us = round(delta_T * 1E6) # Zeit für einen Signal-Punkt in us
        # D/A-Wandlung in Echtzeit
        while True: 
            for i in range(anzahl_Messpunkte):
                t1 = ticks_us()
                dac.write(signal[i])
                while ticks_diff(ticks_us(), t1) < delta_T_us - 10 : # warten bis insgesamt delta_T us verstrichen sind
                    pass # nichts tun
    else: # zu: if f >= 10 and f <= 200...
        print('Ungültige Frequenz')
        
def rechteck():
    # Fehler kleiner als 1% bei Frequenzen unter 5000 Hz 
    print('Rechteck-Signal')
    f = int(input('Frequenz in Hz (ganze Zahl zwischen 10 und 10_000):'))
    print('f =', f, 'Hz')
    if f >= 10 and f <= 10_000:
        T = int(1000_000/f) # Periode in us
        T_2 = T // 2 - 10 # sleep_us wartet etwas zu lang
        while True:
            dac.write(255)
            sleep_us(T_2)
            dac.write(0)
            sleep_us(T_2)        
    else: # zu: if f >= 10 and f <= 10_000
        print('Ungültige Frequenz')   

################################ Hauptprogramm ####################################

print()
print('Wählen Sie aus:')
print('1: Sägezahn-Signal (ca. 480 Hz)') # 
print('2: Dreieck-Signal (Version 1, ca. 430 Hz)') 
print('3: Dreieck-Signal (Version 2, ca. 450 Hz)')
print('4: Sinus-Signal (10 Hz - 200 Hz)')
print('5: Rechteck-Signal (10 Hz - 10_000 Hz)') # 
print()

mode = input('Auswahl:')
if mode in ['1', '2', '3','4', '5']:
    if mode == '1':
        saegezahn()
    if mode == '2':
        dreieck_1()
    if mode == '3':
        dreieck_2()
    if mode == '4':
        sinus()
    if mode == '5':
        rechteck()    
else:
    print('Ungültige Auswahl!')


Wer einen etwas leistungsfähigeren Signal-Generator benötigt, gleichzeitig aber nicht viel Geld darin investieren möchte, sollte sich den Signal-Generator XR2206 anschauen. Als Bausatz (mit Gehäuse) ist er schon ab etwa 5 Euro erhältlich. Es gibt diesen Signal-Generator auch bereits fertig montiert; aber das wird deutlich teurer. Weitere Informationen zu diesem Bausatz können Sie dem Anhang entnehmen. Sollten Sie etwas mehr investieren können, sollten Sie sich einmal den Signal-Generator FG-200 anschauen.

XR2206_Signalgenerator.jpg
Fertiger Funktionsgenerator XR2206
XR2206_Signalgenerator.jpg (109.91 KiB) 1504 mal betrachtet

.
Dateianhänge
Funktionsgenerator.pdf
Funktionsgenerator XR2206
(705.55 KiB) 413-mal heruntergeladen

Antworten