Arduino-basierter DDS Signal-Generator

By | 13. Februar 2018

Mit Hilfe des AD9850 DDS Signalgenerator Bausteins lässt sich zusammen mit einem Arduino ein kostengünstiger Signalgenerator aufbauen. Der Generator liefert Rechtecksignale und Sinussignale von 0 bis 40 MHz und wird über einen Microcontroler angesteuert. Das Sinussignal ist in digitaler Form auf dem Chip hinterlegt und wird über einen schnellen 10-bit DA-Wandler kontinuierlich ausgegeben. Rechtecksignale können bis zu 1MHz mit manuell einstellbarem Puls- Pausenverhältnis generiert werden. Mehr dazu kann auch dem Datenblatt entnommen werden.

Die Ausgabe der Signale auf dem Board erfolgt über 2 gegenphasige Ausgänge, je einer für das Sinussignal und das Rechtecksignal. Je nach Aufbau verändern sich oberhalb der 30MHz Grenze allerdings die Kurvenform und Amplitude deutlich. Bis etwa 40MHz lassen sich aber durchaus akzeptable Ergebnisse erzielen.

Die Kommunikation und Steuerung mit dem Board erfolgt über 5 Register. Es kann sowohl 8-bit breit parallel als auch seriell über jeweils 40-bit Kommandosequenzen erfolgen. Für für die parallele Datenübertragung werden die Pins D0 bis D7 verwendet. Für die serielle Datenübertragung nutzt man die Pins D7, WCLK, FQUP und RESET sowie den Jumper mit der Bezeichnung J1, der gesetzt sein sollte.

Laut Datenblatt berechnet man die Ausgangs-Frequenz über die Formel:

    \[f_{out}=\frac{\Delta Phase \cdot CLKIN} {2^{32}}\]

Wobei \Delta Phase ein 32-Bit Tuning-Word darstellt und CLKIN die Referenz-Taktfrequenz von 125 MHz angibt.

In der Arduino-Syntax würde man die Formel wie folgt programmieren:

Programmierung

Programmiert wird der DDS-Chip wie oben schon erwähnt über ein 40-bit Register  W0, W1, W2,W3, und W4.

Im Register W0 steht das ControlByte. Dabei sind die ersten 5-bit für die Phasenlage und das 6. Bit für den PowerDown und die 2 letzen Bits sind reserviert und sollen auf LOW bleiben.

In den Registern W1 bis W4 muss das 32-bit Abstimmwort (Tuning-Word) geladen werden.

D.h. nach dem die gewünschte Ausgangsfrequenz berechnet wurde, muss der berechnete Wert in 4 Bytes verteilt und in die vorgesehenen Register W1 bis W4 übertragen werden.

Dies kann über folgende Schritte gemacht werden:

Mit diesen Informationen lässt sich der Chip dann steuern… Weniger geübte Programmierer haben aber die Möglichkeit auch auf vorhandene Bibliotheken zurück zu greifen. Beispielsweise stellt die AD950 Lib von Bill Williams folgende API zur Verfügung:

 

Weitere Details zur Umsetzung folgen…