Updated modulation frequency calibration

pull/34/head
erikkaashoek 3 years ago
parent d5a85825e5
commit 836186f997

@ -3144,6 +3144,7 @@ int avoid_spur(freq_t f) // find if this frequency should be a
} }
static int modulation_counter = 0; static int modulation_counter = 0;
static int cycle_counter = 0;
#define AM_MODULATION_STEPS 8 #define AM_MODULATION_STEPS 8
// AM modulation always // AM modulation always
@ -3373,8 +3374,9 @@ pureRSSI_t perform(bool break_on_operation, int i, freq_t f, int tracking) /
#ifdef TINYSA4 // Calculate FM modulation #ifdef TINYSA4 // Calculate FM modulation
if (setting.modulation == MO_AM) { if (setting.modulation == MO_AM) {
int sinus_index = 1; int sinus_index = 1;
config.cor_am = -18; // Initialize with some spare
modulation_steps = MAX_MODULATION_STEPS; // Search modulation steps that fit frequency modulation_steps = MAX_MODULATION_STEPS; // Search modulation steps that fit frequency
while ( (modulation_delay = (1000000/ modulation_steps ) / setting.modulation_frequency + config.cor_am) < 10 && modulation_steps > 4) { while ( (modulation_delay = (1000000/ modulation_steps ) / setting.modulation_frequency + config.cor_am) < 20 && modulation_steps > 4) {
sinus_index <<= 1; sinus_index <<= 1;
modulation_steps >>= 1; modulation_steps >>= 1;
} }
@ -3393,8 +3395,10 @@ pureRSSI_t perform(bool break_on_operation, int i, freq_t f, int tracking) /
} }
if (setting.modulation == MO_WFM) { if (setting.modulation == MO_WFM) {
int sinus_index = 1; int sinus_index = 1;
config.cor_am = -18; // Initialize with some spare
modulation_steps = MAX_MODULATION_STEPS; // Search modulation steps that fit frequency modulation_steps = MAX_MODULATION_STEPS; // Search modulation steps that fit frequency
while ( (modulation_delay = (1000000/ modulation_steps ) / setting.modulation_frequency + config.cor_wfm) < 10 && modulation_steps > 4) { //modulation_steps = 8; // <-----------------TEMP!!!!!
while ( (modulation_delay = (1000000/ modulation_steps ) / setting.modulation_frequency + config.cor_am) < 20 && modulation_steps > 4) {
sinus_index <<= 1; sinus_index <<= 1;
modulation_steps >>= 1; modulation_steps >>= 1;
} }
@ -3625,6 +3629,7 @@ pureRSSI_t perform(bool break_on_operation, int i, freq_t f, int tracking) /
#define MO_FREQ_COR 0 #define MO_FREQ_COR 0
#endif #endif
modulation_counter = 0; modulation_counter = 0;
cycle_counter = 0;
// if (in_selftest) { // if (in_selftest) {
// modulation_steps = 8; // modulation_steps = 8;
// modulation_delay = 0; // modulation_delay = 0;
@ -3635,7 +3640,7 @@ pureRSSI_t perform(bool break_on_operation, int i, freq_t f, int tracking) /
#ifdef TINYSA4 #ifdef TINYSA4
// modulation_steps = 8; // modulation_steps = 8;
#endif #endif
} else { } else { // Must be FM
modulation_delay = (1000000/ modulation_steps ) / setting.modulation_frequency; // 8 steps so 1MHz/8 modulation_delay = (1000000/ modulation_steps ) / setting.modulation_frequency; // 8 steps so 1MHz/8
#ifdef TINYSA4 #ifdef TINYSA4
switch(setting.modulation){ switch(setting.modulation){
@ -3649,14 +3654,14 @@ pureRSSI_t perform(bool break_on_operation, int i, freq_t f, int tracking) /
modulation_delay += config.cor_nfm3; modulation_delay += config.cor_nfm3;
break; break;
case MO_WFM: case MO_WFM:
modulation_delay += config.cor_wfm; modulation_delay += config.cor_am;
break; break;
} }
// modulation_table = setting.modulation - MO_NFM; // modulation_steps = setting.modulation - MO_NFM;
#else #else
// must be FM // must be FM
if (setting.modulation == MO_WFM) { // -17 default if (setting.modulation == MO_WFM) { // -17 default
modulation_delay += config.cor_wfm; modulation_delay += config.cor_am;
modulation_table = 1; modulation_table = 1;
} else { // must be NFM } else { // must be NFM
modulation_delay += config.cor_nfm; // -17 default modulation_delay += config.cor_nfm; // -17 default
@ -3677,7 +3682,7 @@ pureRSSI_t perform(bool break_on_operation, int i, freq_t f, int tracking) /
} }
modulation_again: modulation_again:
// ----------------------------------------------------- apply modulation for output modes --------------------------------------- // ----------------------------------------------------- apply modulation for output modes ---------------------------------------
if (MODE_OUTPUT(setting.mode) && setting.modulation != MO_NONE){ if (MODE_OUTPUT(setting.mode) && setting.modulation != MO_NONE && setting.modulation != MO_EXTERNAL){
if (setting.modulation == MO_AM) { // AM modulation if (setting.modulation == MO_AM) { // AM modulation
#ifdef TINYSA4 #ifdef TINYSA4
int p = setting.attenuate_x2 - fm_modulation[modulation_counter]; int p = setting.attenuate_x2 - fm_modulation[modulation_counter];
@ -3702,11 +3707,26 @@ modulation_again:
#endif #endif
} }
modulation_counter++; modulation_counter++;
if (modulation_counter >= modulation_steps) if (modulation_counter >= modulation_steps) {
modulation_counter = 0; modulation_counter = 0;
if (setting.modulation != MO_EXTERNAL && !in_selftest) { // latter is for frequency calculation cycle_counter++;
if (config.cor_am == -18) {
if (chVTGetSystemTimeX() - start_of_sweep_timestamp > 1000) { // 100 ms, System tick 10000 per second
start_of_sweep_timestamp = chVTGetSystemTimeX();
modulation_delay -= config.cor_am;
int actual_delay = 100000 / cycle_counter / modulation_steps; // In units of 1 microsecond
config.cor_am += modulation_delay - actual_delay;
if (config.cor_am >0)
config.cor_am = 0;
modulation_delay += config.cor_am;
cycle_counter = 0;
}
my_microsecond_delay(modulation_delay);
}
else
my_microsecond_delay(modulation_delay);
} else
my_microsecond_delay(modulation_delay); my_microsecond_delay(modulation_delay);
}
} }
// -------------------------------- Acquisition loop for one requested frequency covering spur avoidance and vbwsteps ------------------------ // -------------------------------- Acquisition loop for one requested frequency covering spur avoidance and vbwsteps ------------------------
pureRSSI_t RSSI = float_TO_PURE_RSSI(-150); pureRSSI_t RSSI = float_TO_PURE_RSSI(-150);
@ -4344,11 +4364,14 @@ again: // Spur redu
return(0); // abort return(0); // abort
if ( i==1 && MODE_OUTPUT(setting.mode) && setting.modulation != MO_NONE && setting.modulation != MO_EXTERNAL) { // if in output mode with modulation and LO setup done if ( i==1 && MODE_OUTPUT(setting.mode) && setting.modulation != MO_NONE && setting.modulation != MO_EXTERNAL) { // if in output mode with modulation and LO setup done
// i = 1; // Everything set so skip LO setting // i = 1; // Everything set so skip LO setting
#if 0
#define MODULATION_CYCLES_TEST 100000 #define MODULATION_CYCLES_TEST 100000
if (in_selftest && modulation_count_iter++ >= MODULATION_CYCLES_TEST) { if (in_selftest && modulation_count_iter++ >= MODULATION_CYCLES_TEST) {
start_of_sweep_timestamp = sa_ST2US(chVTGetSystemTimeX() - start_of_sweep_timestamp)/MODULATION_CYCLES_TEST; // uS per cycle start_of_sweep_timestamp = sa_ST2US(chVTGetSystemTimeX() - start_of_sweep_timestamp)/MODULATION_CYCLES_TEST; // uS per cycle
return 0; return 0;
} }
#endif
goto modulation_again; // Keep repeating sweep loop till user aborts by input goto modulation_again; // Keep repeating sweep loop till user aborts by input
} }
return(0); return(0);
@ -4639,7 +4662,7 @@ static bool sweep(bool break_on_operation)
modulation_counter = 0; // init modulation counter in case needed modulation_counter = 0; // init modulation counter in case needed
int refreshing = false; int refreshing = false;
#if 0
if (MODE_OUTPUT(setting.mode) && config.cor_nfm == 0) { // Calibrate the modulation frequencies at first use if (MODE_OUTPUT(setting.mode) && config.cor_nfm == 0) { // Calibrate the modulation frequencies at first use
calibrate_modulation(MO_AM, &config.cor_am); calibrate_modulation(MO_AM, &config.cor_am);
#ifdef TINYSA3 #ifdef TINYSA3
@ -4652,6 +4675,7 @@ static bool sweep(bool break_on_operation)
// calibrate_modulation(MO_WFM, &config.cor_wfm); // calibrate_modulation(MO_WFM, &config.cor_wfm);
config.cor_wfm = -14; config.cor_wfm = -14;
} }
#endif
if (dirty) { // Calculate new scanning solution if (dirty) { // Calculate new scanning solution
sweep_counter = 0; sweep_counter = 0;

@ -1088,9 +1088,9 @@ static UI_FUNCTION_ADV_CALLBACK(menu_smodulation_acb){
else { else {
#ifdef TINYSA4 #ifdef TINYSA4
if (setting.modulation == MO_AM) if (setting.modulation == MO_AM)
plot_printf(b->text, sizeof b->text, "MOD: %4dHz %s", (int)(setting.modulation_frequency), menu_modulation_text[setting.modulation]); plot_printf(b->text, sizeof b->text, "MOD: %4dHz AM %d%%", (int)(setting.modulation_frequency), setting.modulation_depth_x100);
else else
plot_printf(b->text, sizeof b->text, "MOD: %4dHz FM %4QHz DEVIATION", (int)(setting.modulation_frequency), (freq_t)(setting.modulation_deviation_div100*100)); plot_printf(b->text, sizeof b->text, "MOD: %4dHz FM %4QHz", (int)(setting.modulation_frequency), (freq_t)(setting.modulation_deviation_div100*100));
#else #else
plot_printf(b->text, sizeof b->text, "MOD: %4dHz %s", (int)(setting.modulation_frequency), menu_modulation_text[setting.modulation]); plot_printf(b->text, sizeof b->text, "MOD: %4dHz %s", (int)(setting.modulation_frequency), menu_modulation_text[setting.modulation]);
#endif #endif
@ -2597,7 +2597,7 @@ static const menuitem_t menu_lo_drive[] = {
static const menuitem_t menu_modulation[] = { static const menuitem_t menu_modulation[] = {
{ MT_FORM | MT_TITLE, 0, "MODULATION",NULL}, { MT_FORM | MT_TITLE, 0, "MODULATION",NULL},
{ MT_FORM | MT_ADV_CALLBACK, MO_NONE, MT_CUSTOM_LABEL, menu_modulation_acb}, { MT_FORM | MT_ADV_CALLBACK, MO_NONE, MT_CUSTOM_LABEL, menu_modulation_acb},
{ MT_FORM | MT_ADV_CALLBACK | MT_LOW, MO_AM, MT_CUSTOM_LABEL, menu_modulation_acb}, { MT_FORM | MT_ADV_CALLBACK | MT_LOW, MO_AM, "AM", menu_modulation_acb},
#ifdef TINYSA4 #ifdef TINYSA4
{ MT_FORM | MT_KEYPAD, KM_DEPTH, "DEPTH: %s%%", "0..100"}, { MT_FORM | MT_KEYPAD, KM_DEPTH, "DEPTH: %s%%", "0..100"},
{ MT_FORM | MT_ADV_CALLBACK, MO_WFM, "FM", menu_modulation_acb}, { MT_FORM | MT_ADV_CALLBACK, MO_WFM, "FM", menu_modulation_acb},

Loading…
Cancel
Save

Powered by TurnKey Linux.