Flag Counter
Since 08.08.2014
Counts only, if "DNT = disabled".

Your IP is
Valid HTML 4.01 Transitional Creative Commons Lizenzvertrag
We love the King
23. July 2024
Your valuable opinion :
4.5 stars

Avg. 4.83 from 23 votes.

AD9851.php    11906 Bytes    03-06-2024 17:43:51

Homebrew DDS Generator (with AD9851) V2.0

An Arduino™ ready DDS shield

This Mini-Project serves just to get a universal add-on so that our 'free Samples' come to life. We use a crystal oscillator of 150 MHz ( and do not use the internal multiplier ) in order to increase noise performance. The board uses a single +12V Supply, as it will use the +5V from the Arduino board. For the crystal oscillator a separate voltage regulator is available, in order to generate different voltages necessary for different oscillator types. The output of the AD9851 is lowpass-filtered and amplified with a THS3201 (from Texas Instruments).

AD 9851 Version 1.0

✈ Software / Hardware Description

As this board is intended to work in the MHz-range, where monolithic amplifiers are demanding unpractical large inductors for biasing. We therefore decided to try to get away with an opamp. A quick estimation showed, that for frequencies up to 80 MHz and 4 Vpp, a minimum slew-rate of 1000 V/µs would be necessary. We have chosen the THS3201D from Texas, as it was in the treasure box :-)
Beyond that, nothing special, we follow the reference design from Analog Devices. This version 2.0 got the formfactor of the Arduino UNO™ to simplify construction even more.

When using version 1.0, connect as follows :
Connecting the AD9851 to an Arduino UNO (Version 1.0)

Version 2.0 has the formfactor of the arduino UNO and can be plugged on it, directly. Even a second one can be plugged on it, as the user may assemble R7 OR R9 to distinguish between them.

AD9851 and Arduino UNO

Amplitude Response (Version 2) The peak at 75 MHz is half the clock, amplitude : -26.4 dBm.

AD9851 S21

✈ Lowpass Filter

The Lowpass filter was calculated with RFSim99. We used SIMID® 1210-T from the EPCOS SIMID 1210 Series Inductors sample kit. For the capacitors, we used SQCB Low ESR / Hi-Q Capacitors from AVX. The performance is shown below. As the lowpass allows frequencies of approx. 48 MHz to pass, an oscillator frequency of 48 MHz / 0.4 = 120 MHz seems appropriate. Anyway, we used a 150 MHz oscillator because it was in our treasure box and the filter has a maximum attenuation at about 150 MHz. All neighboring inductors are set to an angle of 90 ° in order to minimise coupling.

FTW AD9851

✈ Downloads

✈ Programming

The programming of this "simple" dds is quite easy. The only stumbling block is a division by 2^32 when dealing with 32 bit arithmetics. In case you use the internal clock-multiplier, W32 (Bit 0 of Word 0) must be set. In order to power it up (!) W34 must also be set. W0 ... W31 (MSB) contains the Frequency Tuning Word, as mentionend in the datasheet, page 12 :

FTW AD9851

Pouring this knowledge into software, our bitstream, should look like the picture below. Note, that the LSB is transmitted first !

Programming the AD9851

You may also find the AD9851 Device Configuration Assistant helpful. (Courtesy of Analog Devices).

AD9851 Device Configuration Assistant

✈ Arduino Sketch - The Code

Double click on code to select ...

*   Demo Sketch for the AD9851 Board and Arduino UNO
*   11.09.2015, V1.0, Alexander C. Frank

unsigned long DDS_CLOCK = 150000000 ;
unsigned long FREQ = 10000000 ;
unsigned long FTW ;
unsigned long REF_MUL = 0x0000 ;

int DATA = A4;
int CLOCK = A2; 
int UPDATE = A3; 

// ///////////////////////////////////////////////////////////// 

void UseMitDaemBitstaengeli(unsigned long data) 
unsigned long pointer = 0b00000000000000000000000000000001 ;
for (int i=0; i<32; i++)
if ((data & pointer)>0) { digitalWrite(DATA, HIGH); }
  else { digitalWrite(DATA, LOW); }
digitalWrite(CLOCK, HIGH);
digitalWrite(CLOCK, LOW);
pointer = pointer << 1 ;

pointer = 0b00000000000000000000000000000001 ;

for (int i=0; i<8; i++)
if ((REF_MUL & pointer)>0) { digitalWrite(DATA, HIGH); }
  else { digitalWrite(DATA, LOW); }
digitalWrite(CLOCK, HIGH);
digitalWrite(CLOCK, LOW);
pointer = pointer << 1 ;
digitalWrite(UPDATE, HIGH);
digitalWrite(UPDATE, LOW);

// ///////////////////////////////////////////////////////////// 

void setup() 
pinMode (DATA, OUTPUT);
pinMode (CLOCK, OUTPUT);
FTW = (FREQ * pow(2, 24)) / ( DDS_CLOCK/256 ) ;
// THAT's IT.

void loop() 

✈ Share your thoughts

The webmaster does not read these comments regularely. Urgent questions should be send via email. Ads or links to completely uncorrelated things will be removed.

Your Browser says that you allow tracking. Mayst we suggest that you check that DNT thing ?

t1 = 6585 d

t2 = 420 ms

★ ★ ★  Copyright © 2006 - 2024 by  ★ ★ ★