diff --git a/nanovna.h b/nanovna.h index 533d26d..f9d6112 100644 --- a/nanovna.h +++ b/nanovna.h @@ -474,7 +474,7 @@ void set_noise(int); void toggle_tracking_output(void); extern int32_t frequencyExtra; void set_modulation(int); -void set_modulation_frequency(int); +void set_modulation_frequency(float); int search_maximum(int m, freq_t center, int span); //extern int setting.modulation; void set_measurement(int); @@ -1270,7 +1270,6 @@ typedef struct setting uint16_t freq_mode; // 0...1!!! need convert to bool or bit field int16_t refer; // -1 disabled - uint16_t modulation_frequency; // 50...6000 #ifdef TINYSA4 uint16_t modulation_depth_x100; // AM (30% - 100%) multiplied by 100 uint16_t modulation_deviation_div100; // FM (2.5kHz to 100kHz) divided by 100 @@ -1285,6 +1284,7 @@ typedef struct setting uint32_t vbw_x100; uint32_t scan_after_dirty[TRACES_MAX]; + float modulation_frequency; // 50...6000 float reflevel; float scale; float external_gain; @@ -1465,7 +1465,7 @@ typedef struct properties { //sizeof(properties_t) == 0x1200 #define CONFIG_MAGIC 0x434f4e65 /* 'CONF' */ -#define SETTING_MAGIC 0x434f4e64 +#define SETTING_MAGIC 0x434f4e65 extern int16_t lastsaveid; //extern properties_t *active_props; diff --git a/sa_core.c b/sa_core.c index 21a3a25..0a2064d 100644 --- a/sa_core.c +++ b/sa_core.c @@ -1136,7 +1136,7 @@ void set_depth(int d) } #endif -void set_modulation_frequency(int f) +void set_modulation_frequency(float f) { if (f < 1) f = 1; @@ -3637,7 +3637,7 @@ pureRSSI_t perform(bool break_on_operation, int i, freq_t f, int tracking) / int sine_wave_index = 1; config.cor_am = INITIAL_MODULATION_CORRECTION; // Initialize with some spare modulation_steps = MAX_MODULATION_STEPS; // Search modulation steps that fit frequency - while ( (modulation_delay = (8000000/ modulation_steps ) / setting.modulation_frequency + config.cor_am) < 20 && modulation_steps > 4) { + while ( (modulation_delay = ((float)8000000/ modulation_steps ) / setting.modulation_frequency + config.cor_am) < 20 && modulation_steps > 4) { sine_wave_index <<= 1; modulation_steps >>= 1; } @@ -3661,7 +3661,7 @@ pureRSSI_t perform(bool break_on_operation, int i, freq_t f, int tracking) / config.cor_am = INITIAL_MODULATION_CORRECTION; // Initialize with some spare modulation_steps = MAX_MODULATION_STEPS; // Search modulation steps that fit frequency //modulation_steps = 8; // <-----------------TEMP!!!!! - while ( ((modulation_delay = (8000000/ modulation_steps ) / setting.modulation_frequency + config.cor_am)) < 900 && modulation_steps >= 4) { + while ( ((modulation_delay = ((float)8000000/ modulation_steps ) / setting.modulation_frequency + config.cor_am)) < 900 && modulation_steps >= 4) { sine_wave_index <<= 1; modulation_steps >>= 1; } @@ -3897,7 +3897,7 @@ pureRSSI_t perform(bool break_on_operation, int i, freq_t f, int tracking) / if (setting.modulation != MO_NONE && setting.modulation != MO_EXTERNAL && setting.modulation_frequency != 0) { modulation_counter = 0; cycle_counter = 0; - modulation_delay = (8000000/ modulation_steps ) / setting.modulation_frequency; // 8 steps so 8MHz/8 + modulation_delay = ((float)8000000/ modulation_steps ) / setting.modulation_frequency; // 8 steps so 8MHz/8 modulation_delay += config.cor_am; #ifdef TINYSA3 if (setting.modulation == MO_WFM) @@ -3952,10 +3952,11 @@ modulation_again: modulation_counter = 0; cycle_counter++; if (config.cor_am == INITIAL_MODULATION_CORRECTION) { - if (chVTGetSystemTimeX() - start_of_sweep_timestamp > 1000) { // 100 ms, System tick 10000 per second + int cycle_time = chVTGetSystemTimeX() - start_of_sweep_timestamp; + if (cycle_time > 1000) { // 100 ms, System tick 10000 per second start_of_sweep_timestamp = chVTGetSystemTimeX(); modulation_delay -= config.cor_am; - int actual_delay = 800000 / cycle_counter / modulation_steps; // In units of 1/8 microsecond + int actual_delay = 800 * cycle_time / cycle_counter / modulation_steps; // In units of 1/8 microsecond config.cor_am += modulation_delay - actual_delay; if (config.cor_am >0) config.cor_am = 0; diff --git a/ui.c b/ui.c index 30beeb2..6d9cd22 100644 --- a/ui.c +++ b/ui.c @@ -1433,7 +1433,7 @@ static const struct { [KM_FASTER_SPEEDUP] = {keypads_positive , "WIDE\nSPEEDUP"}, // KM_FAST_SPEEDUP [KM_GRIDLINES] = {keypads_positive , "MINIMUM\nGRIDLINES"}, // KM_GRIDLINES [KM_MARKER] = {keypads_freq , "MARKER\nFREQ"}, // KM_MARKER -[KM_MODULATION] = {keypads_freq , "MODULATION\nFREQ"}, // KM_MODULATION +[KM_MODULATION] = {keypads_positive , "MODULATION\nFREQ"}, // KM_MODULATION [KM_HIGHOUTLEVEL] = {keypads_plusmin , "OUTPUT\nLEVEL"}, // KM_HIGHOUTLEVEL #25 #ifdef TINYSA4 [KM_COR_AM] = {keypads_plusmin , "COR\nAM"}, // KM_COR_AM @@ -2412,9 +2412,9 @@ static UI_FUNCTION_ADV_CALLBACK(menu_smodulation_acb){ else { #ifdef TINYSA4 if (setting.modulation == MO_AM) - plot_printf(b->text, sizeof b->text, "MOD: %4dHz AM %d%%", (int)(setting.modulation_frequency), setting.modulation_depth_x100); + plot_printf(b->text, sizeof b->text, "MOD: %8.4FHz AM %d%%", setting.modulation_frequency, setting.modulation_depth_x100); else - plot_printf(b->text, sizeof b->text, "MOD: %4dHz FM %4QHz", (int)(setting.modulation_frequency), (freq_t)(setting.modulation_deviation_div100*100)); + plot_printf(b->text, sizeof b->text, "MOD: %8.4FHz FM %4QHz", setting.modulation_frequency, (freq_t)(setting.modulation_deviation_div100*100)); #else plot_printf(b->text, sizeof b->text, "MOD: %4dHz %s", (int)(setting.modulation_frequency), menu_modulation_text[setting.modulation]); #endif @@ -5497,7 +5497,7 @@ static void fetch_numeric_target(uint8_t mode) case KM_MODULATION: if (active_marker >=0) { uistat.value = setting.modulation_frequency; - plot_printf(uistat.text, sizeof uistat.text, "%7.0fHz", uistat.value); + plot_printf(uistat.text, sizeof uistat.text, "%8.4FHz", uistat.value); } break; #ifdef TINYSA4 @@ -5766,7 +5766,7 @@ set_numeric_value(void) set_marker_time(active_marker, uistat.value); break; case KM_MODULATION: - set_modulation_frequency((int)uistat.value); + set_modulation_frequency(uistat.value); break; #ifdef TINYSA4 case KM_COR_AM: