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