Arduino Frequency Synthesiser Using 160MHz Si5351


Introduction: Arduino Frequency Synthesiser Using 160MHz Si5351

About: 55+ years in electronics, computers, and teaching ... now retired.

This Instructable describes the construction, and operation, of a stand-alone frequency synthesiser suitable for use as a signal generator, or for use as the local oscillator in an amateur band transmitter or receiver.

My prototype was built on a piece of "Vero" board. The ATmega328P must be socketed if you choose to make your own "Vero" board Arduino. The Arduino source code is well annotated and contains links to all of the required "libraries". Construction is not critical.

Adafruit Si5351A Clock Generator:

The heart of this frequency synthesiser is the "Adafruit Si5351A Clock Generator Breakout Board" which can generate up to three outputs in the frequency range of 8KHz to 160MHz. The Si5351 breakout board is designed to run off 5 volts and has an I2C interface which makes it easy to connect to an Arduino. All that you need is an Arduino, a rotary encoder, a 16 character x 2 line I2C LCD display, and some software. The output level from this synthesiser is approximately 3 volts peak-to-peak.

Rotary Encoder:

The second most important component is the rotary encoder which outputs the following two-bit "Gray" code pattern:


11 (indent - CCW)




11 (indent - reference )




11 (indent - CW)


The encoder always rests at an indent (pattern 11) when the tuning knob is stationary. If the tuning knob is turned CCW (counter clock-wise) then the pattern sequence between indents is 01, 00, 10, 11. If, however, the tuning knob is turned CW (clock-wise) then the pattern sequence between indents is 10, 00, 01, 11. This pattern reversal allows us to determine the tuning direction. The new frequency is determined by multiplying the number of "indents" by the tuning step-size and adding/subtracting this offset to/from the current frequency.

The rotary encoder comes fitted with a single-pole push switch which I use to control the tuning step-size in increments of 10, 100, 1000, 10000, and 100000 Hz. A brief push on the tuning knob increases the tuning step-size. A longer push on the tuning knob causes the step-size to decrease.

All mechanical switches suffer from contact bounce which makes for erratic tuning. Instead of "debouncing" each switch with hardware I am using a software integrator.

A SPST band-change switch has been included. When the switch is activated it is possible to cycle through each of the amateur radio bands by rotating the tuning knob. The tuning knob behaves normally when the switch is deactivated.


Programming the ATmega328P microcontroller is relatively simple. First install the "libraries" documented in "source_code.txt". Paste the contents of "source_code.txt" into a new arduino sketch and save it as "signal_generator.ino". Click "file/upload" and, all going well, "signal _generator.ino" will compile then upload to your Arduino R3 UNO. Once the file has been uploaded, unplug the ATmega328P microcontroller from your Arduino R3 UNO and insert it into your "Vero" board socket. Apply 9 volts and everything should light up.


Even though the breakout board runs off 5 volts, the Si5351 chip itself runs off 3.3 volts. This means that the maximum voltage from each output is 3.3 volts. A buffer is therefore required when interfacing to 5 volt logic circuits.

  Click here   to view my other instructables.



    • Oil Contest

      Oil Contest
    • Clocks Contest

      Clocks Contest
    • Casting Contest

      Casting Contest

    We have a be nice policy.
    Please be positive and constructive.




    The "si5351" library may be found at

    The "si5351.h" and "si5351.cpp" files are contained in a folder named "src" which must be renamed to "si5351" (without the quotes).

    The correct liquid crystal library depends on your LCD. I used one from

    Thank you :)