Hallo achim 9876 ,
mit Python und SPI (auf dem Pico) gibt es wohl ein Initialisierungsproblem mit Clock Idle High.
Siehe: https://forums.raspberrypi.com/viewtopic.php?t=306297
Habe keinen Pico, habs mal mit einem ESP32 getestet. Auf Basis deines Codes aus #5
from machine import SPI, Pin
from utime import sleep
# SPI-Konfiguration für den AD9833 (Signal-Generator)
spi_ad9833 = SPI(2, baudrate=100000, polarity=1, phase=1, sck=Pin(18), mosi=Pin(23))
cs_ad9833 = Pin(5, Pin.OUT, value=1) # Chip Select für AD9833, auf High initialisieren
cs_mcp41010 = Pin(22, Pin.OUT, value=1) # Chip Select für MCP41010
# Dummy-Write ohne ein aktives Chip Select
spi_ad9833.write(bytes([int(0xAA)]))
# Funktion zum Senden eines 16-Bit-Worts an den AD9833
def send_ad9833_command(command):
print(f"Sende Befehl: {hex(command)}") # Debug-Ausgabe für den gesendeten Befehl
cs_ad9833.value(0) # Chip Select auf Low, um Kommunikation zu starten
spi_ad9833.write(bytearray([(command >> 8) & 0xFF, command & 0xFF])) # 16-Bit-Befehl senden
cs_ad9833.value(1) # Chip Select auf High, um Kommunikation zu beenden
#sleep(0.01) # Kleine Verzögerung für Stabilität
# Funktion zum Einstellen der Frequenz am AD9833
def set_ad9833_frequency(frequency):
reference_frequency = 25_000_000 # Referenzfrequenz des AD9833 in Hz (hier 25 MHz)
multiplier = 2**28 # Konstante für den AD9833
freq_word = int((frequency * multiplier) / reference_frequency) # Frequenzberechnung
print(f"Berechneter Frequenzwert (freq_word): {freq_word} (0x{freq_word:X})") # Debug-Ausgabe für freq_word
freq_lsb = freq_word & 0x3FFF # Untere 14 Bits
freq_msb = (freq_word >> 14) & 0x3FFF # Obere 14 Bits
# Debugging-Ausgaben für die berechneten Werte
print(f"LSB: {freq_lsb} (0x{freq_lsb:X}), MSB: {freq_msb} (0x{freq_msb:X})")
# Reset des AD9833
send_ad9833_command(0x2100) # Reset aktivieren
# Frequenz auf das Register 0 schreiben
send_ad9833_command(0x4000 | freq_lsb) # LSB der Frequenz
send_ad9833_command(0x4000 | freq_msb) # MSB der Frequenz
# Funktion zum Umschalten der Wellenform
def set_ad9833_waveform(waveform_type):
if waveform_type == "sinus":
send_ad9833_command(0x2000) # Sinuswelle aktivieren
elif waveform_type == "dreieck":
send_ad9833_command(0x2002) # Dreieckwelle aktivieren
elif waveform_type == "rechteck":
send_ad9833_command(0x2028) # Rechteckwelle aktivieren (MSB/2-Modus)
else:
print("Unbekannter Wellentyp")
def set_mcp41010(poti):
print(f"Sende an mcp41010: {hex(poti)}") # Debug-Ausgabe für den gesendeten Befehl
cs_mcp41010.value(0) # Chip Select auf Low, um Kommunikation zu starten
spi_ad9833.write(bytearray([0x11, poti])) # 16-Bit-Befehl senden
cs_mcp41010.value(1) # Chip Select auf High, um Kommunikation zu beenden
# Hauptprogramm
def main():
set_ad9833_frequency(400) # 400 Hz einstellen
# Wellenform auswählen: sinus, dreieck, rechteck
set_ad9833_waveform("sinus") # Ändere "sinus" auf "dreieck" oder "rechteck" zum Testen der anderen Wellenformen
set_mcp41010(215) # 0 ... 255
while True:
pass # Endlosschleife, da der AD9833 kontinuierlich arbeitet
if __name__ == "__main__":
main()
Display More
Statt der im Link beschriebenen Modifikation der SPI-Lib oder des "Throw-away-reads", hab ich einfach einen "Dummy-Write" eingefügt. Mit dem ESP32 hat es soweit funktioniert. Die GPIO's und die SPI-Bus-Nr. musst du natürlich an deinem Pico anpassen. Hoffe, dass es dich weiterbringt.
Gruß Martin