Mit der fertigen AD 9850 DDS Platine (z.B. von ebay für unter 10 Euro) und dem Arduino Uno lässt sich ziemlich einfach ein einstellbarer Sinus Frequenzgenerator aufbauen. Dieser ist dann durchstimmbar von 1 Hz bis 40 MHz in 1 Hz Schritten.
Ich habe hier die serielle Ansteuerung des AD 9850 DDS ( Direkte Digitale Synthese ) gewählt weil dann weniger Anschlüsse vom Arduino benötigt werden.
Die Verbindung der beiden Platinen.
Arduino Uno |
DDS AD 9850 |
Kabelfarbe im Bild |
Kommentar |
5V |
VCC |
rot |
Spannungsversorgung mit 5V |
GND |
GND |
blau |
Masse |
Pin 8 |
DATA |
orange |
serielle Datenleitung |
Pin 9 |
CLK |
grün |
Datentakt zum Übernehmen der seriellen Daten |
Pin 10 |
FQ |
weiß |
Frequenz Update signal |
Pin 11 |
RST |
braun |
Reset |
Es können auch andere digitale PINs vom Arduino verwendet werden solange wir auf der digitalen Seite des Arduino Uno bleiben und das im Programm entsprechend angepasst wird.
Der Sinus Ausgang ist dann SINA und SINB (um 180° verschoben), jeweils gegen GND.
Im Bild mit den Leitungen rot und gelb angeschlossen.
Die Ansteuerung des DDS wird auf verschiedenen Seiten beschrieben. Teilweise kommen dort auch Arduino Bibliotheken zum Einsatz. Das ist aber gar nicht notwedig, da es mit ein paar Codezeilen schnell erledigt ist.
Ich habe das Programm hier einfach und kompakt gehalten.
Zusätzlich ist eine Sweep Funktion enthalten, die die Frequenz mit n Schritten in einer bestimmten Zeit verändert und dann wieder von vorn anfängt.
Für eine feste Frequenz wird diese Funktion verwendet:
void AD9850_Frequenz(double frequenz)
Für einen Frequenzsweep wird diese Funktion verwendet:
void sweep(long int fstart, long int fstop, int nstep, int tms)
Die fertige Arduino Datei zum Download.
Hier nun der Arduino Programmcode mit Kommentaren:
// DDS AD9850 Board und Arduino Uno
// Serielle Ansteuerung des DDS Board
// Fest-Frequenz-Ausgabe oder Frequenz-Sweep
//
// Matthias Busse Version 0.4 vom 30.11.2013
//Arduino Uno > AD9850 Board Anschlüsse
#define RST 11 // Arduino 11 > Board RST - Reset
#define FQ 10 // Arduino 10 > Board FQ - Frequenz Update
#define CLK 9 // Arduino 9 > Board CLK - Takt
#define DATA 8 // Arduino 8 > Board DATA - Daten
// Dann noch anschliessen
// Arduino 5V > Board VCC
// Arduino GND > Board GND
#define pulseHigh(pin) {digitalWrite(pin, 1); digitalWrite(pin, 0); }
void setup(){
AD9850_Init();
AD9850_Reset();
// Wenn nur eine feste Frequenz ausgegeben werden soll:
// AD9850_Frequenz(200000); // Frequenz in Hz einstellen
}
void loop(){
while(1) {
sweep(100000, 400000, 20, 1000); // wenn Frequenzen durchgesweept werden sollen
delay(1000);
}
}
void sweep(long int fstart, long int fstop, int nstep, int tms) {
// Die Frequenz linear durch sweepen
// ca. 2 ms pro Schritt werden mindestens benötigt.
//
// fstart: Startfrequenz
// fstop: Stopfrequenz
// nstep: Anzahl der Schritte
// tms: Sweepzeit in ms
//
// Matthias Busse Version 1.0 vom 27.11.2013
long int i, f, fdelta, tdelta;
unsigned long t1;
fdelta=(fstop-fstart)/(nstep-1);
tdelta=tms/(nstep-1);
for(i=0; i<nstep; i++) {
t1=millis();
f=fstart+(i*fdelta);
AD9850_Frequenz(f);
while((millis()-t1) < tdelta){}
}
}
void AD9850_Init(){
// Ausgänge definieren
// Matthias Busse Version 1.0 vom 27.11.2013
pinMode(RST, OUTPUT); // alles Ausgänge
pinMode(FQ, OUTPUT);
pinMode(CLK , OUTPUT);
pinMode(DATA, OUTPUT);
digitalWrite(RST, 0); // alles 0
digitalWrite(FQ, 0);
digitalWrite(CLK, 0);
digitalWrite(DATA, 0);
}
void AD9850_Reset(){
// DDS zurück setzen
// Matthias Busse Version 1.0 vom 27.11.2013
pulseHigh(RST); //Reset Signal
pulseHigh(CLK); //Clock Signal
pulseHigh(FQ); //Frequenz Update Signal
}
void AD9850_Frequenz(double frequenz){
// Die Frequenz übertragen und DDS starten
// Matthias Busse Version 1.0 vom 27.11.2013
long int y;
frequenz=frequenz/1000000*4294967295/125; //für ein 125 MHz Quarz
y=frequenz;
AD9850_SendData(y); // w4 - Frequenzdaten LSB übertragen
AD9850_SendData(y>>8); // w3
AD9850_SendData(y>>16); // w2
AD9850_SendData(y>>24); // w1 - Frequenzdaten MSB
AD9850_SendData(0x00); // w0 - 0x00 keine Phase
pulseHigh(FQ); // Die neue Frequenz ausgeben
}
void AD9850_SendData(unsigned char c) {
// 8 Bit Daten senden mit CLK Impuls
// Matthias Busse Version 1.0 vom 27.11.2013
int i;
for(i=0; i<8; i++) {
digitalWrite(DATA, (c>>i)&0x01);
pulseHigh(CLK);
}
}
|
Fragen hierzu kann und werde ich aus Zeitgründen nicht beantworten. Hilfreiche Links sind: Arduino Homepage , Analog Device AD9850 Infoseite und das Datenblatt , Seite 1 in deutsch, Seite 2 in englisch.
Ein Frequenzgenerator mit dem DDS AD9850 und Arduino Uno
|
letzte Änderung 11.2013 |