From 5904e600ee3974044ac0b73063dc3c1e9138df5f Mon Sep 17 00:00:00 2001 From: erikkaashoek Date: Fri, 25 Sep 2020 09:10:29 +0200 Subject: [PATCH] User settable modulation frequency --- nanovna.h | 4 +++- sa_cmd.c | 2 +- sa_core.c | 22 +++++++++++++++++++--- ui_sa.c | 21 +++++++++++++++------ 4 files changed, 38 insertions(+), 11 deletions(-) diff --git a/nanovna.h b/nanovna.h index f2f4013..8c96ac8 100644 --- a/nanovna.h +++ b/nanovna.h @@ -146,7 +146,7 @@ enum { }; enum { - MO_NONE, MO_AM_1kHz, MO_AM_10Hz, MO_NFM, MO_WFM, MO_EXTERNAL, + MO_NONE, MO_AM, MO_NFM, MO_WFM, MO_EXTERNAL, }; #define MODE_OUTPUT(x) ((x) == M_GENLOW || (x) == M_GENHIGH ) @@ -234,6 +234,7 @@ void toggle_tracking_output(void); extern int32_t frequencyExtra; void set_10mhz(uint32_t); void set_modulation(int); +void set_modulation_frequency(int); //extern int setting.modulation; void set_measurement(int); // extern int settingSpeed; @@ -687,6 +688,7 @@ typedef struct setting int step_delay_mode; int offset_delay; int fast_speedup; + int modulation_frequency; uint32_t checksum; }setting_t; diff --git a/sa_cmd.c b/sa_cmd.c index d26ad12..584faac 100644 --- a/sa_cmd.c +++ b/sa_cmd.c @@ -64,7 +64,7 @@ VNA_SHELL_FUNCTION(cmd_modulation ) shell_printf("usage: modulation %s\r\n", cmd_mod); return; } - static const int cmd_mod_val[] = { MO_NONE, MO_AM_1kHz, MO_AM_10Hz, MO_NFM, MO_WFM, MO_EXTERNAL}; + static const int cmd_mod_val[] = { MO_NONE, MO_AM, MO_NFM, MO_WFM, MO_EXTERNAL}; int m = get_str_index(argv[1], cmd_mod); if (m<0) goto usage; diff --git a/sa_core.c b/sa_core.c index dfe204a..0555094 100644 --- a/sa_core.c +++ b/sa_core.c @@ -119,6 +119,7 @@ void reset_settings(int m) setting.lna = S_AUTO_OFF; setting.tracking = false; setting.modulation = MO_NONE; + setting.modulation_frequency = 1000; setting.step_delay = 0; setting.offset_delay = 0; setting.step_delay_mode = SD_NORMAL; @@ -348,6 +349,14 @@ void set_modulation(int m) dirty = true; } +void set_modulation_frequency(int f) +{ + if (20 <= f && f <= 20000) { + setting.modulation_frequency = f; + dirty = true; + } +} + void set_repeat(int r) { if (r > 0 && r <= 100) { @@ -1486,6 +1495,7 @@ static systime_t sweep_elapsed = 0; // Time since fi pureRSSI_t perform(bool break_on_operation, int i, uint32_t f, int tracking) // Measure the RSSI for one frequency, used from sweep and other measurement routines. Must do all HW setup { + int modulation_delay = 0; if (i == 0 && dirty ) { // if first point in scan and dirty calculate_correction(); // pre-calculate correction factor dividers to avoid float division apply_settings(); // Initialize HW @@ -1525,6 +1535,9 @@ pureRSSI_t perform(bool break_on_operation, int i, uint32_t f, int tracking) + get_attenuation() - setting.offset); } + if (setting.modulation != MO_NONE && setting.modulation != MO_EXTERNAL && setting.modulation_frequency != 0) { + modulation_delay = 1000 * 200 / setting.modulation_frequency - 20; + } // if (MODE_OUTPUT(setting.mode) && setting.additional_step_delay_us < 500) // Minimum wait time to prevent LO from lockup during output frequency sweep // setting.additional_step_delay_us = 500; @@ -1591,7 +1604,7 @@ pureRSSI_t perform(bool break_on_operation, int i, uint32_t f, int tracking) modulation_again: // ----------------------------------------------------- modulation for output modes --------------------------------------- if (MODE_OUTPUT(setting.mode)){ - if (setting.modulation == MO_AM_1kHz || setting.modulation == MO_AM_10Hz) { // AM modulation + if (setting.modulation == MO_AM) { // AM modulation int p = setting.attenuate * 2 + am_modulation[modulation_counter++]; if (p>63) p = 63; else if (p< 0) p = 0; @@ -1600,7 +1613,7 @@ modulation_again: #endif if (modulation_counter == 5) // 3dB modulation depth modulation_counter = 0; - my_microsecond_delay(setting.modulation == MO_AM_10Hz ? 20000 : 180); +// my_microsecond_delay(setting.modulation == MO_AM_10Hz ? 20000 : 180); } else if (setting.modulation == MO_NFM || setting.modulation == MO_WFM ) { //FM modulation #ifdef __SI4432__ @@ -1612,9 +1625,12 @@ modulation_again: modulation_counter++; if (modulation_counter == 5) // 3dB modulation depth modulation_counter = 0; - my_microsecond_delay(200); +// my_microsecond_delay(200); // chThdSleepMicroseconds(200); } + if (setting.modulation != MO_NONE && setting.modulation != MO_EXTERNAL) { + my_microsecond_delay(modulation_delay); + } } // Calculate the RSSI correction for later use diff --git a/ui_sa.c b/ui_sa.c index 382d9af..4c23d1f 100644 --- a/ui_sa.c +++ b/ui_sa.c @@ -407,7 +407,7 @@ enum { KM_START, KM_STOP, KM_CENTER, KM_SPAN, KM_CW, KM_REFLEVEL, KM_SCALE, KM_ATTENUATION, KM_ACTUALPOWER, KM_IF, KM_SAMPLETIME, KM_DRIVE, KM_LOWOUTLEVEL, KM_DECAY, KM_NOISE, KM_10MHZ, KM_REPEAT, KM_OFFSET, KM_TRIGGER, KM_LEVELSWEEP, KM_SWEEP_TIME, KM_OFFSET_DELAY, - KM_FAST_SPEEDUP, KM_GRIDLINES, KM_MARKER, + KM_FAST_SPEEDUP, KM_GRIDLINES, KM_MARKER, KM_MODULATION, KM_NONE // always at enum end }; @@ -440,6 +440,7 @@ static const struct { {keypads_positive , "FAST\nSPEEDUP"}, // KM_FAST_SPEEDUP {keypads_positive , "MINIMUM\nGRIDLINES"}, // KM_GRIDLINES {keypads_freq , "MARKER\nFREQ"}, // KM_MARKER + {keypads_freq , "MODULATION\nFREQ"}, // KM_MODULATION }; // ===[MENU CALLBACKS]========================================================= @@ -622,8 +623,8 @@ static UI_FUNCTION_CALLBACK(menu_dfu_cb) } -// const int menu_modulation_value[]={MO_NONE,MO_AM_1, MO_NFM, MO_WFM, MO_EXTERNAL}; -const char *menu_modulation_text[]={"None", "AM 1kHz", "AM 10Hz", "Narrow FM", "Wide FM", "External"}; +// const int menu_modulation_value[]={MO_NONE,MO_AM, MO_NFM, MO_WFM, MO_EXTERNAL}; +const char *menu_modulation_text[]={"None", "AM", "Narrow FM", "Wide FM", "External"}; static UI_FUNCTION_ADV_CALLBACK(menu_modulation_acb) { @@ -1350,11 +1351,11 @@ static const menuitem_t menu_drive_wide[] = { static const menuitem_t menu_modulation[] = { { MT_FORM | MT_TITLE, 0, "MODULATION",NULL}, { MT_FORM | MT_ADV_CALLBACK, MO_NONE, "None", menu_modulation_acb}, - { MT_FORM | MT_ADV_CALLBACK | MT_LOW, MO_AM_1kHz, "AM 1kHz", menu_modulation_acb}, - { MT_FORM | MT_ADV_CALLBACK | MT_LOW, MO_AM_10Hz, "AM 10Hz", menu_modulation_acb}, + { MT_FORM | MT_ADV_CALLBACK | MT_LOW, MO_AM, "AM", menu_modulation_acb}, { MT_FORM | MT_ADV_CALLBACK, MO_NFM, "Narrow FM", menu_modulation_acb}, { MT_FORM | MT_ADV_CALLBACK, MO_WFM, "Wide FM", menu_modulation_acb}, { MT_FORM | MT_ADV_CALLBACK | MT_LOW, MO_EXTERNAL, "External", menu_modulation_acb}, + { MT_FORM | MT_KEYPAD, KM_MODULATION, "FREQ: %s", "10Hz..10kHz"}, { MT_FORM | MT_CANCEL, 0, S_LARROW" BACK",NULL }, { MT_FORM | MT_NONE, 0, NULL, NULL } // sentinel }; @@ -1937,7 +1938,12 @@ static void fetch_numeric_target(void) plot_printf(uistat.text, sizeof uistat.text, "%3.3fMHz", uistat.value / 1000000.0); } break; - + case KM_MODULATION: + if (active_marker >=0) { + uistat.value = setting.modulation_frequency; + plot_printf(uistat.text, sizeof uistat.text, "%7.0fHz", uistat.value); + } + break; } { @@ -2041,6 +2047,9 @@ set_numeric_value(void) case KM_MARKER: set_marker_frequency(active_marker, (uint32_t)uistat.value); break; + case KM_MODULATION: + set_modulation_frequency((int)uistat.value); + break; } }