272 wiersze
8.4 KiB
C++
272 wiersze
8.4 KiB
C++
/*------------------------------------------------------------------
|
|
|
|
VFO System for ESP32-DevKitC Ver 1.00
|
|
|
|
by T.Uebo / JF3HZB
|
|
|
|
Feb. 10, 2019
|
|
|
|
--------------------------------------------------------------------*/
|
|
|
|
/*------Hard ware Configuration ---------------------
|
|
<<ESP32-DevKitC>>
|
|
pin No. Connection
|
|
17 : Rotary Encoder A
|
|
16 : Rotary Encoder B
|
|
|
|
22 : si5351A SCL
|
|
21 : si5351A SDA
|
|
|
|
18 : SCK / ST7735,SEPS525(128x160 display)
|
|
23 : MOSI / ST7735,SEPS525(128x160 display)
|
|
5 : CS / ST7735,SEPS525(128x160 display)
|
|
2 : DC(A0) / ST7735,SEPS525(128x160 display)
|
|
15 : RESET / ST7735,SEPS525(128x160 display)
|
|
|
|
|
|
<<si5351A>>
|
|
CLK0 : Car Signal (I)
|
|
CLK1 : Car Signal (Q)
|
|
CLK2 : Lo Signal
|
|
------------------------------------------------*/
|
|
|
|
/*-------------------------------------------------------
|
|
Frequency settings
|
|
--------------------------------------------------------*/
|
|
#define init_freq 7100000 // Initial Frequncy[Hz]
|
|
int32_t offset_frq = 8998500; // Offset Frequency[Hz]
|
|
int32_t car_frq = 8998500; // Carrier Frequncy[Hz]
|
|
unsigned char f_carON = 1; // ON/OFF Car signal
|
|
|
|
#define fmax 150000000 // Max frequency[Hz]
|
|
#define fmin 100000 // Min frequency[Hz]
|
|
#define freq_step 10 // Min step[Hz]
|
|
|
|
/*----------------------------------------------------------
|
|
Adaptive step control parameters
|
|
-----------------------------------------------------------*/
|
|
uint32_t vth=2; // Velocity threshold for acceleration
|
|
float Racc=0.002; // Rate of acceleration
|
|
float Rdec=1.0; // Rate of deceleration
|
|
float MaxL=1500.0; // Max Step[Hz] = freq_step + Racc*MaxL*MaxL
|
|
|
|
|
|
/*----------------------------------------------------------------------------------
|
|
Control flags
|
|
-----------------------------------------------------------------------------------*/
|
|
uint8_t f_fchange; // if frequency changed, set this flag to 1
|
|
uint8_t f_cchange; // if Car frequency and/or "f_carON" changed, set this flag to 1
|
|
uint8_t f_dchange; // if need to renew display, set this flag to 1
|
|
|
|
|
|
|
|
/*--------------------------------------------------------
|
|
pin assign
|
|
----------------------------------------------------------*/
|
|
//#define LED_BUILTIN 13
|
|
|
|
#define PULSE_INPUT_PIN 16 // Rotaty Encoder A
|
|
#define PULSE_CTRL_PIN 17 // Rotaty Encoder B
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
#define NAME "VFO System"
|
|
#define VERSION "Ver. 1.00"
|
|
#define ID "by JF3HZB"
|
|
|
|
|
|
#include "driver/pcnt.h"
|
|
#include "display.h"
|
|
#include "graph.h"
|
|
#include "dial.h"
|
|
#include "si5351.h"
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
* Global
|
|
-----------------------------------------------------------------------------*/
|
|
float L=0.0;
|
|
long afstp;
|
|
long frq=init_freq;
|
|
int16_t RE_Count = 0;
|
|
uint8_t f_redraw;
|
|
extern char f_rev;
|
|
extern uint32_t cl_BG;
|
|
|
|
/*--------------------------------------------------------------------------
|
|
Timer ISR
|
|
---------------------------------------------------------------------------*/
|
|
hw_timer_t * timer = NULL;
|
|
void IRAM_ATTR onTimer(){}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------
|
|
void setup() {
|
|
//-----------------------------------------------------------------------------------------------
|
|
char str[64];
|
|
//--------- create tasks on core0 --------------------------------
|
|
xTaskCreatePinnedToCore(task0, "Task0", 4096, NULL, 1, NULL, 0);
|
|
|
|
//--------- Set up Interrupt Timer -------------------------------
|
|
timer = timerBegin(0, 80, true); //use Timer0, div80 for 1us clock
|
|
timerAttachInterrupt(timer, &onTimer, true);
|
|
timerAlarmWrite(timer, 10000, true); // T=10000us
|
|
timerAlarmEnable(timer); // Start Timer
|
|
|
|
//pinMode(LED_BUILTIN, OUTPUT); //LED
|
|
|
|
//--- Counter setup for Rotary Encoder ---------------------
|
|
pcnt_config_t pcnt_config_A;// structure for A
|
|
pcnt_config_t pcnt_config_B;// structure for B
|
|
//
|
|
pcnt_config_A.pulse_gpio_num = PULSE_INPUT_PIN;
|
|
pcnt_config_A.ctrl_gpio_num = PULSE_CTRL_PIN;
|
|
pcnt_config_A.lctrl_mode = PCNT_MODE_REVERSE;
|
|
pcnt_config_A.hctrl_mode = PCNT_MODE_KEEP;
|
|
pcnt_config_A.channel = PCNT_CHANNEL_0;
|
|
pcnt_config_A.unit = PCNT_UNIT_0;
|
|
pcnt_config_A.pos_mode = PCNT_COUNT_INC;
|
|
pcnt_config_A.neg_mode = PCNT_COUNT_DEC;
|
|
pcnt_config_A.counter_h_lim = 10000;
|
|
pcnt_config_A.counter_l_lim = -10000;
|
|
//
|
|
pcnt_config_B.pulse_gpio_num = PULSE_CTRL_PIN;
|
|
pcnt_config_B.ctrl_gpio_num = PULSE_INPUT_PIN;
|
|
pcnt_config_B.lctrl_mode = PCNT_MODE_KEEP;
|
|
pcnt_config_B.hctrl_mode = PCNT_MODE_REVERSE;
|
|
pcnt_config_B.channel = PCNT_CHANNEL_1;
|
|
pcnt_config_B.unit = PCNT_UNIT_0;
|
|
pcnt_config_B.pos_mode = PCNT_COUNT_INC;
|
|
pcnt_config_B.neg_mode = PCNT_COUNT_DEC;
|
|
pcnt_config_B.counter_h_lim = 10000;
|
|
pcnt_config_B.counter_l_lim = -10000;
|
|
//
|
|
pcnt_unit_config(&pcnt_config_A);//Initialize A
|
|
pcnt_unit_config(&pcnt_config_B);//Initialize B
|
|
pcnt_counter_pause(PCNT_UNIT_0);
|
|
pcnt_counter_clear(PCNT_UNIT_0);
|
|
pcnt_counter_resume(PCNT_UNIT_0); //Start
|
|
|
|
|
|
display_init();
|
|
GRAM_clr();
|
|
sprintf(str, NAME ); disp_str16(str,20, 90, 0x00ffff);
|
|
sprintf(str, VERSION); disp_str12(str,36, 50, 0x00ffff);
|
|
sprintf(str, ID ); disp_str8(str,50, 20, 0x00ffff);
|
|
trans65k();
|
|
f_redraw=1;
|
|
|
|
|
|
delay(1000);
|
|
init_Dial();
|
|
GRAM_clr();
|
|
|
|
si5351_init();
|
|
|
|
f_fchange = 1;
|
|
f_cchange = 1;
|
|
f_dchange = 1;
|
|
f_redraw=0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------
|
|
void loop() { // (core1)
|
|
//-----------------------------------------------------------------------------------------------
|
|
char str[64];
|
|
|
|
if(f_dchange==1){
|
|
f_dchange=0;
|
|
//GRAM_clr();
|
|
boxfill(0,0,Nx-1,Ny-1,cl_BG);
|
|
//Display Dial
|
|
Dial(frq);
|
|
|
|
box(7,100,153,126, 0xa0a0a0);
|
|
box(6,99,154,127, 0xa0a0a0);
|
|
|
|
//-------- Display Digital Frquency ---------------------------------------
|
|
sprintf(str, "%3d.%03d,%02d", frq/1000000, (frq/1000)%1000, (frq/10)%100 );
|
|
disp_str16(str,17, 105, 0xffd080);
|
|
sprintf(str, "MHz" );
|
|
disp_str12(str,120, 106, 0xffd080);
|
|
|
|
if(f_redraw==0){
|
|
trans65k();
|
|
f_redraw=1;
|
|
}
|
|
}
|
|
|
|
|
|
//digitalWrite(LED_BUILTIN, 1^digitalRead(LED_BUILTIN) ); // Toggle LED
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------------------------------
|
|
Alternative Loop (core0)
|
|
------------------------------------------------------------------------------------------------*/
|
|
void task0(void* arg)
|
|
{
|
|
while (1)
|
|
{
|
|
pcnt_get_counter_value(PCNT_UNIT_0, &RE_Count);
|
|
int count=RE_Count;
|
|
pcnt_counter_clear(PCNT_UNIT_0);
|
|
|
|
if(f_rev==1) count=-count;
|
|
|
|
|
|
if(count!=0){
|
|
afstp=(long)(0.5 + (float)(count)*((float)freq_step + Racc*L*L) );
|
|
if(abs(count)>=vth) L+=1.0*(float)( abs(count) - vth );
|
|
if(L>MaxL) L=MaxL;
|
|
}else{
|
|
L-=Rdec;
|
|
if(L<0) L=0;
|
|
}
|
|
|
|
//---Update frequency -------------------------------
|
|
if(afstp!=0){
|
|
frq+=afstp;
|
|
if(frq>fmax) frq=fmax;
|
|
if(frq<fmin) frq=fmin;
|
|
afstp=0;
|
|
f_dchange=1;
|
|
f_fchange=1;
|
|
}
|
|
|
|
//-------------------------------------
|
|
if(f_fchange==1){
|
|
f_fchange=0;
|
|
// Output Lo freq
|
|
set_freq( frq + offset_frq );
|
|
}
|
|
|
|
//-------------------------------------
|
|
if(f_cchange==1){
|
|
f_cchange=0;
|
|
// Output Car freq
|
|
set_car_freq(car_frq, f_carON, 0);
|
|
}
|
|
|
|
if(f_redraw==1){
|
|
Transfer_Image();
|
|
f_redraw=0;
|
|
}
|
|
|
|
delay(1);
|
|
}
|
|
}
|