From a1f4799e3371c52b3847e8075f53a752f4165cf5 Mon Sep 17 00:00:00 2001 From: erikkaashoek Date: Wed, 24 Jun 2020 11:56:56 +0200 Subject: [PATCH] Extended attenuation range in low input and step attenuation in high input --- sa_core.c | 64 ++++++++++++++++++++++++++++++++++++++++++------------- ui_sa.c | 3 ++- 2 files changed, 51 insertions(+), 16 deletions(-) diff --git a/sa_core.c b/sa_core.c index 31b15ec..e823dd4 100644 --- a/sa_core.c +++ b/sa_core.c @@ -293,12 +293,18 @@ void set_IF(int f) #define POWER_STEP 0 // Should be 5 dB but appearently it is lower #define POWER_OFFSET 15 #define SWITCH_ATTENUATION 30 +#define RECEIVE_SWITCH_ATTENUATION 21 void set_auto_attenuation(void) { setting.auto_attenuation = true; - setting.attenuate = 30.0; + if (setting.mode == M_LOW) { + setting.attenuate = 30.0; + } else { + setting.attenuate = 0; + } + setting.step_atten = false; } void set_auto_reflevel(int v) @@ -313,6 +319,11 @@ float get_attenuation(void) return ( -(POWER_OFFSET + setting.attenuate - (setting.step_atten-1)*POWER_STEP + SWITCH_ATTENUATION)); else return ( -POWER_OFFSET - setting.attenuate + (setting.drive & 7) * 3); + } else if (setting.step_atten) { + if (setting.mode == M_LOW) + return setting.attenuate + RECEIVE_SWITCH_ATTENUATION; + else + return setting.attenuate + SWITCH_ATTENUATION; } return(setting.attenuate); } @@ -360,13 +371,22 @@ void set_attenuation(float a) } a = -a; } else { - setting.step_atten = 0; + if (setting.mode == M_LOW && a > 31) { + setting.step_atten = 1; + a = a - RECEIVE_SWITCH_ATTENUATION; + } else if (setting.mode == M_HIGH && a > 0) { + setting.step_atten = 1; + a = a - SWITCH_ATTENUATION; + } else + setting.step_atten = 0; setting.auto_attenuation = false; } if (a<0.0) a = 0; if (a> 31) a=31.0; + if (setting.mode == M_HIGH) // No attenuator in high mode + a = 0; // if (setting.attenuate == a) // return; setting.attenuate = a; @@ -724,6 +744,9 @@ void apply_settings(void) PE4302_Write_Byte(40); // Ensure defined input impedance of low port when using high input mode (power calibration) else PE4302_Write_Byte((int)(setting.attenuate * 2)); + if (setting.mode == M_LOW) { + + } SI4432_SetReference(setting.refer); update_rbw(); if (setting.frequency_step == 0.0) { @@ -877,7 +900,11 @@ mute: SI4432_Sel = 1; SI4432_Receive(); - set_switch_receive(); + if (setting.step_atten) { + set_switch_transmit(); + } else { + set_switch_receive(); + } set_AGC_LNA(); break; @@ -1387,7 +1414,7 @@ float perform(bool break_on_operation, int i, uint32_t f, int tracking) static float correct_RSSI; if (i == 0 || setting.frequency_step != 0 ) // only cases where the value can change - correct_RSSI = get_level_offset()+ setting.attenuate - signal_path_loss - setting.offset + get_frequency_correction(f); + correct_RSSI = get_level_offset()+ get_attenuation() - signal_path_loss - setting.offset + get_frequency_correction(f); wait: subRSSI = SI4432_RSSI(lf, MODE_SELECT(setting.mode)) + correct_RSSI ; // if ( i < 3) @@ -1589,8 +1616,8 @@ again: } if (!in_selftest && setting.mode == M_LOW && setting.auto_attenuation && max_index[0] > 0) { // Auto attenuate - float old_attenuate = setting.attenuate; - float actual_max_level = actual_t[max_index[0]] - setting.attenuate; + float old_attenuate = get_attenuation(); + float actual_max_level = actual_t[max_index[0]] - old_attenuate; if (actual_max_level < - 31 && setting.attenuate >= 10) { setting.attenuate -= 10.0; } else if (actual_max_level < - 26 && setting.attenuate >= 5) { @@ -1598,16 +1625,22 @@ again: } else if (actual_max_level > - 19 && setting.attenuate <= 20) { setting.attenuate += 10.0; } - if (old_attenuate != setting.attenuate) { + if (old_attenuate != get_attenuation()) { redraw_request |= REDRAW_CAL_STATUS; PE4302_Write_Byte((int)(setting.attenuate * 2)); + SI4432_Sel = 0; + if (setting.step_atten) { + set_switch_transmit(); + } else { + set_switch_receive(); + } // dirty = true; // Must be above if(scandirty!!!!!) } } if (!in_selftest && MODE_INPUT(setting.mode) && S_IS_AUTO(setting.agc) && UNIT_IS_LINEAR(setting.unit)) { // Auto AGC in linear mode unsigned char v; static unsigned char old_v; - float actual_max_level = actual_t[max_index[0]] - setting.attenuate; + float actual_max_level = actual_t[max_index[0]] - get_attenuation(); if (actual_max_level > - 45) v = 0x50; // Disable AGC and enable LNA else @@ -1989,7 +2022,7 @@ void draw_cal_status(void) #endif ili9341_drawstring(buf, x, y); - if (setting.mode == M_LOW) { +// if (setting.mode == M_LOW) { // Attenuation if (setting.auto_attenuation) color = DEFAULT_FG_COLOR; @@ -1999,10 +2032,10 @@ void draw_cal_status(void) y += YSTEP + YSTEP/2 ; ili9341_drawstring("Attn:", x, y); y += YSTEP; - plot_printf(buf, BLEN, "%.2FdB", setting.attenuate); + plot_printf(buf, BLEN, "%.2FdB", get_attenuation()); buf[6]=0; ili9341_drawstring(buf, x, y); - } +// } // Average if (setting.average>0) { @@ -2634,15 +2667,16 @@ void self_test(int test) if ((int)stored_t[j] > 1) shell_printf("%d, %d\n\r", ((int)temp_t[j])/1000, (int)stored_t[j]); } - } else if (test == 2) { - // Attenuator test + } else if (test == 2) { // Attenuator test in_selftest = true; reset_settings(M_LOW); int i = 15; // calibrate attenuator at 30 MHz; float reference_peak_level = 0; test_prepare(i); - for (int j= 0; j < 32; j++ ) { + for (int j= 0; j < 50; j++ ) { test_prepare(i); + set_RBW(30); + set_attenuation((float)j); float summed_peak_level = 0; for (int k=0; k<10; k++) { @@ -2653,7 +2687,7 @@ void self_test(int test) peakLevel = summed_peak_level / 10; if (j == 0) reference_peak_level = peakLevel; - shell_printf("Target %d, actual %f, delta %f\n\r",j, peakLevel, peakLevel - reference_peak_level); + shell_printf("Attenuation %ddB, measured level %.2fdBm, delta %.2fdB\n\r",j, peakLevel, peakLevel - reference_peak_level); } } else if (test == 3) { // RBW step time search diff --git a/ui_sa.c b/ui_sa.c index 6773770..4635ef3 100644 --- a/ui_sa.c +++ b/ui_sa.c @@ -1207,6 +1207,7 @@ const menuitem_t menu_highoutputmode[] = { { MT_FORM | MT_SUBMENU, 0, "LEVEL: %s", menu_drive_wide}, { MT_FORM | MT_SUBMENU, 0, "MODULATION: %s", menu_modulation}, { MT_FORM | MT_KEYPAD, KM_SPAN, "SPAN: %s", NULL}, + { MT_FORM | MT_KEYPAD, KM_SWEEP_TIME,"SWEEP TIME: %s", "0..600S"}, { MT_FORM | MT_CANCEL, 0, "MODE", NULL }, { MT_FORM | MT_NONE, 0, NULL, NULL } // sentinel }; @@ -1492,7 +1493,7 @@ static const menuitem_t menu_level[] = { { MT_SUBMENU, 0, "\2REF\0LEVEL", menu_reflevel}, // { MT_SUBMENU, 0, "\2SCALE/\0DIV",menu_scale_per}, { MT_KEYPAD, KM_SCALE, "\2SCALE/\0DIV",NULL}, - { MT_SUBMENU | MT_LOW, 0, "ATTEN", menu_atten}, + { MT_SUBMENU, 0, "ATTEN", menu_atten}, { MT_SUBMENU,0, "CALC", menu_average}, { MT_SUBMENU, 0, "UNIT", menu_unit}, { MT_KEYPAD, KM_OFFSET, "\2EXTERN\0AMP",NULL},