Added high correction table

master
erikkaashoek 5 years ago
parent 2916b72f8a
commit 5162b521a0

@ -892,12 +892,16 @@ config_t config = {
.low_level_offset = 100, // Uncalibrated .low_level_offset = 100, // Uncalibrated
.high_level_offset = 100, // Uncalibrated .high_level_offset = 100, // Uncalibrated
#ifdef TINYSA3 #ifdef TINYSA3
.correction_frequency = { 10000, 100000, 200000, 500000, 50000000, 140000000, 200000000, 300000000, 330000000, 350000000 }, .low_correction_frequency = { 10000, 100000, 200000, 500000, 50000000, 140000000, 200000000, 300000000, 330000000, 350000000 },
.correction_value = { +6.0, +2.8, +1.6, -0.4, 0.0, -0.4, +0.4, +3.0, +4.0, +8.1 }, .low_correction_value = { +6.0, +2.8, +1.6, -0.4, 0.0, -0.4, +0.4, +3.0, +4.0, +8.1 },
.high_correction_frequency = { 240000000, 280000000, 300000000, 400000000, 500000000, 600000000, 700000000, 800000000, 900000000, 960000000 },
.high_correction_value = { 0, 0, 0, 0, 0.0, 0, 0, 0, 0, 0 },
#endif #endif
#ifdef TINYSA4 #ifdef TINYSA4
.correction_frequency = { 10000, 100000, 200000, 500000, 50000000, 140000000, 200000000, 300000000, 330000000, 350000000 }, .low_correction_frequency = { 10000, 100000, 200000, 500000, 50000000, 140000000, 200000000, 300000000, 330000000, 350000000 },
.correction_value = { 0, 0, 0, 0, 0.0, 0, 0, 0, 0, 0 }, .low_correction_value = { 0, 0, 0, 0, 0.0, 0, 0, 0, 0, 0 },
.high_correction_frequency = { 10000, 100000, 200000, 500000, 50000000, 140000000, 200000000, 300000000, 330000000, 350000000 },
.high_correction_value = { 0, 0, 0, 0, 0.0, 0, 0, 0, 0, 0 },
#endif #endif
.setting_frequency_10mhz = 10000000, .setting_frequency_10mhz = 10000000,
.cor_am = -14, .cor_am = -14,

@ -511,8 +511,10 @@ typedef struct config {
uint16_t vbat_offset; uint16_t vbat_offset;
float low_level_offset; float low_level_offset;
float high_level_offset; float high_level_offset;
freq_t correction_frequency[CORRECTION_POINTS]; freq_t low_correction_frequency[CORRECTION_POINTS];
float correction_value[CORRECTION_POINTS]; float low_correction_value[CORRECTION_POINTS];
freq_t high_correction_frequency[CORRECTION_POINTS];
float high_correction_value[CORRECTION_POINTS];
uint32_t deviceid; uint32_t deviceid;
freq_t setting_frequency_10mhz; freq_t setting_frequency_10mhz;
@ -814,6 +816,9 @@ typedef struct setting
int trigger_mode; int trigger_mode;
int slider_position; int slider_position;
int32_t slider_span; int32_t slider_span;
freq_t *correction_frequency;
float *correction_value;
uint32_t checksum; // must be last uint32_t checksum; // must be last
}setting_t; }setting_t;

@ -622,13 +622,13 @@ VNA_SHELL_FUNCTION(cmd_correction)
if (argc == 0) { if (argc == 0) {
shell_printf("index frequency value\r\n"); shell_printf("index frequency value\r\n");
for (int i=0; i<CORRECTION_POINTS; i++) { for (int i=0; i<CORRECTION_POINTS; i++) {
shell_printf("%d %d %.1f\r\n", i, config.correction_frequency[i], config.correction_value[i]); shell_printf("%d %d %.1f\r\n", i, setting.correction_frequency[i], setting.correction_value[i]);
} }
return; return;
} }
if (argc == 1 && (strcmp(argv[0],"reset") == 0)) { if (argc == 1 && (strcmp(argv[0],"reset") == 0)) {
for (int i=0; i<CORRECTION_POINTS; i++) { for (int i=0; i<CORRECTION_POINTS; i++) {
config.correction_value[i] = 0.0; setting.correction_value[i] = 0.0;
} }
shell_printf("correction table reset\r\n"); shell_printf("correction table reset\r\n");
return; return;
@ -640,10 +640,10 @@ VNA_SHELL_FUNCTION(cmd_correction)
int i = my_atoi(argv[0]); int i = my_atoi(argv[0]);
freq_t f = my_atoui(argv[1]); freq_t f = my_atoui(argv[1]);
float v = my_atof(argv[2]); float v = my_atof(argv[2]);
config.correction_frequency[i] = f; setting.correction_frequency[i] = f;
config.correction_value[i] = v; setting.correction_value[i] = v;
redraw_request|=REDRAW_AREA; // to ensure the change in level will be visible redraw_request|=REDRAW_AREA; // to ensure the change in level will be visible
shell_printf("updated %d to %d %.1f\r\n", i, config.correction_frequency[i], config.correction_value[i]); shell_printf("updated %d to %d %.1f\r\n", i, setting.correction_frequency[i], setting.correction_value[i]);
} }
VNA_SHELL_FUNCTION(cmd_scanraw) VNA_SHELL_FUNCTION(cmd_scanraw)

@ -149,6 +149,8 @@ void reset_settings(int m)
setting.attenuate_x2 = 60; setting.attenuate_x2 = 60;
setting.auto_attenuation = true; setting.auto_attenuation = true;
setting.sweep_time_us = 0; setting.sweep_time_us = 0;
setting.correction_frequency = config.low_correction_frequency;
setting.correction_value = config.low_correction_value;
break; break;
#ifdef __ULTRA__ #ifdef __ULTRA__
case M_ULTRA: case M_ULTRA:
@ -165,11 +167,15 @@ void reset_settings(int m)
set_sweep_frequency(ST_SPAN, 0); set_sweep_frequency(ST_SPAN, 0);
setting.sweep_time_us = 10*ONE_SECOND_TIME; setting.sweep_time_us = 10*ONE_SECOND_TIME;
setting.step_delay_mode = SD_FAST; setting.step_delay_mode = SD_FAST;
setting.correction_frequency = config.low_correction_frequency;
setting.correction_value = config.low_correction_value;
break; break;
case M_HIGH: case M_HIGH:
set_sweep_frequency(ST_START, minFreq); set_sweep_frequency(ST_START, minFreq);
set_sweep_frequency(ST_STOP, maxFreq); set_sweep_frequency(ST_STOP, maxFreq);
setting.sweep_time_us = 0; setting.sweep_time_us = 0;
setting.correction_frequency = config.high_correction_frequency;
setting.correction_value = config.high_correction_value;
break; break;
case M_GENHIGH: case M_GENHIGH:
setting.lo_drive=8; setting.lo_drive=8;
@ -177,6 +183,8 @@ void reset_settings(int m)
set_sweep_frequency(ST_SPAN, 0); set_sweep_frequency(ST_SPAN, 0);
setting.sweep_time_us = 10*ONE_SECOND_TIME; setting.sweep_time_us = 10*ONE_SECOND_TIME;
setting.step_delay_mode = SD_FAST; setting.step_delay_mode = SD_FAST;
setting.correction_frequency = config.high_correction_frequency;
setting.correction_value = config.high_correction_value;
break; break;
} }
for (uint8_t i = 0; i< MARKERS_MAX; i++) { for (uint8_t i = 0; i< MARKERS_MAX; i++) {
@ -1069,11 +1077,11 @@ static int32_t scaled_correction_value[CORRECTION_POINTS];
void calculate_correction(void) void calculate_correction(void)
{ {
scaled_correction_value[0] = config.correction_value[0] * (1 << (SCALE_FACTOR)); scaled_correction_value[0] = setting.correction_value[0] * (1 << (SCALE_FACTOR));
for (int i = 1; i < CORRECTION_POINTS; i++) { for (int i = 1; i < CORRECTION_POINTS; i++) {
scaled_correction_value[i] = config.correction_value[i] * (1 << (SCALE_FACTOR)); scaled_correction_value[i] = setting.correction_value[i] * (1 << (SCALE_FACTOR));
int32_t m = scaled_correction_value[i] - scaled_correction_value[i-1]; int32_t m = scaled_correction_value[i] - scaled_correction_value[i-1];
int32_t d = (config.correction_frequency[i] - config.correction_frequency[i-1]) >> SCALE_FACTOR; int32_t d = (setting.correction_frequency[i] - setting.correction_frequency[i-1]) >> SCALE_FACTOR;
scaled_correction_multi[i] = (int32_t) ( m / d ); scaled_correction_multi[i] = (int32_t) ( m / d );
} }
} }
@ -1082,20 +1090,20 @@ void calculate_correction(void)
pureRSSI_t get_frequency_correction(freq_t f) // Frequency dependent RSSI correction to compensate for imperfect LPF pureRSSI_t get_frequency_correction(freq_t f) // Frequency dependent RSSI correction to compensate for imperfect LPF
{ {
if (!(setting.mode == M_LOW || setting.mode == M_GENLOW)) if (setting.mode == M_GENHIGH)
return(0.0); return(0.0);
int i = 0; int i = 0;
while (f > config.correction_frequency[i] && i < CORRECTION_POINTS) while (f > setting.correction_frequency[i] && i < CORRECTION_POINTS)
i++; i++;
if (i >= CORRECTION_POINTS) if (i >= CORRECTION_POINTS)
return(scaled_correction_value[CORRECTION_POINTS-1] >> (SCALE_FACTOR - 5) ); return(scaled_correction_value[CORRECTION_POINTS-1] >> (SCALE_FACTOR - 5) );
if (i == 0) if (i == 0)
return(scaled_correction_value[0] >> (SCALE_FACTOR - 5) ); return(scaled_correction_value[0] >> (SCALE_FACTOR - 5) );
f = f - config.correction_frequency[i-1]; f = f - setting.correction_frequency[i-1];
#if 0 #if 0
freq_t m = (config.correction_frequency[i] - config.correction_frequency[i-1]) >> SCALE_FACTOR ; freq_t m = (setting.correction_frequency[i] - setting.correction_frequency[i-1]) >> SCALE_FACTOR ;
float multi = (config.correction_value[i] - config.correction_value[i-1]) * (1 << (SCALE_FACTOR -1)) / (float)m; float multi = (setting.correction_value[i] - setting.correction_value[i-1]) * (1 << (SCALE_FACTOR -1)) / (float)m;
float cv = config.correction_value[i-1] + ((f >> SCALE_FACTOR) * multi) / (float)(1 << (SCALE_FACTOR -1)) ; float cv = setting.correction_value[i-1] + ((f >> SCALE_FACTOR) * multi) / (float)(1 << (SCALE_FACTOR -1)) ;
#else #else
int32_t scaled_f = f >> SCALE_FACTOR; int32_t scaled_f = f >> SCALE_FACTOR;
pureRSSI_t cv = (scaled_correction_value[i-1] + (scaled_f * scaled_correction_multi[i])) >> (SCALE_FACTOR - 5) ; pureRSSI_t cv = (scaled_correction_value[i-1] + (scaled_f * scaled_correction_multi[i])) >> (SCALE_FACTOR - 5) ;

Loading…
Cancel
Save

Powered by TurnKey Linux.