No updates for a while. We're getting ready to move house so I've been busy with lots of things around that.
Thanks to those who have emailed me reporting that they've built the Arduino DDS-60 controller.
Bob, N9KR pointed out that there are inexpensive DDS boards on eBay that work with my software with minor changes. These use an AD9850 chip which is very similar to the AD9851 in the DDS-60. Search eBay for AD9850. Most are "Buy it now" for about $18.99 with free shipping to the US from Hong Kong. These are not kits but assembled modules ready to go.
Bob reports that to cope with the difference between the AD9851 and AD9850, he only had to change the WriteByteToDDS(0x09) in WriteToDDS to WriteByteToDDS(0x08).
The clock frequency on these boards is 125 MHz whereas the DDS-60 uses 180 MHz. That requires the following changes.
const long CLOCK_BASE = 180000000 & 0xFFFF0000;
const long CLOCK_BASE = 125000000 & 0xFFFF0000;
and to make the calibration provide the + or - 100 ppm:
const unsigned long CLOCK_LSB_MIN = 0x4EB0;
const unsigned long CLOCK_LSB_MAX = 0xDB50;
const unsigned long CLOCK_LSB_MIN = 0x286C;
const unsigned long CLOCK_LSB_MAX = 0x8A14;
I haven't tried one of these myself but it sounds like a very inexpensive way of building a DDS. I don't know what they're like in terms of spectral purity or stability.
DDS module works!
thanks for this awesome piece of software!
I got one of those modules a few days ago. It´s not actually from Ebay. It is this module: http://iteadstudio.com/store/index.php?main_page=product_info&cPath=18&…
I did the mentioned changes in the software and it worked right out of the box!
But after a few minutes I noticed that the AD9850 chip got really hot. I measured the current and found out that the module draws 129mA with the Arduino connected and 113mA without the Arduino. That would be 650mW at 5,05V. The data sheet says 380mW at 5V...
Did you measure the drawn current on your DDS-60?
I would be interested to know if the chip on the DDS-60 is getting warm too.
Thanks again for this great program and for sharing it!
vy 73 de Hermann DL8MCP / AJ4ZS
I operate two DDS-60 boards. The DDS chip runs hot to the touch, without any perceptible problems, although I have not yet measured the current.
Andries Pretorius ZR6ABS
...AD9850 DDS modules
Nov 09 2011
I discovered REALLY CHEAP AD9850 DDS modules on eBay...
Simply goto EBAY and type: DDS module
There ate PLENTY of them !!!!
There are more expensive COMPLETE signal generators at around 60 $ but the modules i talk about are the ones with a square blue pot, a square 125 MHz quartz oscillator and an LED close to the oscillator. Those modules can be bought for less than 12 $. I bought one of them, breadboarded it with a PIC12F1840 for initial tests (serial access) and it works great !
The only problem is that documentation on the modules is inexistent. I examined the module and found this pinout (quartz oscillator on the LEFT)
Top and bottom rows:
Vdd D0 D1 D2 D3 D4 D5 D6 D7 GND
Vdd CLK Latch DATA RST GND SQW SQW SinA SinB
Vdd is +5V (chip can work at 3v3 but not guaranteed to work at 125MHz)
D0 - D7 = Parallel programming bits
GND = Ground (obvious); Vss
CLK = Serial programming clock
Latch = Serial programming latch (FQ_UD pin on 9850)
DATA = Serial programming DATA (internally tied to D7)
RST = Reset. Keep tied to GND
SQW = Square wave outputs (complementary) Duty cycle adjustable with blue pot.
SINA = Raw unfiltered AD9850 sine output
SINB = 70 MHz LPF filtered AD9850 output.
I only tried serial programming. For that purpose, D0 and D1 should be tied to Vdd and D2, to Vss. Keep D7 open, I left D2 - D6 open, but note sure about recommended pin status.
The format is:
W0 W1 W2 W3 W4 W5 ------------- W28 W29 W30 W31 0 0 0 0 0 0 0 0
The frequency word has 32 bits, W0 is the LSB and W31, the MSB. W0 is sent first.
The last 8 zeroes are for the two control bitys (keep at "0"), the powerdown bit (keep also at "0") and the five phase bits that i keet at "0" for now.
The frequency word calculation is:
WORD = Frequency * 4 294 967 296 / 125 000 000
I used 125 000 000 for the nominal quartz frequency. The quartz oscillator in not a TCXO and is NOT adjustable. For greater accuracy, you shall read the actual quartz frequency and use it in the formula.
Example: for 3750 kHz: WORD = 3 750 000 * 4 294 967 296 / 125 000 000 = 128 849 019
in HEX: 07 AE 14 7B.
The frequency resolution is 0,03492 Hz, so you can build a really smooth VFO with the AD9850.
Remember: This is a DDS. While the signal is not bad (use the filtered SinB signal), it is not perfect. If you want to get on the air, you will need a lowpass filter for your band to prevent interference.
DDS AD9850 module
Sorry to bump an old thread, but I recently got one of these and had a play. I, too, noticed things getting a bit warm so I checked around. The 125MHz oscillator is a 3.3v spec device. If you look carefully at some of the ebay adverts, you can see that some versions of the board actually say 3v3 on the oscillator itself.
To help counter the 5v/3.3v issue, I added two 1n4001 diodes in series with the supply, from the arduino to the DDS board and things seemed a lot happier. It isn't quite as low as 3v3 but at least the oscillator runs a lot cooler. I later replaced the arduino supply to the AD9850 with its own 7805, but I left the diodes in. I suppose I could have ordered a proper 3v3 regulator, but life's too short and I already had 5v regulators lying around.
I haven't had a problem with speed, so I guess it is happy at its supply level.
More on the AD9850 DDS VFO
Just to update:
I've built 3 of these AD9850 VFOs since my original note to Ross & they're now down to $4 or $5 bucks on eBay. Due to Ross's amazing arduino code they make terrific homebrew & boatanchor rig VFO's as well as bench test signal generators to 40Mhz. If anyone's interested I've posted a youtube video --> http://youtu.be/W_dlocgMEpI
73, Bob N9KR
Unreliable AD9850 DDS boards
I have got a bunch of these on ebay from different suppliers. I have noticed that a few do not work properly, from the ones I have tested. What happens is sometimes they produce a nice sine wave output at the desired frequency, and sometimes they do not. Flicking the Vcc line sometimes fixes the problem (if you can call that a fix). To explain further, when I flick the Vcc line, the AD9850 module does not power down completely as it is being kept half-powered by the 4 wires connecting it to the Arduino board. But it seems doing this "nudges" something and then the AD9850 starts, even though the Arduino was doing nothing at the time, which further means that the frequency was already transmitted properly but the AD9850 was refusing to produce it, until I flicked the Vcc line. If anyone has any ideas please let me know. Many thanks
I'm very happy to have found your webpage and your code!
My goal is to build a frequency-agile LOWFER receiver. I want to replace the 30 MHz oscillator on the AD9851 board with a very-low drift OCXO or the output from a GPS disciplined 10 MHz frequency standard.
I'm using your code on an Arduino Uno board using one of the newer AD9851 boards on eBay. Everything is working GREAT except the encoder is "jumpy." What I mean by this is as follows:
If I have it in 1 Hz mode and I turn it one click, the frequency moves anywhere between 1 and 20 Hz.
The 0.22uF caps make this worse. After removing the 0.22uF caps, it settles down some - it now jumps anywhere from 1 to 4 Hz.
I've tried it with two different mechanical encoders. One was from a junked monitor, the other is a Bourns unit from Adafruit that has very similar specs to the one you suggested from Mouser.
All of this is on a solderless breadboard, so I almost wonder if stray capacitance or something is causing the issue?
Any ideas welcome...but really...I could use it very effectively as-is!
thanks much and 73,
Fixed my encoder issue. :)
I figured out what was wrong with my encoders. Both of my encoders have detents. The detents were in a place where neither switch was active, so transitioning between detents caused several changes in the position of the switches before they went open again.
I just opened up one of the encoders, removed the detent spring, put it back together, hooked it up, and it works great!
Thanks much and 73,