From fdc7a0b58a4484de606b78e034ee5e87f410763b Mon Sep 17 00:00:00 2001 From: erikkaashoek Date: Wed, 20 Dec 2023 15:29:10 +0100 Subject: [PATCH] Added selftest --- main.c | 20 +++++++------- nanovna.h | 4 +-- sa_core.c | 78 +++++++++++++++++++++++++++++++++++++++++++------------ 3 files changed, 74 insertions(+), 28 deletions(-) diff --git a/main.c b/main.c index 432eca0..c8602bd 100644 --- a/main.c +++ b/main.c @@ -1150,15 +1150,15 @@ const int to_calibrate[5] = {8,9,10,11,12}; //properties_t *active_props = ¤t_props; #ifdef TINYSA4 const freq_t v5_2_correction_frequency[CORRECTION_SIZE][CORRECTION_POINTS]= -{ // * * * * - /* low */ { 10000, 100000, 300000, 600000, 2000000, 3000000, 30000000, 60000000, 80000000, 120000000, 230000000, 360000000, 520000000, 560000000, 640000000, 750000000, 800000000, 810000000, 820000000, 830000000}, - /* low lna */ { 10000, 30000, 100000, 300000, 1000000, 5000000, 40000000, 70000000, 210000000, 240000000, 270000000, 300000000, 330000000, 480000000, 650000000, 740000000, 790000000, 810000000, 820000000, 830000000}, +{ + /* low */ { 100000, 300000, 600000, 2000000, 3000000, 30000000, 60000000, 80000000, 120000000, 150000000, 230000000, 360000000, 520000000, 560000000, 640000000, 750000000, 800000000, 810000000, 820000000, 830000000}, + /* low lna */ { 100000, 300000, 1000000, 5000000, 40000000, 70000000, 180000000, 210000000, 240000000, 250000000, 270000000, 300000000, 330000000, 540000000, 650000000, 740000000, 790000000, 810000000, 820000000, 830000000}, /* ultra */ { 30000000, 700000000, 980000000, 1910000000, 2550000000, 2800000000, 2810000000, 3020000000, 3120000000, 3430000000, 3750000000, 4230000000, 4480000000, 4810000000, 5430000000, 5640000000, 6390000000, 6660000000, 6980000000, 7250000000}, /* ultra lna */ { 30000000, 700000000, 1130000000, 1840000000, 2490000000, 2800000000, 2810000000, 3110000000, 3500000000, 3940000000, 4480000000, 4610000000, 4940000000, 5450000000, 6030000000, 6200000000, 6580000000, 6650000000, 7150000000, 7250000000}, /* direct */ { 140000000, 150000000, 160000000, 180000000, 280000000, 290000000, 300000000, 330000000, 340000000, 350000000, 410000000, 480000000, 560000000, 823000000, 830000000, 850000000, 890000000, 950000000, 1090000000, 1120000000}, /* direct lna */ { 140000000, 150000000, 170000000, 180000000, 280000000, 290000000, 310000000, 370000000, 440000000, 470000000, 480000000, 560000000, 823000000, 830000000, 850000000, 890000000, 950000000, 1040000000, 1090000000, 1120000000, }, - /* harm */ { 30000000, 6000000000, 6400890869, 6596881960, 7104677060, 7398663697, 7603563474, 8004454343, 8200445434, 8396436526, 8503340757, 8601336303, 8904231626, 9100222717, 9296213808, 9403118040, 9599109131, 9804008909, 9902004454, 10000000000, }, - /* harm lna */ { 30000000, 6000000000, 6195991091, 6596881960, 6997772829, 7300668151, 7603563474, 7897550111, 8200445434, 8396436526, 8601336303, 8797327394, 8904231626, 9100222717, 9198218263, 9305122494, 9501113586, 9599109131, 9697104677, 10000000000, }, + /* harm */ { 30000000, 6000000000, 6195991091, 6302895323, 6400890869, 6899777283, 7104677060, 7398663697, 7701559020, 7799554566, 8200445434, 8298440980, 8503340757, 8904231626, 9002227171, 9100222717, 9198218263, 9296213808, 9501113586, 9804008909, }, + /* harm lna */ { 30000000, 6000000000, 6097995546, 6204899777, 6498886414, 6596881960, 6801781737, 7496659243, 7701559020, 7995545657, 8102449889, 8298440980, 8396436526, 8699331849, 8904231626, 9100222717, 9198218263, 9403118040, 9697104677, 10000000000, }, /* out */ { 10000, 30000, 100000, 200000, 600000, 5000000, 170000000, 250000000, 300000000, 390000000, 490000000, 650000000, 690000000, 740000000, 780000000, 800000000, 810000000, 820000000, 823000000, 830000000, }, /* direct */ { 500000000, 823000000, 830000000, 850000000, 860000000, 870000000, 880000000, 890000000, 900000000, 910000000, 920000000, 930000000, 970000000, 1030000000, 1040000000, 1050000000, 1060000000, 1070000000, 1080000000, 1100000000, }, /* adf */ { 500000000, 700000000, 1340000000, 1500000000, 2000000000, 2350000000, 2800000000, 2810000000, 3000000000, 3410000000, 3600000000, 3990000000, 4330000000, 4570000000, 4760000000, 5310000000, 5320000000, 5720000000, 6100000000, 6440000000, }, @@ -1167,14 +1167,14 @@ const freq_t v5_2_correction_frequency[CORRECTION_SIZE][CORRECTION_POINTS]= const float v5_2_correction_value[CORRECTION_SIZE][CORRECTION_POINTS]= { - /* low */ { 4.24, 2.39, 1.18, 1.2, 0.33, 0.87, 0.4, 1.24, 0.64, 0.99, 0.04, 0.88, -0.64, -0.2, -0.36, 0.4, 3.45, 4.8, 8.04, 13.94, }, - /* low lna */ { 17.53, 11.92, 5.48, 0.9, -1.57, -3.5, 1.8, 2.47, 2.75, 4.08, 9.22, 6.07, 5.23, 3.5, 3.77, 4.9, 7.06, 9.11, 12.48, 19.18, }, + /* low */ { 2.39, 1.18, 1.2, 0.33, 0.87, 0.4, 1.24, 0.64, 0.99, 0.35, 0.04, 0.88, -0.64, -0.2, -0.36, 0.4, 3.45, 4.8, 8.04, 13.94, }, + /* low lna */ { 5.48, 0.9, -1.57, -3.5, 1.8, 2.47, 2.75, 4.08, 8.47, 9.22, 6.07, 4.54, 4.56, 3.73, 3.77, 4.9, 7.06, 9.11, 12.48, 19.18, }, /* ultra */ { -0.01, -0.42, -0.53, 0.38, 1.65, 1.35, 2.24, 2.96, 2.88, 4.4, 4.85, 5.43, 7.64, 8.82, 8.2, 11.3, 12.94, 15.53, 22.44, 29.28, }, /* ultra lna */ { 0.65, 4.24, 4.91, 5.15, 7.38, 6.29, 7.14, 7.09, 10.38, 10.66, 12.3, 11.71, 14.07, 13.1, 19, 19.03, 16.03, 16.88, 32.09, 34.59, }, /* direct */ { 34.02, 31.94, 30.89, 28.88, 20.1, 20.23, 19.04, 18.06, 16.75, 16.94, 13.39, 10.63, 7.2, -1.19, -1.19, -1.29, -1, -0.0399999999999991, 3.04, 4.03, }, /* direct lna */ { 29.65, 28.51, 26.73, 25.82, 19.67, 18.67, 16.64, 13.81, 9.73, 7.62, 7.57, 4.58, -3.66, -3.66, -3.67, -3.68, -2.48, -0.379999999999999, 0.859999999999999, 1.53, }, - /* harm */ { 18.6, 17.38, 18.68, 19.78, 20.88, 22.41, 24.41, 29.91, 33.41, 36.41, 36.91, 35.91, 33.91, 35.41, 39.91, 41.91, 45, 47.91, 48.91, 50.41, }, - /* harm lna */ { 13.6, 26.38, 26.38, 21.88, 26.88, 28.65, 31.88, 39.88, 45.88, 45.88, 42.88, 42.3, 42.98, 46.88, 51.38, 56.38, 63.38, 63.88, 62.88, 65.34, }, + /* harm */ { 18.7, 18.91, 19.91, 19.41, 19.91, 21.91, 22.41, 23.91, 26.91, 28.41, 34.41, 36.41, 37.91, 35.94, 35.94, 36.9, 38.44, 40.94, 44.94, 48.94, }, + /* harm lna */ { 13.6, 24.41, 23.41, 23.41, 19.91, 19.41, 21.91, 27.41, 31.91, 39.91, 41.91, 43.41, 42.91, 38.91, 40.91, 44.41, 47.91, 57.91, 61.41, 61.46, }, /* out */ { 3.84, 2.31, 1.04, 0.1, -0.82, -1.51, -2.33, -2.25, -2.04, -1.43, -2.2, -2.36, -1.84, -1.23, 0.51, 1.8, 3.17, 6.28, 7.85, 12.37, }, /* direct */ { -7.76, -3.85, -3.71, -3.54, -3.45, -3.34, -3.23, -3.11, -2.98, -2.86, -2.74, -2.64, -2.14, -1.29, -1.14, -1.05, -0.89, -0.79, -0.62, -0.31, }, /* adf */ { 5.58, 3.91, -4.52, -6, -3.36, -2.14, -2.3, -3.11, -3.11, -2.05, -1.5, -1.36, 1.28, 4.63, 5.89, 5.55, 5.47, 6.49, 3.86, 5.8, }, @@ -2993,7 +2993,7 @@ int main(void) memcpy(config.correction_value, v5_2_correction_value, sizeof(config.correction_value)); config.harmonic_level_offset = v5_2_harmonic_level_offset; config.harmonic_lna_level_offset = v5_2_harmonic_lna_level_offset; - ULTRA_MAX_FREQ = 7000000000ULL; + ULTRA_MAX_FREQ = 7300000000ULL; } else { ULTRA_MAX_FREQ = 5340000000ULL; } diff --git a/nanovna.h b/nanovna.h index 7cef619..95b171c 100644 --- a/nanovna.h +++ b/nanovna.h @@ -18,7 +18,7 @@ */ #include "ch.h" -#ifdef TINYSA_F303 +//#ifdef TINYSA_F303 #ifdef TINYSA_F072 #error "Remove comment for #ifdef TINYSA_F303" #endif @@ -26,7 +26,7 @@ #define TINYSA4 #endif #define TINYSA4_PROTO -#endif +//#endif #ifdef TINYSA_F072 #ifdef TINYSA_F303 diff --git a/sa_core.c b/sa_core.c index 90662c7..94896a6 100644 --- a/sa_core.c +++ b/sa_core.c @@ -1613,8 +1613,8 @@ void set_actual_correction_value(int current_curve,int current_curve_index, floa float get_level_offset(void) { - if (setting.disable_correction) - return 0; +// if (setting.disable_correction) +// return 0; if (setting.mode == M_HIGH) { if (config.high_level_offset == 100) // Offset of 100 means not calibrated return 0; @@ -6208,7 +6208,7 @@ enum { enum { TP_SILENT, TPH_SILENT, TP_10MHZ, TP_10MHZEXTRA, TP_30MHZ_SWITCH, TP_30MHZ, TPH_30MHZ, TPH_30MHZ_SWITCH, #ifdef TINYSA4 - TP_30MHZ_ULTRA, TP_30MHZ_DIRECT, TP_30MHZ_LNA,TP_SILENT_LNA + TP_30MHZ_ULTRA, TP_30MHZ_DIRECT, TP_30MHZ_LNA,TP_SILENT_LNA, TP_15MHZ_LNA #endif }; @@ -6256,33 +6256,34 @@ const test_case_t test_case [] = TEST_CASE_STRUCT(TC_DISPLAY, TP_30MHZ, 30, 0, CAL_LEVEL, 50, -60), // 11 test display TEST_CASE_STRUCT(TC_ATTEN, TP_30MHZ, 30, 0, CAL_LEVEL, 50, -60), // 12 Measure atten step accuracy TEST_CASE_STRUCT(TC_SIGNAL, TP_30MHZ_LNA, 30, 5, CAL_LEVEL, 10, -75), // 13 Measure LNA -#define TEST_END 13 + TEST_CASE_STRUCT(TC_SIGNAL, TP_15MHZ_LNA, 30, 5, CAL_LEVEL, 10, -90), // 14 LPF flatness +#define TEST_END 14 TEST_CASE_STRUCT(TC_END, 0, 0, 0, 0, 0, 0), -#define TEST_POWER 14 +#define TEST_POWER 15 TEST_CASE_STRUCT(TC_MEASURE, TP_30MHZ, 30, 50, CAL_LEVEL, 10, -55), // 12 Measure power level and noise TEST_CASE_STRUCT(TC_MEASURE, TP_30MHZ, 270, 4, -50, 10, -75), // 13 Measure powerlevel and noise TEST_CASE_STRUCT(TC_MEASURE, TPH_30MHZ, 270, 4, -40, 10, -65), // 14 Calibrate power high mode TEST_CASE_STRUCT(TC_END, 0, 0, 0, 0, 0, 0), -#define TEST_RBW 18 +#define TEST_RBW 19 TEST_CASE_STRUCT(TC_MEASURE, TP_30MHZ, 30, 1, CAL_LEVEL, 10, -60), // 16 Measure RBW step time TEST_CASE_STRUCT(TC_END, 0, 0, 0, 0, 0, 0), TEST_CASE_STRUCT(TC_MEASURE, TPH_30MHZ, 300, 4, -48, 10, -65), // 14 Calibrate power high mode TEST_CASE_STRUCT(TC_MEASURE, TPH_30MHZ_SWITCH,300, 4, -40, 10, -65), // 14 Calibrate power high mode -#define TEST_ATTEN 22 +#define TEST_ATTEN 23 TEST_CASE_STRUCT(TC_ATTEN, TP_30MHZ, 30, 0, CAL_LEVEL, 50, -60), // 20 Measure atten step accuracy -#define TEST_SPUR 23 +#define TEST_SPUR 24 TEST_CASE_STRUCT(TC_BELOW, TP_SILENT, 144, 8, -95, 0, 0), // 22 Measure 48MHz spur -#define TEST_LEVEL 24 +#define TEST_LEVEL 25 TEST_CASE_STRUCT(TC_LEVEL, TP_30MHZ, 30.000, 0, CAL_LEVEL, 50, -55), // 23 Measure level TEST_CASE_STRUCT(TC_LEVEL, TP_30MHZ_LNA, 30.000, 0, CAL_LEVEL, 50, -55), // 23 Measure level TEST_CASE_STRUCT(TC_LEVEL, TPH_30MHZ, 150, 0, CAL_LEVEL-30, 50, -55), // 23 Measure level -#define TEST_NOISE 27 +#define TEST_NOISE 28 TEST_CASE_STRUCT(TC_LEVEL, TP_SILENT, 201.000, 0, -166, 50, -166), // 23 Measure level -#define TEST_NOISE_RBW 28 +#define TEST_NOISE_RBW 29 TEST_CASE_STRUCT(TC_MEASURE, TP_SILENT, 201, 1, -166, 10, -166), // 16 Measure RBW step time -#define TEST_JUMP 29 +#define TEST_JUMP 30 TEST_CASE_STRUCT(TC_JUMP, TP_30MHZ_LNA, 30, 0.001, -40, 0, CAL_LEVEL), // 16 Measure jumps -#define TEST_JUMP_HARMONIC 30 +#define TEST_JUMP_HARMONIC 31 TEST_CASE_STRUCT(TC_JUMP, TP_30MHZ, 30, 0.001, -40, 0, CAL_LEVEL), // 16 Measure jumps }; #else @@ -6353,6 +6354,25 @@ void determine_direct_test_freq(void) { } config.ultra = old_ultra; } + +static float lpf_test_level = 0; +#define LPF_TEST_FREQ 795000000 +void determine_lpf_test_level(void) { + int old_ultra = config.ultra; + config.ultra = true; + int old_lna = setting.extra_lna; + setting.extra_lna = true; + force_signal_path = true; + test_path = 3; + set_refer_output(1); + dirty = true; + lpf_test_level = PURE_TO_float(perform(false, 0, (freq_t)LPF_TEST_FREQ, false)); + dirty = true; + force_signal_path = false; + config.ultra = old_ultra; + setting.extra_lna = old_lna; +} + #endif static void test_acquire(int i) @@ -6420,10 +6440,18 @@ void cell_draw_test_info(int x0, int y0) int validate_signal_within(int i, float margin) { test_fail_cause[i] = "Signal level "; - if (fabsf(peakLevel-test_case[i].pass) > 2*margin) { + float test_level = test_case[i].pass; +#ifdef TINYSA4 + if (test_case[i].setup == TP_15MHZ_LNA) { + test_level = lpf_test_level; + margin = 5; + } +#endif + + if (fabsf(peakLevel-test_level) > 2*margin) { return TS_FAIL; } - if (fabsf(peakLevel-test_case[i].pass) > margin) { + if (fabsf(peakLevel-test_level) > margin) { return TS_CRITICAL; } if (setting.measurement == M_PASS_BAND) { @@ -6444,6 +6472,8 @@ int validate_signal_within(int i, float margin) #ifdef TINYSA4 if (test_case[i].setup == TP_30MHZ_DIRECT) c_freq = direct_test_freq; + if (test_case[i].setup == TP_15MHZ_LNA) + c_freq = LPF_TEST_FREQ; #endif test_fail_cause[i] = "Frequency "; if (peakFreq < c_freq - 500000 || c_freq + 500000 < peakFreq ) @@ -6741,15 +6771,25 @@ common_silent: #else stored_t[j] = test_case[i].stop - (i == 6?3:0); #endif - for (int j = setting._sweep_points/2 - W2P(test_case[i].width); j < setting._sweep_points/2 + W2P(test_case[i].width); j++) + for (int j = setting._sweep_points/2 - W2P(test_case[i].width); j < setting._sweep_points/2 + W2P(test_case[i].width); j++) { +#ifdef TINYSA4 + if (test_case[i].setup == TP_15MHZ_LNA) + stored_t[j] = lpf_test_level; + else +#endif stored_t[j] = test_case[i].pass; + } break; #ifdef TINYSA4 + case TP_15MHZ_LNA: + determine_lpf_test_level(); + goto simple; case TP_30MHZ_DIRECT: case TP_30MHZ_ULTRA: case TP_30MHZ_LNA: #endif case TP_30MHZ: + simple: set_mode(M_LOW); #ifdef TINYSA4 maxFreq = 9900000000ULL; // needed to measure the LPF rejection @@ -6785,6 +6825,10 @@ common_silent: case TP_30MHZ_LNA: setting.extra_lna = true; break; + case TP_15MHZ_LNA: + set_refer_output(1); + setting.extra_lna = true; + break; #endif case TP_30MHZ_SWITCH: set_attenuation(32); // This forces the switch to transmit so isolation can be tested @@ -6811,6 +6855,8 @@ common_silent: #ifdef TINYSA4 if (test_case[i].setup == TP_30MHZ_DIRECT) c_freq = direct_test_freq; + if (test_case[i].setup == TP_15MHZ_LNA) + c_freq = LPF_TEST_FREQ; #endif set_sweep_frequency(ST_CENTER, c_freq); }