MiniDDS

(Direct Digital Synthesis)

I often need a simple function generator. Just to generate a certain frequency. After all the years I’ve worked with electronics, I still haven’t got me one. Even though I need it now and then, I just couldn’t seem to justify the cost of one.
So, standard solution – build one yourself.
I designed a simple sinewave generator based on a Analog Devices AD9832 chip. It will generate a sinewave from 0.005 to 12 MHz in 0.005 Hz steps.
That’s pretty good, and definitely good enough for me ! But while waiting for the AD9832 chip to arrive, I came up with a very simple version of the DDS synth, using just the 2313 and a resistor network.

It’s controlled over RS232 from a small Windows program, and can generate Sine-, Sawtooth-, Trangle- and Sqare-waves ranging from 0.07 Hz to about 200-300 kHz in 0.07 Hz steps (depending on your crystal).
Windows Control programI wont go into details about how a DDS synth works. Maybe later. The code is pretty simple so you should be able to understand how it works by just reading through it.
Here’s the MiniDDS on a PCB that fits in a TEKO box.

There’s not much to say about the schematic. It’s as simple as can be. Just 4 major parts. A voltage regulator/switch, a RS232 interface chip, the 2313 and the R2R resistor network. The R2R network is connected to PORTB on the 2313, making it a simple D/A converter and makes it possible to output 256 voltage levels. Neither the resistor network or port drivers of the 2313 is of perfect linearity, but it works pretty well anyway. But you’ll probably need a buffer stage as the output impedance is rather high (tens of kOhms in my case).
The MAX603 handles the voltage regulation as well as the powerup/shutdown function, and is controlled by the DTR signal on the serial interface. So when you shut down the control program on the PC, the miniDDS will be shutdown, saving battery.
Click image to see a larger schematic.

The software is written in assembler, as it is very short and it need the speed in the main loop.
This is the heart of the synth. To be precise, it’s in the 7 lines of assembler that makes up the main loop.
The rest of the code is the wavetables and the communication code.
The phase accumulator uses 24 bits, which determines the resolution of the output frequency. Maximum available frequency and resolution is also dependent on your crystal frequency :

Resolution = fCPU/150994944 and

fOut = Accumulator * Resolution

In my case with a 11.059200 MHz crystal, the resolution is 0.073242188 Hz.
To get an output frequency of 1 kHz, we need to use a phase accumulator value of 0x003556 (13654 decimal).
This gives an output frequency of 1000.048835 Hz. Good enough for most hobby work !.

The communication is pretty simple and just allows you to set and read the phase accumulator value, as well as selecting the type of output waveform.
It uses a 32 bit value for the phase accumulator to be compatible with the larger DDS circuit using the AD9832 chip.