Moin Moin!
Ich habe mir ein AD9833 Modul aus der Bucht gekauft um damit einen
genauen 1Khz Sinus zu erzeugen. Später auch Frequenzen von 200Hz -
10Khz. Dazu habe ich den Quarzoszillator von 25Mhz ausgelötet und einen
externen mit 4.194304Mhz angeschlossen.
Aus einigen Beiträgen habe ich entnommen, das das Timing der SPI nicht
"ganz ohne" ist.Pro Beitrag wurde auch eine unterschiedliche
Initialisierung vom AD9833 vorgeschlagen die sich alle nicht mit dem
Datenblatt oder der AN decken.
Aus dem Teil kommt entweder sporadisch ein Sinus zwischen 3Khz und 1Khz,
schwer verrauscht, heraus oder nichts.
Anbei mein Code der eigentlich eine Kopie von Martin Wende ist. Dazu
noch zwei Bilder vom SPI timing. Ich kann einfach keinen Grund sehen
warum das Teil ( zumindest wegen des SPI timings ) nicht laufen soll.
Hat jemand von euch einen Tipp oder einen tatsächlich laufenden
Code-snipsel als Beispiel??
100000*10^12 Daaanke
Karsten
Ich vermute den Fehler bei deinem Aufruf von DDS_write in der Funktion
DDS_freq()
Da rufst du die Funktion mit einem Wert auf, den du explizit auf 32bit
castest. Schau mal ob da die richtigen Werte geschrieben werden.
Mein Tip:
Verwende Variablen in uint16_t und caste deine Frequenz darauf. Wenn das
fertig ist rufst du die Funktionen mit den Variablen auf.
Das ist ja nicht zeitkritisch, da kann man sich den Overhead leisten.
Ich habe nochmal ins Datenblatt geschaut. Du schreibst scheinbar keine
Control-Bits. Wenn du Daten auf den Chip schreibst musst du doch
mitteilen in welches Register das soll. Das machst du aber nicht. Oder
täusche ich mich?
Schau dir mal die Flussdiagramme an wie so eine Geschichte gemacht
werden soll. Diese Struktur ist bei dir im Programm noch nicht zu
finden.
Datenblatt Seite 18/19
Gruß
Hallo Jens,
Daanke für deine Überlegungen.
Jens W. schrieb:> ..Du schreibst scheinbar keine> Control-Bits.
Im Zweiten Bild vom Analyser sieht man welche Bits gesendet werden.
Byte 1:
D15 und D14 = 0 was meint das das FREQ0 Register beschieben wird (
Datenblatt Seite 15 ). Danach noch B28 auf 1 für das laden von zwei
Bytes. Im Weiteren sind SLEEP1, OPBITEN und MODE gesetzt.
Byte 3 und 4:
Enthalten den Wert für die Frequenz exakt so wie´s laut Datenblat für
den Wert 0xFA00 sein soll.
Humm: SLEEP1, OBITEN, MODE.... Sieht irgendwie falsch aus oder?
Ich lese hier nochmal genau nach und probiere das gleich aus....
4 Augen sehen einfach mehr!!!!!!!!!!
Daaanke
Karsten
Die SPI Einstellung sieht für mich gut aus. Clock Idle Polarity und
Sample dürften richtig sein.
Wenn du das Timing in Verdacht hast, würde ich erst mal alles so langsam
wie möglich machen. D.h. beim SPI den Vorteiler ganz hoch auf Anschlag.
Nach dem Anlegen des Select erst mal eine kleine Pause. Eben alles so
langsam wie es geht und alle Zeiten sehr grosszügig bemessen. Getreu dem
Motto: zu langsam ist meistens kein Problem, zu schnell aber schon.
Das einzige was mir aufgefallen ist, das ist, dass du einen SLEEP1
programmierst. Laut Doku sorgt das aber dafür, dass MCL disconnected
wird und damit wird die ganze Generierung lahm gelegt. Das ist aber auch
schon das einzige, was mir seltsam vorgekommen ist.
Was du da jetzt mit OBITEN und Mode für einr Waveform selektiert hast,
hab ich jetzt nicht genauer nachgeforscht. Meinem Verständnis nach
sollte überhaupt erst mal irgendwas rauskommen, egal wie die beiden
stehen.
Jens W. schrieb:> Ich habe nochmal ins Datenblatt geschaut. Du schreibst scheinbar keine> Control-Bits.
Doch. ist da.
D15 und D14 sind 0. Damit ist das Control Register addressiert.
Jungs Ihr seid einfach wie immer GROßARTIG!
Es lag am SLEEP1 das ich nach dem setzten des FREQ0 Registers wieder auf
0 setzen muss.
Ich hatte dies gesetzt um beim eventuellen Wechsel der
Frequenz/Wellenform keinen "Schrott" am Ausgang zu haben.
Die Frequenz stimmt nun. Jedoch ist das Signal extrem verrauscht.... Ich
hatte so in meinem Leichtsinn gedacht das ich da etwas chönes und
exaktes aus dem Chip erwarten darf...
O.K. Da muss ich dann noch mal ran :-)
10000000000000000000000*10^12 Danke!
Gruß
Karsten
P.S. Hier der Code der funktioniert...
Vielleicht hilft dir diese Info noch:
ich nutze den AD9834. Zum Starten und Stoppen lösche bzw. setze ich das
Reset-Bit. Dieses bezieht sich nämlich nicht auf die internen Frequenz-
und Phase-Register, in welchen man Frequenz und Phase einstellt, sondern
nur auf die Register, die für das Ausgeben der Frequenz und Phase
verantwortlich sind.
So kann man immer sauber bei quasi 0 starten und stoppen.
Karsten K. schrieb:> Dazu habe ich den Quarzoszillator von 25Mhz ausgelötet und einen> externen mit 4.194304Mhz angeschlossen.Karsten K. schrieb:> Die Frequenz stimmt nun. Jedoch ist das Signal extrem verrauscht.... Ich> hatte so in meinem Leichtsinn gedacht das ich da etwas chönes und> exaktes aus dem Chip erwarten darf...
Was erwartest du da noch?
Setze den 25 MHz Oszillator wieder ein und bedenke, daß der Chip nur
eine Amplitudenauflösung von 10 Bit hat. Selbstverständlich sieht man da
die Stufigkeit des Ausgangssignales - und die ist nicht statisch,
sondern verteilt, weil Takt und Ausgangsfrequenz in keinem ganzzahligen
Verhältnis zueinander stehen. Also siehst du das auf dem Oszi als
Quasi-Rauschen.
Falls du lediglich am Sinus interessiert bist, hilft ein ordentlicher
Tiefpaß ein wenig weiter. Aber ganz beseitigen kann auch der beste
Tiefpaß die Folgen der recht geringen Amplitudenauflösung nicht. Wenn du
an einem wirklich sauberen NF-Sinus interessiert bist, dann hilft nur
ein analoger Oszillator. Phasenschieber oder Wien-Robinson.
W.S.