- 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.
.