From 8584158b58eaf0466562aa7540bb5e86875dede8 Mon Sep 17 00:00:00 2001 From: erikkaashoek Date: Sun, 14 Jun 2020 13:14:11 +0200 Subject: [PATCH] Fast sweep added --- nanovna.h | 10 ++++++++++ sa_core.c | 5 +++++ si4432.c | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/nanovna.h b/nanovna.h index d0bbed3..813e4e4 100644 --- a/nanovna.h +++ b/nanovna.h @@ -29,6 +29,8 @@ #define __MEASURE__ #define __SELFTEST__ #define __CALIBRATE__ +#define __FAST_SWEEP__ // Pre-fill SI4432 RSSI buffer to get fastest sweep in zero span mode + //#define __ULTRA__ // Add harmonics mode on low input. //#define __ULTRA_SA__ // Adds ADF4351 control for extra high 1st IF stage #define __SPUR__ // Does spur reduction by shifting IF @@ -602,7 +604,12 @@ void reset_settings(int m); #define S_IS_AUTO(x) ((x)&2) #define S_STATE(X) ((X)&1) enum { S_OFF=0, S_ON=1, S_AUTO_OFF=2, S_AUTO_ON=3 }; + +#ifdef __FAST_SWEEP__ +#define MINIMUM_SWEEP_TIME 3 // Minimum sweep time on zero span in miliseconds +#else #define MINIMUM_SWEEP_TIME 15 // Minimum sweep time on zero span in miliseconds +#endif #define REPEAT_TIME 134.0 // Time per extra repeat in uS #define MEASURE_TIME 175.0 // Time per vbwstep without stepdelay in uS @@ -807,6 +814,9 @@ byte SI4432_Read_Byte( byte ADR ); void SI4432_Init(void); void SI4432_Drive(int); float SI4432_RSSI(uint32_t i, int s); +#ifdef __FAST_SWEEP__ +void SI4432_Fill(int s); +#endif void SI4432_Set_Frequency ( long Freq ); float SI4432_SET_RBW(float WISH); void SI4432_SetReference(int freq); diff --git a/sa_core.c b/sa_core.c index f58652c..20f0342 100644 --- a/sa_core.c +++ b/sa_core.c @@ -1291,6 +1291,11 @@ float perform(bool break_on_operation, int i, uint32_t f, int tracking) float signal_path_loss; skip_LO_setting: +#ifdef __FAST_SWEEP__ + if (i == 0 && setting.frequency_step == 0 && setting.trigger == T_AUTO && actualStepDelay == 0 && setting.repeat == 1 && actualStepDelay < 1000) { + SI4432_Fill(MODE_SELECT(setting.mode)); + } +#endif #ifdef __ULTRA__ if (setting.mode == M_ULTRA) diff --git a/si4432.c b/si4432.c index ad97347..18a0e14 100644 --- a/si4432.c +++ b/si4432.c @@ -315,6 +315,33 @@ void SI4432_Set_Frequency ( long Freq ) { int actualStepDelay = 1500; //extern int setting.repeat; +#ifdef __FAST_SWEEP__ +extern char age[POINTS_COUNT]; +static int buf_index = 0; +static bool buf_read = false; + +void SI4432_Fill(int s) +{ + SI4432_Sel = s; + int sel = SI_nSEL[SI4432_Sel]; + float t = setting.sweep_time - calc_min_sweep_time(); // Time to delay in mS + if (t < 0) + t = 0; + int ti = t * 1000 / 290.0; // Now in uS per point if (t < 30000) + for (int i=0; i