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

Your IP is 18.217.255.64
ec2-18-217-255-64.us-east-2.
Info
Valid HTML 4.01 Transitional Creative Commons Lizenzvertrag
rss
เราจะทำแบบวิศวกรผู้ยิ่งใหญ่
We love the King
21. December 2024
YOU RATED THIS ...
avg = 0.0 ,  n = 0


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 ;

// 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 ?

 
t1 = 6736 d

t2 = 200 ms

★ ★ ★  Copyright © 2006 - 2024 by changpuak.ch  ★ ★ ★

Impressum