VFO with DDS

VFO with DDS

The oscillator is based on a board with AD9850 from Analog Divice of which are available in the online sales portal

The oscillator is designed to be used as RF generator from 0 to 40Mhz or as a VFO for a transceiver taking into account the conversion of IF and offset SSB or CW.
(07/06/2013) .... Firmware version v1.3 translate to English
(12/03/2013) .... Firmware version v1.3. Was added to the setup menu, the calibration function of crystal reference 125Mhz for fine adjustment of the output frequency. Also restricted access to FI offset adjustment when you are in Transmission.
(04/03/2013) .... Was corrected leg separation on the board 
(02/26/2013) .... Firmware Version v1.2

I want to acknowledge the contributions of friends like Victor (LU7DSM), Daniel (LU5JAU) and many others than with their technical contributions and suggestions helped me to improve this project.

The following links can find project documentation (schematic, PCB, micro firmware and manual):

NOTE: To download the  .HEX file in a folder, click with right mouse button on the "FIRMWARE OF MICRO" and when deployed the window, choose "SAVE LINK AS ....". Then the .HEX file shall be saved in the selected folder.

PCB View

View of Keyboard and Rotary encoder 

Components such as the "rotary encoder" may not be well known, so I show you some pictures of various models.
There are mechanical and optical encoders. The first ones are quite expensive and difficult to obtain while the second are easier to find and far more economical. Some of the mechanical push-button are included on its axis (which is used in this project to change the tuning step). The function of this device is to deliver two square wave signals which are in quadrature or phase-shifted + / - 90 ° according to the direction of rotation. These signals enter the chip to change the frequency of the VFO.  When the clockwise rotation frequency decrement, should be reversed terminals A and B. Mechanical encoders have a resolution of 12 to 15 pulses per revolution while opticians are 30 to 50 pulses per revolution.

Opticians usually are amplified, so you have to powered them. In case of using an optical encoder may have to remove the 100nF capacitors are grounded in the legs 6 and 7 of the micro.These devices can be recovered from old scrap of some models of monitors, mini audio components (volume) or obsolete radio equipment.Also found in the old "mouses" or computer mice, of those who came down with a ball, but in this case you have to adapt to a shaft. These are of the optical type.

The frequency can be varied with the encoder with steps selectable of 10Hz, 100Hz, 1kHz or 10kHz. Depending on the mode selected the output frequency matches the read on the LCD (generator mode) or is conversion to FI if used in SSB or CW mode (mode LSB, USB, CW).
The oscillator frequency can jump from band to band for the displacement facilitate.
Another feature is to have two VFO's, that allows to work in duplex, transmitting on one frequency and receive on another.

The circuit is powered by a DC source appropriately filtered from 9 to 12V. The OFV always starts in the last used frequency band. The RF output is 1Vpp. The circuit has four buttons like "touch". Some of the buttons have a dual function depending on how long are maintained under pressure. A short pressure acts on the basic functions while a long on special.
The key of TX / RX or PTT off the VFO in reception  when VFO is in generator mode.

FUNCTION BAND: Pressing button BAND are going cyclically changing bands from 160m to 10m amateur bands including new.
FUNCTION MODE: Pressing the MODE button are going cyclically changing the generator mode, LSB, USB or CW.
FUNCTION VFO AB / SPLIT: Pressing the button in short form AB VFO oscillator is changed to another.
Pressing the button in the form long VFO AB Split mode is entered. In this mode and being in LSB, USB or CW when moving from TX to RX VFO is changed. To exit Split press again the button VFO AB in the form long .
FUNCTION STEP / SETUP: Pressing in short form STEP button will cyclically changing in steps or frequency jumps when rotating the encoder. These steps can be 10Hz, 100Hz, 1kHz or 10kHz and this is marked on the LCD frequency readout emphasizing the number changed.
Pressing the button in long form, is passed to SETUP function. Rotating the encoder searches menu the parameter to be changed. Then click on the STEP button in short form to enter and modify the value.

1) IF OFFSET: To make this adjustment the DDS should be in reception (Rx), then the VFO is placed automatically in the generator and encoder finds the center FI channel. To store the value you must press the button in form long STEP.
2) SSB OFFSET: Here is placed the value at half the bandwidth of the SSB filter. So if the filter is 3000Hz  should be placed 1500Hz . Is calibrated on the upper sideband.
For the case of LSB to frequency LO (local oscillator) is added the value of BLU. For USB subtracts the SSB to LO. To accept press in form long STEP button.
3) CW OFFSET: Similar to the case of SSB but for the bandwidth CW filter. Note that the conversion CW always done on the upper sideband.
4) CONVERSION: Here you select whether the conversion is positive or negative, ie if the output frequency of the VFO is LO = RF + IF or LO = RF - IF. To accept pres in form long STEP button.
5) CAL. XTAL: It help to correct  the crystal reference  of the DDS and then adjust its output frequency. For calibration use a frequency counter or tune whith a receiver a known broadcasting, then place the DDS  in GEN function and search the display the same frequency of broadcasting. They must hear a beat signal, then go to Settings Menu and choose the function 5) XTAL CAL. Vary the encoder to hear the beat to zero and confirm by pressing the button STEP in long form.
6) LICENSE: Here you can edit the presentation of the display when the oscillator turns placing their own license. Look for the letter, number or character to be changed with the encoder and then pressed to accept STEP  in short form . So on until the 6 spaces.

In the case of malfunction or errors in the internal memory can be reset the microprocessor and reinstall defoult values. To do this, turn on the VFO pressing the STEP / SETUP  switch for a moment, the display will show the words "reset values" and then the boot logo.

56 comentarios:

Prakash Raj dijo...


Congratulations for the good work.Can you provide an option for switching LSB USB crystals through PIC Pins.

Warm Regards

LU5DJV dijo...

Hi Raj, thanks for visit the page. I'm workin on it. I have not much time, but I hope to finish the modification soon.


Prakash Raj dijo...

Hi Felipe

MAny Thanks for the information. Very nice and cpmpact design. Very interested to build one. Waiting for the updated version Sir.

Thanks n Regds

Jayaprakash L V dijo...

Hi Philip Thanks for maintaining a very informative blog regarding DDS. Really appreciable work. In addition to Raj's suggestion , an option for BCD output may be provided for switching Band Pass Filters. It is very helpful with Hombrewed Multi Band Transceivers


LU5DJV dijo...

Hi Jay, thanks for your comments. Regarding your concern, I commented that the new hardware will have 16 outputs, to control the bandpass filters, 3 IF filters (CW, SSB and AM), TX / RX switching and other functions. Of these 16 outputs each uses that interest to your project.

Jayaprakash L V dijo...

Hi Philip

Thanks for the nice information. It would be nice option for Homebrewers. Congratulations


Anónimo dijo...

Thank you for sharing your effort !!

But the dropbox link does´nt work anymore ?

I had an issue with that in the english version the Gen-mode wouldn´t work so I thougt I will try the original version DDS_V13.hex
but the link was broken :-(.

Anyway best 73:s de Kenneth / SM0OHC

LU5DJV dijo...

Hi Kenneth, thanks for the warning of the problem with the link, which has already been resolved.
Could you tell me what was the problem, do not allowed to operate the DDS in the mode generator.

Felipe LU5DJV

Anónimo dijo...

Hola Felipe !

I did missunderstand the last line in the Introduction of the manual:

What you wanted to say was that in:
Generator-mode to enable output you have to activate TX.

That what was I have missed so your program works perfect ! :-)

One wish would to make a version for single-line displays the cheap one works though like a 2x8-display
(Compare IK3OIL:s cw-reader LCD16117.asm)

A format would be eg:

ie vfo a, fq, upper sideband and rx and so forth...

It would help in making a mini frontpanel area of a qrp-rig.

73:s de Kenneth / SM0OHC

Anónimo dijo...

By the way

Is there anyone who have exchanged or modified the 125 Mhz for better stability ?

Because it is really unstable 5 degrees change makes almost 20-30 Hz in my two examples... a TCXO-version
without heater for power-saving of course ;-)

Best 73:s and happy homebrewing de Kenneth / SM0OHC

Julio Cesar Rosa CesarSound dijo...

Hola Felipe,
Congratulations, very good project, continue doing this great job. I will assemble this VFO and send you a picture. Thanks! Greetings from Brazil. Julio.

Julio Cesar Rosa CesarSound dijo...

Hi Felipe,
My suggestions for a future firmware update:
-Include the step of 100kHz for fast scanning of bands (useful for shortwave listener)
-Include the step of 5kHz (useful for tuning Broadcasting Stations on shortwave bands)
- Include the step of 1Hz (useful for audio application, as this DDS can be used as an audio generator)
Thank you for this smart project.

LU5DJV dijo...

Oi Julio, o firmware do microprocessador com passos de 100kHz e 1Hz está na página em espanhol "DDS com VFO". Você pode encontrar o firmware (em espanhol) nas Atualizações

Julio Cesar Rosa CesarSound dijo...
Este comentario ha sido eliminado por el autor.
Julio Cesar Rosa CesarSound dijo...

Hello Felipe, thank you for this new firmware 1.4, your project is very good. I intend to mount a multiband receiver (0-30MHz) with this great DDS. I have bought 2 DDS modules on ebay, I'm hoping to get it soon. With the second module will mount a signal generator for audio and RF, for use in my desk. Again thank by this simple, efficient and intelligent design. When I have finished assembling my send a photo for you. Thanks. Julio.

Ricardo dijo...

Hola Felipe tengo las fotos de mi DDS ,, quisiera me digas a que correo te lo puedo mandar ya que en la pag no lo encuentro como hacer... desde ya muchas gracias a vos y lo mismo a Daniel(lu5jau)que me ayudo muchísimo.
Ricardo (lu1jce)

LU5DJV dijo...

Hola Ricardo, me pone muy contento que hayas podido armar el DDS. Daniel un fenómeno, asi como Victor LU7DSM fueron los primeros en armarlo. Las fotos las podes mandar a lu5djv(arroba)gmail(punto)com.

Felipe / LU5DJV

Anónimo dijo...

Hello Felipe,

The program works perfect, now I expect from ebay the ad9850 module. Please, tell us, all modules are power supply to 5 volts , because I noticed they are echipated with varios type of cristal oscilator ?
Thank you !

LU5DJV dijo...

Understood that both the AD9850 as the PIC16F628A can operate from 3.3V to 5V. Now the AD9850, powered with 3.3V only supports a maximum clock frequency of 110Mhz, and these modules all come with 125Mhz crystals, so I conclude there to powered them with 5V.
I have experimented with many of these modules with different types of crystals and purchased from different Ebay sellers and they all worked properly with 5V

fosila dijo...

imi place montajul e foarte simplu si usor de realizat cu salutari yo3bzw romania

Michel/F5DEQ dijo...

ola Felipe !
buen trabajo con el dds !! podemos haber el code source for una aplcacion pour un tx 144 el IC202 viejo !!
saludos ! Michel de F5DEQ ( francia)

LU5DJV dijo...

Hi Michel,I'm sorry but the source code I can't send you because it was made with some routines (extracted from the company where I work) that have copyright protection, and don't allow me to share.

Anónimo dijo...

Hi Felipe

It's a very interesting project! and exactly the same that I need to make a VFO for a Sailor exciter.

I'd like to do this week and I think that good be succesful but otherwise would be posible to share the code source?.

Thanks for this useful circuit

Antonio (EA1IIH).

LU5DJV dijo...

Hola Antonio, le respondo lo mismo que le dije a Michel F5DEQ, lamentablemente el programa fue realizado con algunas rutinas que tienen derechos de protección y no tengo la autorización de sus creadores para pasarlo.


Anónimo dijo...


Dear friend, I and my friends assembled your dds projects, it works perfectly. But I, and a few Turkish radio amateurs, can not solve some problems about your projects.
This questions are so:
when you push mode button, the USB, LSB, CW & GEN appears.
But the result of this mod, only can frequency change a bit.
Example, at LSB mod frequency= 2083,8Khz. USB= 2081,8Khz, CW=2082,4Khz can create the circuit.
But this result can not give us USB mod. For USB mod, we must adjust the BFO frequency on the rig, not on DDS. Or are there some critic logic about mods which we can not solve for USB mode?

LU5DJV dijo...

Dear Dündar, the output frequency of the DDS was designed to work both LSB and USB using a single filter to generate the SSB.
Assuming a positive conversion, the output frequency would be:

For GEN: LO = RF

To avoid frequency shifts when you use USB or LSB should go changing the offset frequency of IF and SSB to center FI channel.

For example if you use a 9 MHz IF, (but where the pass frequency ranges from 9.000Khz to 9.003Khz) IF offset must be offset 9.001.500Hz and offset SSB should be 1.500Hz.

Check the manual available on the blog for more information.

Regards . Felipe

Ernando T dijo...

Hello Felipe ,como estas? Saludos desde brasil , gracias por compartir el Projeto ,lo he hecho co exito ,gracias,


Ernando Toledo

Anónimo dijo...

Dear Felipe,
I built for several DDS controller with your design successfully, and thank you very much for make it available freely for us.
My problem is when in GEN mode, there is no signal come out from the DDS output. is this normal or is there any other settings to make GEN mode working?

thank you,


LU5DJV dijo...

Hi Rudik, when you use GEN mode, the DDS is stand by on Rx (reception), but if you change to Tx (transmission) the DDS will start to work. Output frequency is same that the display.

co6bg dijo...

Hola Felipe y a todos los demas.
Hi Guys
I have a problem with the FT-101E.
The IF value is fix 3.18 Mhz but for each band I need to change this value because a xtal is added.
Have you any solution for this issue?
Ex FT-101E
40m-IF3.18 Mhz + Xtal 13.02Mhz=16.200Mhz
80m-IF 3.18 Mhz +Xtal 9.52Mhz=12.700
Any suggestion?
Thank you in advance.

dündar yasa dijo...
Este comentario ha sido eliminado por el autor.
dündar yasa dijo...

Dear Felipe, i can say this project is a perfect project. But there is a negative case. This pcb is a little bit large. I find a formula, that i folded this pcb at the center. And screwed LCD, DDS all together over and over. And the last, pcb dimension is 4x9 cm, now it squeezes together with transceiver easily in to a small case.TA3IHD 73

Anatoly G dijo...

Hi Felipe!
My congratulations! I have investigated a lot of similar DDS projects. Your solution is BEST!!!
Unfortunately I am novice in microprocessors and have no idea in which way possibly to make switching for band filters... How it could be done in your solution? Please, help!

Best regards?
Anatoly, UT5ULX

LU5DJV dijo...

Hi Anatoly, in this blog I have a circuit that switches the bands:
to the outputs of these registers you can connect a relay to switch bands.


Anatoly G dijo...

Hi Felipe!

Thanks a lot!

Best regards

Doru Stana dijo...

Hi Felipe.
I built several DDS controller with successful design, and thank you very much to make freely available to us.
My problem is when the GEN module, there is no exit from the output signal DDS. Is this normal or is there any other settings to make way GEN work? thank you YO2MBB Entertainment. I need 5 license code. Thank You.

Anónimo dijo...

Saludos a todos, no me funciona, ya lo ensamble y solo me enciende la pantalla algunos segundos y se apaga el display, sabe alguien la causa ?

Anónimo dijo...

Hola Felipe: tengo armado el OFV tal como lo publicaste y te puedo asegurar que es una joya. Lo estoy usando para controlar un traansc. BITX20 modificado para 40 metros y armado en casa. Lo voy a "prolijar" un poco y te mando las fotos. Muchas gracias por tu generoso aporte a ala afición. Un abrazo. Ricardo, LU7CRA

LU5DJV dijo...

Hola Ricardo, me alegra que te haya servido el proyecto.

Saludos / Felipe

Anónimo dijo...

Hi, this is one good project. thank you. I'm building one for my HF. Lets me ask you, I cant use an display 20x2 for the 16x2?
sorry for my English.
73!!!!! CL7OK

Anónimo dijo...

Very interesting and cheap project.
I put an AD8008 amplifier to get 8V peak to peak.
But why there is no 100 kHz step ?
73 from Pierre F6IDT

Josip Bedenicec 9A2QP dijo...

Congratulations for the good work Felipe I am integrated this DDS with 6band SSB/CW modul made in China (Hi Hi) and working great mini QRP and cheap price . Thank for nice project.
Joe 9A2QP

Hugo Herrera dijo...

Hola.. he probado todo y solo el display me indica 160m la frecuencia y TX-A, ademas lo puedo resetear, pero no sale de eso..
No tengo referencias como setear la opcion del Oscilador del JDM serial.. Si alguien me puede ayudar..
Gracias / Hugo

co6bg dijo...

Hola Hugo, saludos a todos por casa.
Si el display te marca Tx, quiere decir que el punto que hace eso esta permanente a tierra, no recuerdo ahora cual es, revisalo, quizas por eso no te deje que se te activen las demas funciones.
Escirbeme directamente a uno de mis correos por favor
Buen Dia


LU5DJV dijo...

Hola Hugo, fijate si no te quedo trabado algún pulsador o un corto circuito a masa en uno de ellos. Chequea con un voltímetro que pase de 5V a 0V cuando pulsas cualquiera de los 4 botones.


Anónimo dijo...

Hi Felipe, thank you for your great project. Please could you add button for UP/DOWN step? It would be very usefull. Thank you very much. Alexander OK1CQ

Esteban Pascazzi dijo...

Bueno ya armè el circuito y parece que funciona !! lo ùnico que cambiè fuè la resistencia de 1k en la pata 3 del display porque el contraste estaba tan fuerte que no podìa ver nada....en mi caso dejè una de 3k luego de jugar con un pote hasta ver los caracteres. !

Stetison dijo...


If I use this DDS instead of a local oscillator receiver, how will I feed the varicaps the tuned circuit input?

LU5DJV dijo...

In this case you need two tuning controls, one for the DDS and another to control the varicap tuning circuit input.

Alexandru Perietanu dijo...

Nice project!
An assistant from my university asked my I can modify the code for this project to add a 4 line display instead of 2 line. It this possible?
I managed to convert the hex to asm code. In what language did you write the original code for this?
Should I try to modify the asm code?

Biju Apkrcl dijo...

Very good work. Congratulations.

Tunisia Birding dijo...

I installed the DDS VFO on a bitx20 there is a problem of BFO. What to do ?
thank you 73,

Paraventje dijo...

Hello thanks for the good work!!
Is it possible to get a gerber file so I can let make a PCB??

Kind regards
Henk, PA3EMX

isllogo dijo...
Este comentario ha sido eliminado por el autor.
Ricardo R. Rivera dijo...
Este comentario ha sido eliminado por el autor.
Ricardo R. Rivera dijo...

Hello Felipe,

Cold you share again the v1.4 as link no longer working.
my email;