- Introduction
- Components
- Schematic
- BFO interface
- Arduino pins and Encoder, Step, Reset BFO and Turt On or Off commands
- SI5351 Calibration
- References
- Videos about this project
The Si5351 is an I2C configurable clock generator that is very appropriate for receivers and transceivers projects in amateur radio applications. It is also suited for replacing crystal oscillators. It has three outputs that you can get three distinct frequencies at the same time. A great feature of the Si5351A is the possibility of using it with a microcontroller or platform like Arduino, PIC family and others. This small project is about a BFO that you can control the output of the Si5351A by using the Arduino Micro (Atmega32u4). The BFO tested here ocilates from 452KHz to 458KHz. However, you can change this range for other between 8Kz to 160MHz. Click here to watch a video about this BFO.
See also the similar project "VFO and BFO with Si5351 and OLED, controlled by Arduino (Micro)"
The first real test with this BFO project was made with a commercial radio that does not have SSB support.
The Redsun RP-2100 is a multi-band commercial radio. It has no SSB internal support. However, it has an IF AM output that allows the user to connect a BFO or a Down-Converter (455 KHz to 12 KHz) to provide SSB, DRM and other modes. The photos bellow show the radio and BFO setup. You can also watch the video "BFO with SI5351 and Arduino test with REDSUN RP2100".
- AZDelivery 1 x OLED Display Arduino 128 x 64 Pixels White 0.96 Inch I2C IIC Module for Arduino. This project uses the Text only Arduino Library for SSD1306 OLED displays Arduino library.
- Adafruit Si5351A Clock Generator Breakout Board - 8KHz to 160MHz. This project uses the Si5351 Library for Arduino.
- One regular encoder.
- Three regular Push Button.
- Two 10nF ceramic capacitor
- Six 10K resistor
- One 1K resistor
- Arduino Micro (Atmega32u4)
The user can control the BFO by using tow buttons and an encoder.
- The Step button changes the increment and decrement step. It can be 10Hz, 50Hz or 100Hz. The BFO can oscilate from 452KHz to 458KHz. You can change this range and frequency if necessary.
- The Reset VFO button sets the BFO to central frequency (455KHz);
- The Turn On/Off BFO button turns on or off the BFO. If it is pressed, alternates On and off. BFO off means no output signal.
The schematic was built by using Fritzing Software, an open-source software tools to design circuits. See folder schematic.
This section shows some aspects of the BFO Arduino sketch implementation.
The pins for encoder and push buttons are defined bellow. If you need to change some push button pin, you should be aware that the push buttons are connected to pins with external interrupts support. On Atmega32u4 you can use the pins 0,1,2,3 and 7, on 328-based (Nano, Mini, Uno) you can use the pins 2 and 3.
The short code below is part of the Arduino sketch and shows the enconder and push buttons setup.
#define ENCODER_PIN_A 8 // Arduino D8
#define ENCODER_PIN_B 9 // Arduino D9
#define BUTTON_STEP 0 // Control the frequency increment and decrement
#define BUTTON_RST 1 // Set the frequency to central position
#define BUTTON_ON_OFF 7 // Turn BFO ON or OFF
The short code below shows the BFO frequency setup.
// BFO range for this project is 4520KHz to 458KHz. The central frequency is 455KHz.
#define MAX_BFO 45800000LU // BFO max. frequency
#define CENTER_BFO 45500000LU // BFO center frequency
#define MIN_BFO 45200000LU // BFO min. frequency
The unit of frequency is 0.01Hz (1/100 Hz). See Etherkit Library.
You might need a different BFO frequency. If you want to modify the central frequency of BFO to 10MHz (for example), just change the lines below.
#define MAX_BFO 1100000000LU // BFO max. frequency (11MHz)
#define CENTER_BFO 1000000000LU // BFO center frequency (10MHz)
#define MIN_BFO 995000000LU // BFO min. frequency (9MHz)
The buttons were implemented by using Arduino interrupts resource. The code bellow shows it.
// Will stop what Arduino is doing call the function associated to the button
attachInterrupt(digitalPinToInterrupt(BUTTON_STEP), changeStep, RISING); // whenever the BUTTON_STEP is pressed call changeStep
attachInterrupt(digitalPinToInterrupt(BUTTON_RST), resetBfo, RISING); // whenever the BUTTON_RST is pressed call resetBfo
attachInterrupt(digitalPinToInterrupt(BUTTON_ON_OFF), bfoOnOff, RISING); // whenever the BUTTON_ON_OFF is pressed call bfoOnOff
You might need calibrate your si5351 to get more precision during signal generation. To do that you can use the si5351_calibration.ino sketch that comes with the Si5351 library for Arduino. Click here to see more about si5351 calibration. You can also try watch this Portuguese video that show how to calibrate the si5351. Another video about si5351 calibration can be watch here (Homebrew 80/40m SSB/CW Rig - #7a Si5351 Calibration).
The line code bellow shows the correction factor found during this project.
// Change this value bellow (CORRECTION_FACTOR) to 0 if you do not know the correction factor of your Si5351A.
#define CORRECTION_FACTOR 80000 // See how to calibrate your Si5351A (0 if you do not want).
if you do not want calibrate, set CORRECTION_FACTOR to 0 as shown bellow.
#define CORRECTION_FACTOR 0