> Start > Schaltungen
 
Ein DDS Frequenzgenerator mit dem AD9850 und Arduino Uno

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.

DDS AD-9850

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.

AD-9850 und Arduino Uno

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