After the initial testing on 3.3Ghz made some changes on the software in order to set some common frequencies for future testing with QO-100 satellite equipment and also added provision to sweep around the frequency currently set in order to test some filters. Output on 3.4Ghz: And testing the third harmonic: The Rigol is not a 10Ghz version, I'm using a down converter before the input, that will be another post... The diagram, at this stage I still didn't added the two extra buttons (look on code for mode and band), to change band and to change mode between set frequency and sweep. Inside on the almost final interaction (waiting SMA's to connect to front pannel): And the front panel view working:
The code on the current version, keep in mind might still have some bugs, reach me for latest version if there is one: If blogger breaks formatting ask me a copy by email.
ADF4351 signal generator
CT2GQV 2020
v1.4
Based on code from: ADF4351 example program https://github.com/dfannin/adf4351
VFO with 100Khz steps starting from a predifined frquency (UL frequencia) using 2 buttons for up and down.
Display on 16x2 I2C LCD of the frequency set and the third harmonic value
Also serial output of the main frequency set.
Possibility to sweep for filter testing.
*/
#include <Arduino.h>
#include "adf4351.h"
#include <LiquidCrystal_I2C.h>
#define SWVERSION "1.4" // 2021-09-11
#define PIN_SS 9 ///< SPI slave select pin, default value
ADF4351 vfo(PIN_SS, SPI_MODE0, 1000000UL , MSBFIRST) ;
//unsigned long frequencia = 3333320000UL ; // 3.333.334 (10 Ghz n=3)
unsigned long frequencia = 3496500000UL ; // 3.496.000 (10.489 Ghz n=3)
unsigned long maxfrequencia;
unsigned long minfrequencia;
// unsigned long frequencia = 2000000000UL ; // 2.000.000 (10 Ghz n=5)
// unsigned long frequencia = 414000000UL ; // 414.000 (10.368 Ghz n=25)
// for 442Mhz use the bellow and comment the above
// unsigned long frequencia = 442000000UL ; // 442Mhz or 1.326 Ghz , tird harmonic
// I2C LCD virtual pinout
#define I2C_ADDR 0x27 // I2C Address for my LCD, found with I2C scanner
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);
// buttons for up/down in frequency, puleed up from 5v with a 10K resistor, analog pin will be short to ground for button press
int button0 = 0; // mode
int button1 = 1; // up
int button2 = 2; // down
int button3 = 3; // select / band / step
int opmode = 0; //
int tempopmode = 0; //
int band = 0;
// Band 0 - 10Ghz (3.3Ghz harmonic) - 10489.550 to 10489.795MHz ->
// Band 1 - 2400.050 frequencia = 2400500000UL
// Band 2 - 1969.5Mhz (-2400 = 431Mhz )
// Band 3 - 2256 (2400-144Mhz) - 2400.050 to 2400.295MHz
// band 4 - 739.55 - LNB out
void setup()
{
Serial.begin(9600) ;
Serial.print("adf4351 VFO CT2GQV "); Serial.println(SWVERSION) ;
pinMode(button0, INPUT); // mode
pinMode(button1, INPUT); // up
pinMode(button2, INPUT); // down
pinMode(button3, INPUT); // band
lcd.begin (16, 2, LCD_5x8DOTS); lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE); lcd.setBacklight(HIGH); // 20x4 lines display LCD
lcd.home();
lcd.setCursor(0, 0); lcd.print("Signal Generator ");
lcd.setCursor(0, 1); lcd.print("Ver: "); lcd.print(SWVERSION);
Wire.begin() ;
/*!
setup the chip (for a 10 mhz ref freq)
most of these are defaults
*/
vfo.pwrlevel = 3 ; // measured at 3.3Ghz after 1m cable >> "0" = -8 dBm / "1" = -5.8dbm / "2" = -3.3dbm / "3" = -0.4dbm
vfo.RD2refdouble = 0 ; ///< ref doubler off
vfo.RD1Rdiv2 = 0 ; ///< ref divider off
vfo.ClkDiv = 150 ;
vfo.BandSelClock = 80 ;
vfo.RCounter = 1 ; ///< R counter to 1 (no division)
vfo.ChanStep = steps[2] ; ///< set to 10 kHz steps
/*!
sets the reference frequency to 10 Mhz
*/
if ( vfo.setrf(10000000UL) == 0 )
Serial.println("REF.SET: 10 Mhz") ;
else
Serial.println("ERROR: reference freq set error") ;
/*!
initialize the chip
*/
vfo.init() ;
/*!
enable frequency output
*/
vfo.enable() ;
delay(500);
lcd.clear();
if ( vfo.setf(frequencia) == 0 ) {
Serial.print("VFO.SET:") ; Serial.println(vfo.cfreq) ;
lcd.setCursor(0, 0); lcd.print("F :"); lcd.print(frequencia/1000);
lcd.setCursor(0, 1); lcd.print("F(3):"); lcd.print((frequencia/1000)*3);
} else {
Serial.println("ERROR: Set init Frequency") ;
}
vfo.ChanStep = steps[4] ; ///< change to 100 kHz
}
void loop()
{
int buttonState0 = analogRead(button0); // mode
int buttonState3 = analogRead(button3); // band
int buttonState1 = analogRead(button1); // up
int buttonState2 = analogRead(button2); // down
// serial debug for the button for +/- frequency
// Serial.print("B1,B2:"); Serial.print(buttonState1); Serial.print(","); Serial.println(buttonState2);
// band / start/stop sweep
// button pin is puled down to ground...or close to it (100) as long as lower than 2049
if (buttonState3 <= 100) {
{
if (opmode == 1 ){
/////// start stop start procedure
if(tempopmode == 1) // started
{
lcd.clear();
lcd.setCursor(0, 0); lcd.print("SWEEPING starded ");
lcd.setCursor(0, 1); lcd.print("Stop----------> ");
tempopmode = 255;
maxfrequencia=frequencia+10000000; //compute the max frequency so we start from the one now and 100Mhz down and up
minfrequencia=frequencia-10000000; //compute the min frequency so we start from the one now and 100Mhz down and up
delay(150);
}
else // is stoped
{
lcd.clear();
lcd.setCursor(0, 0); lcd.print("SWEEPING stoped ");
lcd.setCursor(0, 1); lcd.print("Start---------->");
tempopmode = 1;
delay(150);
}
};
// we are in band mode
if (opmode == 0 ){
Serial.print ("BAND: ");
band++;
if (band > 4){band=0;};
if(band == 0){
frequencia=3496500000UL;
vfo.setf(frequencia);
lcd.clear();
lcd.setCursor(0, 0); lcd.print("F :"); lcd.print(frequencia/1000);
lcd.setCursor(0, 1); lcd.print("F(3):"); lcd.print((frequencia/1000)*3); };
if(band == 1){
frequencia=2400500000UL;
vfo.setf(frequencia);
lcd.clear();
lcd.setCursor(0, 0); lcd.print("F :"); lcd.print(frequencia/1000);
lcd.setCursor(0, 1); lcd.print("TX QO100 "); };
if(band == 2){
frequencia=1969500000UL;
vfo.setf(frequencia);
lcd.clear();
lcd.setCursor(0, 0); lcd.print("F :"); lcd.print(frequencia/1000);
lcd.setCursor(0, 1); lcd.print("+430Mhz QO100 TX"); };
if(band == 3){
frequencia=2256000000UL;
vfo.setf(frequencia);
lcd.clear();
lcd.setCursor(0, 0); lcd.print("F :"); lcd.print(frequencia/1000);
lcd.setCursor(0, 1); lcd.print("+144Mhz QO100 TX"); };
if(band == 4){
frequencia=739550000UL;
vfo.setf(frequencia);
lcd.clear();
lcd.setCursor(0, 0); lcd.print("F :"); lcd.print(frequencia/1000);
lcd.setCursor(0, 1); lcd.print("LNB OUT 10.48955"); };
Serial.println(band) ;
}; // let's change band
};
}
// end band up
// mode
if (buttonState0 <= 100) {
{
if(opmode == 0)
{
opmode=1; tempopmode = 1;
Serial.print ("SWEEP MODE:"); Serial.print(opmode); Serial.print(","); Serial.println(tempopmode) ;
lcd.clear();
lcd.setCursor(0, 0); lcd.print("SWEEPING MODE ");
lcd.setCursor(0, 1); lcd.print("START/STOP----->");
delay(150);
}
else
{
opmode=0; tempopmode =0;
Serial.print ("BAND MODE:"); Serial.print(opmode); Serial.print(","); Serial.println(tempopmode) ;
lcd.clear();
lcd.setCursor(0, 0); lcd.print("F :"); lcd.print(frequencia/1000);
lcd.setCursor(0, 1); lcd.print("BAND MODE "); lcd.print(frequencia/1000);
};
}
} // end if (buttonState0 <= 100) {
// if we are sweeping
if (opmode==1 && tempopmode == 255){lcd.print(" .");};
if (opmode==1 && tempopmode == 255){lcd.print(" o");};
if (opmode==1 && tempopmode == 255){lcd.print(" O");};
if (opmode==1 && tempopmode == 255){
frequencia += vfo.ChanStep; // increase frquency by step
if (frequencia >= maxfrequencia){frequencia=minfrequencia;}; // if we are on the limit then go to lower value
vfo.setf(frequencia);
Serial.print ("F:"); Serial.println(frequencia) ;
};
// up frequency
// button pin is puled down to ground...or close to it (100) as long as lower than 2049
if (buttonState1 <= 100) {
frequencia += vfo.ChanStep;
if ( vfo.setf(frequencia) == 0 )
{
Serial.print ("VFO.SET: "); Serial.println(vfo.cfreq) ;
lcd.clear();
lcd.setCursor(0, 0); lcd.print("F :"); lcd.print(frequencia/1000);
if (band == 0 ){lcd.setCursor(0, 1); lcd.print("F(3):"); lcd.print((frequencia/1000)*3);};
}
}
// end up frequency
// down frequency
if (buttonState2 <= 100) {
frequencia -= vfo.ChanStep;
if ( vfo.setf(frequencia) == 0 )
{
Serial.print ("VFO.SET: "); Serial.println(vfo.cfreq) ;
lcd.clear();
lcd.setCursor(0, 0); lcd.print("F :"); lcd.print(frequencia/1000);
if (band == 0 ){lcd.setCursor(0, 1); lcd.print("F(3):"); lcd.print((frequencia/1000)*3);};
}
}
// end down frequency
// button software debounce if we are not sweeping
if (opmode == 0) { delay(150); };
} // end code