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).
✈ 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 :
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.
Amplitude Response (Version 2) The peak at 75 MHz is half the clock, amplitude : -26.4 dBm.
✈ 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.
✈ 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 :
Pouring this knowledge into software, our bitstream, should look like the picture below. Note, that the LSB is transmitted first !
✈ 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 ;
// THIS IS FOR VERSION 2
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); }
delay(1);
digitalWrite(CLOCK, HIGH);
delay(1);
digitalWrite(CLOCK, LOW);
pointer = pointer << 1 ;
delay(1);
}
pointer = 0b00000000000000000000000000000001 ;
for (int i=0; i<8; i++)
{
if ((REF_MUL & pointer)>0) { digitalWrite(DATA, HIGH); }
else { digitalWrite(DATA, LOW); }
delay(1);
digitalWrite(CLOCK, HIGH);
delay(1);
digitalWrite(CLOCK, LOW);
pointer = pointer << 1 ;
delay(1);
}
delay(1);
digitalWrite(UPDATE, HIGH);
delay(1);
digitalWrite(UPDATE, LOW);
}
// /////////////////////////////////////////////////////////////
void setup()
{
// DEFINE OUTPUTs
pinMode (DATA, OUTPUT);
pinMode (CLOCK, OUTPUT);
pinMode (UPDATE, OUTPUT);
// THE BITSTREAM TO BE SEND
FTW = (FREQ * pow(2, 24)) / ( DDS_CLOCK/256 ) ;
// PROGRAM IT !
UseMitDaemBitstaengeli(FTW);
// THAT's IT.
}
void loop()
{
// DO NOTHING :-)
}
✈ 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 ?