Ein einfacher Signal-Generator

Hier werden einzelne Projekte mit MicroPython vorgestellt
Antworten
Heinrichs
Beiträge: 200
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

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 Setzen bzw. Entfernen der Kommentierungs-Zeichen im Programm auswählen.


Hier das zugehörige Programm:

Code: Alles auswählen

# DAC_1_0.py

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

# 18.10.2025
# www.g-heinrichs.de

###################################### Signal-Generator ######################################
#                                                                                            #
#                               Das Signal liegt am Pin 25 an.                               #
#                         Wählen Sie den gewünschten Generator-Typ                           #
#                  durch Setzen bzw. Entfernen der Kommentierungs-Zeichen!                   #
#                              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('Programm gestartet')
max = 255 # Maximalspannung: 3,3 V



# Sägezahn-Signal (max. ca. 350 Hz)
print('Sägezahhn-Signal (max. ca. 350 Hz)')
while True:
  for i in range(max):  
    dac.write(i)      # analoger Rohwert (0 - 3,3 V)
    # sleep_us(10000) # für LED
    sleep_us(5) # ca 260 Hz 
    # ohne sleep_us: T = 2,8 ms (1 kompletter Durchlauf für die for-Schleife), entspricht ca. 350 Hz


'''
# Dreieck-Signal (Version 1; # ca. 294 Hz)
print('Dreieck-Signal (Version 1, ca. 294 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])
'''

'''
# Dreieck-Signal (Version 2, ca. 335 Hz)
print('Dreieck-Signal (Version 2, ca. 335 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)   
'''   

'''
# Sinus-Signal
from math import sin, pi

# Signalwerte-Tabelle für 5 Perioden; 80 Messwerte für 1 Periode
print('Sinus-Signal')
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)
  
f = 200 # in Hz # recht genau bis bis ca. 200 Hz
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
# print('delta_T =', delta_T)
# print('delta_T_us =', delta_T_us)
# print(signal)

# D/A-Wandlung in Echtzeit
while True: 
  for i in range(anzahl_Messpunkte):
    t1 = ticks_us()
    dac.write(signal[i])
    # t2 = ticks_us()
    while ticks_diff(ticks_us(), t1) < delta_T_us - 15 : # warten bis insgesamt delta_T us verstrichen sind
      pass # nichts tun
'''


Wer einen etwas leistungsfähigeren Signal-Generator benötigt, gleichzeitig aber nicht viel Geld darin inverstieren 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.

XR2206_Signalgenerator.jpg
Fertiger Funktionsgenerator XR2206
XR2206_Signalgenerator.jpg (109.91 KiB) 14 mal betrachtet
.
Dateianhänge
Funktionsgenerator.pdf
Funktionsgenerator XR2206
(705.55 KiB) 4-mal heruntergeladen

Antworten