Der AD9833 ist ein DDS Signalgenerator IC und unterstützt Sinus, Dreieck sowie Rechteck. Von 0 bis 12,5MHz, die Auflösung der Frequenz ist 28bit, das sind bei 25MHz Systemtakt 0,1Hz!
Der Systemtakt wird im Phase Accumulator durch den Inhalt eines der Frequenzregister geteilt. Danach kann die Phase noch verschoben werden durch das aufsummieren eines der Phase Register. Dieses Signal wird an den Sinus ROM weitergegeben oder auch nicht um dann im DAC zu einem Analogsignal umgewandelt zu werden. Der Phase Accumulator zählt hoch und runter, das ermöglicht einen kleineren ROM und die Erzeugung eines Dreiecksignals beim Umgehen des ROM. Der DAC kann abgeschalten werden um ein Rechtecksignal zu erzeugen, immer wenn das MSB 1 ist, wird ein HIGH Pegel ausgegeben. Der Takt kann auch durch 2 geteilt werden.
So sind die Statusbits mit der Hardware verknüpft, in der Tabelle steht wie diese für ein bestimmtes Ausgangssignal im Statusregister gesetzt werden müssen.
Es gibt 5 Register zum steuern des AD9833. Um das Control Register zu beschreiben müssen bit 15/14 vom 16 bit Datenwort 0 sein, danach folgt der Registerinhalt. Zum initialisieren muss der Phase Accumulator resetet werden, dazu das SLEEP1 und RESET bit kurz setzen. Der Inhalt der SELECT bits entscheidet welches der Register ausgelesen wird zum erzeugen des Signals.
Die Frequenzregister sind auf 2 unterschiedliche Arten zu beschreiben, die Adressierung ist jedoch gleich.
Das Freqenzregister ist 28bit breit, daher müssen 2 Wörter inkl. Adresserung übertragen werden.
In Variante 1 werden beide Wörter direkt hintereinander geschrieben, dazu muss im Controlregister B28 gesetzt sein.
Dabei enthält das erste Wort die LSB des Frequenzregisters und das danach die MSB.
In Variante 2 (B28 nicht gesetzt), können die LSB und MSB getrennt geschrieben werden.
Damit der AD9833 weis welche Bits gesetzt werden, wird das HLB Bit im Controlregister benötigt (HLB = 1 -> MSB).
Der Inhalt des Registers wird berechnet mit:
FREQREGISTER = (Ausgangsfrequenz/DDSIC_Frequenz) * 2^28
Die DDSIC_Freqenz ist hierbei MCLK an Pin5 des AD9833.
Die Phasenregister sind weniger spektakulär, die Adressen stehen in der Tabelle.
Der Inhalt des Registers wird berechnet mit:
PHASEREGISTER = (Phasenverschiebung*2^12)/(2*pi)
Die Phasenverschiebung reicht von 0 bis 2*pi.
Die Registerinhalte werden über SPI übertragen, die Timings sind hierbei weniger kritisch. Der AD9833 verträgt eh mehr, als der AVR liefern kann. FSYNC ist hierbei der Chipselect und LOW aktiv. Das MSB muss zuerst gesendet werden, das Bit wird bei fallender Taktflanke übernommen. Dies entspricht dem SPI Modus 2.
Eine von mir geschriebene Library zum ansteuern des AD9833 DDS IC. Behinhaltet Prozeduren zum Einstellen der Frequenz, Phase und dem Signal. Die Frequenz ist einstellbar von 1Hz bis 12,5MHz. Die Phase ist einstellbar von 0 bis 2pi. Ausgangssignale: Sinus, Dreieck, Rechteck. Es können alle Register des IC beschrieben und ausgewählt werden.
Die Library benutzt den Hardware SPI des AVR, eine Version mit freier Wahl der Pins und Software SPI wird nachgereicht. Es kann natürlich auch eine eigene SPI Schreibfunktion (zB. mit FIFO Puffer) verwendet werden, dazu ist nur eine Anpassung von DDS_write nötig.
Die Frequenz des AD9833 berechnet die Library mit der Formel:
FREQREGISTER = (Ausgangsfrequenz/DDSIC_Frequenz) * 2^28
Die DDSIC_Freqenz ist hierbei MCLK an Pin5 des AD9833.
Wie v1.0, jedoch mit nachgereichtem Software SPI.
Per define kann der AD9833 an jedem Port des AVR betrieben werden, jedoch müssen die SPI Pins am selben Port sein.
Ansonsten noch viel Spaß beim löten: