A signal generator based on the Analog Devices AD9850 Direct Digital Synthesizer.

Range: 0.1 - 40 MHz
Frequency entry through 4x4 keyboard in 1Hz resolution
Frequency increment/decrement with rotary encoder
Frequency step selectable from 1Hz, 10Hz, 100Hz, 1kHz, 10kHz
Step multiplier selectable from 1-9
Frequency can be swept up/down
Frequency can 'wobble' in 250 steps, with corresponding X-output
Output adjustable from 0dBm to +10dBm
Output is constant over range within 1dB
Narrow range spurious free dynamic range: 60dB
Harmonics: <40db (0dBm), <20dBm (+10dBm)
Uses two 16F84 microcontrollers

zip-file with schematics, pictures, sources

A signal generator is almost a must to have for the serious homebrewer. You will need it for testing receivers, transmitters, amplifiers, attenuators, filters etcetera. Ultimately, I want to build a signal generator with a range of 1-1000MHz. I have now completed the first step: a DDS based generator with a range of 0.1 - 40MHz. This range is limited by the DDS/Clock used, but this design will allow me to use it as a reference for wide range VCO/PLL combinations.
I started experimenting with the AD9850 using an experimenter's board supplied by Leon Heller. (He can supply the board with the AD9850 ,which may be difficult to get hold of in small quantities) I wrote a small Visual Basic program to control the AD9850 using the PC parallel port.

I then started working on using a Microchip 16F84 PIC to control the AD9850. Problem with the 16F84 is limited I/O, so I opted for using a separate 16F84 to read a 4x4 keyboard . This controller program reads the key-code and sends the code over one I/O pin to another 16F84. This controller reads the key-code and also reads a rotary encoder. It controls the AD9850 DDS , writes info to a 2x16 LCD and writes an eight-bit counter value to a DAC. See the block-diagram. The AD9850 is followed with a filter and an amplifier. Output of the amplifier is sampled and compared with a set level. The resulting error signal is used to control a Variable Gain Amplifier (VGA). The output is, as far as I can determine, constant within 1 dB over the generator range.
I used the National Semiconductor CLC5523 VGA. This is an excellent low-noise amplifier for the purpose. The VGA is followed with a Texas Instruments TI6002. This is a current feed-back amplifier designed for use in xDSL systems. It is a dual op-amp chip, I used only one amplifier. It has a very small heatsink and I have pushed the output to as much as half a watt without problems. In a dual amp configuration it could very well be used as a QRPp 'PA', were it not for the fact that it needs +12V and -12V. The output stage is not particularly critical, a dual-gate MOSFET as VGA and MAR/MAV type amplifier would also do nicely.

The 'wobble' function is particularly useful for making measurements on filters. After having completed the controller software I thought about adding a 'wobble' function. With 'wobbling' I mean repeatedly sweeping up and down around a given frequency. I chose to simplify this somewhat and use one eight-bit variable to count between one and 250. When 'wobbling' is started, the counter is set to 125, the software then enters a loop where the counter is incremented/decremented, the frequency is incremented/decremented with step x multiplier, and the counter value is clocked out to a 74HC(T)595 eight-bit shift-register. If the counter reaches 250, the increment is changed to decrement. If the counter reaches one, the decrement is changed to increment. The shift-register has an R/2R network attached, so it can function as a simple Digital to Analog Converter (DAC). The DAC output goes to the X-input of an oscilloscope. The signal-generator output goes to the Device Under Test (DUT). The DUT output is connected to a log-detector. I currently use an Analog Devices AD9807 which has excellent linearity from -65 to +10 dBm. The log-detector output goes to the Y-input of an oscilloscope. As the signal-generator 'wobbles', the X-signal goes up and down, sweeping the oscilloscope dot from left to right and vice-versa. The variation in filter response makes the log-detector output go up or down, sweeping the oscilloscope dot up or down. If all oscilloscope settings are just right (takes some time...) the filter response is shown on the oscilloscope screen. The 'wobbling' is rather slow (two up/down sweeps per second), perhaps too slow for comfortable curve viewing on an oscilloscope screen. The software has a function to switch off LCD updates of the DDS frequency during 'wobbling', this doubles the speed. Also, in this mode, the frequency displayed on the LCD is the frequency at the centre of the X-axis of the oscilloscope. Rotating the encoder will increment/decrement this centre frequency. This makes determining the frequency response of a filter very easy: place the point of interest at the oscilloscope display centre and read the frequency from the LCD.
The result is quite usable, I think. The DDS certainly has lots of spurious and this signal-generator is not fit for use as a Local Oscillator in a receiver or transceiver. It would have to be incorporated in a VCO/PLL system to make the output clean enough.

The microcontroller program ended up being rather complicated. Not because it really is complicated, but to fit the program in the available 1024 words of program space, I had to remove a lot of the subroutine structure and use in-line code instead. This makes the program difficult to read. I have included a much simplified flow-chart here.

I built all of the circuits 'ugly' style. All of the IC's used were SMD. This proved not to be a great problem, although the AD9850 required special attention. I glued this chip upside down on a small piece of PCB . I bent all pins that were to go to +5V upwards. I connected all these pins with a piece of wire. I soldered a few 100nF SMD capacitors directly between this wire and the PCB. All ground pins were bent downwards and were sodered directly to the PCB. The remaining pins were connected using thin enamel wire. Keeping decoupling and ground leads short helps in improving spurious.
4x4 keyboard controller
LCD, Encoder, DDS, Shift-register controller
AD9850 DDS
VGA and amplifier
Level circuit
Digital to Analog Converter

DDS program flow
Reading a 4x4 keyboard
DDS, LCD, encoder, shift-register

Signal-generator front
AD9850 experimenter's board
AD9850 mounted 'ugly' style

The whole lot

I would welcome any comments. (email address is on my home-page)

Thank you !