回路図
回路図は、AFPSN VFO回路の不要な所を除いたのみである。スケッチ
ライブラリは、バージョンが異なると正しく動作しない場合がある為、スケッチと同じフォルダにsrcフォルダを作って、si5351.hとLiquidCrystal_I2C.hが入れてある。必要なファイルはsi5351 VFOフォルダのcb_vfo.zip。//////////////////////////////////////////////////////////////////////
// si5351a CB VFO program ver.1.0
// Copyright(C)2019.JA2GQP.All rights reserved.
//
// 2019/2/26
// JA2GQP
//////////////////////////////////////////////////////////////////////
#include "src/si5351.h" // Ver2,1,0
#include "src/LiquidCrystal_I2C.h" // 1.1.2
#include <EEPROM.h>
//---------- Set I/O Device ---------------------
LiquidCrystal_I2C lcd(0x27,16,2); // address 0x27, display 16x2
Si5351 si5351;
//---------- Define Constant Value ----------
#define SW_CH 5 // CH SW
#define SW_TX 9 // TX SW
////////////////////////////////
// Channel Frequency
////////////////////////////////
#define CH1_FRQ 26968000L // Channel 1 Frequency
#define CH2_FRQ 26976000L // 2
#define CH3_FRQ 27040000L // 3
#define CH4_FRQ 27080000L // 4
#define CH5_FRQ 27088000L // 5
#define CH6_FRQ 27112000L // 6
#define CH7_FRQ 27120000L // 7
#define CH8_FRQ 27144000L // 8
#define CH9_FRQ 27005000L // 9
#define CH10_FRQ 27524000L // 10
////////////////////////////////
// etc
////////////////////////////////
#define CH1 1 // Channel 1
#define CH2 2 // Channel 2
#define CH3 3 // Channel 3
#define CH4 4 // Channel 4
#define CH5 5 // Channel 5
#define CH6 6 // Channel 6
#define CH7 7 // Channel 7
#define CH8 8 // Channel 8
#define CH9 9 // Channel 9
#define CH10 10 // Channel 10
#define Max_Chn 10 // Max Channel(10ch)
#define Int_End 73 // Initial end code
#define CALL "JA2GQP" // Display Call sign
#define IF_FRQ 455000L // IF Frequency 455kHz
//---------- EEPROM Memory Address -----------------------
#define Eep_Int 0x00 // Eep Init(1byte*1)
#define Eep_Chn 0x01 // Channel(1byte*1)
//---------- Memory Assign -------------------
unsigned long Vfo_Dat = 0; // VFO Data
unsigned long Vfo_Datb = 0; // old
unsigned long If_Dat;
unsigned long Frq_Dat; // Frequency Data
byte Byt_Chn = CH1; // Channel SW
byte Flg_Tx = 0; // TX Flag
//---------- Initialization Program ---------------
void setup(){
si5351.init(SI5351_CRYSTAL_LOAD_8PF,0,0);//crystal 25.000 MHz, correction 0
si5351.drive_strength(SI5351_CLK0,SI5351_DRIVE_4MA);//Drive lebel 4mA set
lcd.begin();
lcd.backlight();
lcd.clear();
pinMode(SW_TX,INPUT_PULLUP);
pinMode(SW_CH,INPUT_PULLUP);
if(EEPROM.read(Eep_Int) != Int_End){ // Eep initialaz
delay(10);
Fnc_Eep_Int();
}
Byt_Chn = EEPROM.read(Eep_Chn); // Channel
Channel_Set();
LCD_Line1();
}
//---------- Main program ---------------
void loop() {
if(digitalRead(SW_TX) == HIGH){ // TX off?
if((digitalRead(SW_CH) == LOW)){ // CH SW On?
Fnc_Chsw();
Channel_Set();
}
Flg_Tx = 0;
If_Dat = IF_FRQ;
si5351.output_enable(SI5351_CLK0,1); // PLL Out enable
}
else{ // TX on
if(Byt_Chn <= CH8){ // CH1-CH8?
Flg_Tx = 1; // Yes,TX Flag set
If_Dat = 0; // If_Dat 0 set
si5351.output_enable(SI5351_CLK0,1);// PLL Out enable
}
else{ // CH9-CH10
Flg_Tx = 0; // TX Flag reset
If_Dat = IF_FRQ; // If_Dat set
si5351.output_enable(SI5351_CLK0,0);// PLL Out disable
}
}
Vfo_Dat = Frq_Dat + If_Dat;
if(Vfo_Dat != Vfo_Datb){ // Frequency update?
si5351.set_freq(Vfo_Dat * SI5351_FREQ_MULT,SI5351_CLK0);
Vfo_Datb = Vfo_Dat;
}
LCD_Line1();
}
//---------- Channel Data Set & LCD Line0 Display ---------
void Channel_Set(){
lcd.setCursor(0,0);
lcd.print("CH");
switch(Byt_Chn){
case CH1:
Frq_Dat = CH1_FRQ;
lcd.print("01 26.968");
break;
case CH2:
Frq_Dat = CH2_FRQ;
lcd.print("02 26.976");
break;
case CH3:
Frq_Dat = CH3_FRQ;
lcd.print("03 27.040");
break;
case CH4:
Frq_Dat = CH4_FRQ;
lcd.print("04 27.080");
break;
case CH5:
Frq_Dat = CH5_FRQ;
lcd.print("05 27.088");
break;
case CH6:
Frq_Dat = CH6_FRQ;
lcd.print("06 27.112");
break;
case CH7:
Frq_Dat = CH7_FRQ;
lcd.print("07 27.120");
break;
case CH8:
Frq_Dat = CH8_FRQ;
lcd.print("08 27.144");
break;
case CH9:
Frq_Dat = CH9_FRQ;
lcd.print("09 27.005");
break;
case CH10:
Frq_Dat = CH10_FRQ;
lcd.print("10 27.524");
break;
default:
break;
}
EEPROM.write(Eep_Chn,Byt_Chn);
lcd.setCursor(13,0);
lcd.print("MHz");
}
//---------- LCD Line1 Display ---------
void LCD_Line1(){
lcd.setCursor(0,1);
if(Flg_Tx == 1)
lcd.print("TX");
else
lcd.print("RX");
lcd.setCursor(10,1);
lcd.print(CALL);
}
//---------- Function CH SW Check ---------
void Fnc_Chsw(){
Byt_Chn++;
while(digitalRead(SW_CH) == LOW)
;
if(Byt_Chn > Max_Chn)
Byt_Chn = CH1;
}
//---------- Function Eeprom Initialization -----------------
void Fnc_Eep_Int(){
EEPROM.write(Eep_Int,Int_End); // Init end set(73)
EEPROM.write(Eep_Chn,CH1); // Init end set(73)
}