diff --git a/nanovna.h b/nanovna.h index f6558ab..706cdf4 100644 --- a/nanovna.h +++ b/nanovna.h @@ -816,6 +816,7 @@ void self_test(int); //extern int setting_test; void wait_user(void); void calibrate(void); +float to_dBm(float); enum { M_OFF, M_IMD, M_OIP3, M_PHASE_NOISE, M_STOP_BAND, M_PASS_BAND, M_LINEARITY diff --git a/plot.c b/plot.c index 29a812f..8c2cbbc 100644 --- a/plot.c +++ b/plot.c @@ -457,10 +457,10 @@ value(const float v) switch(setting.unit) { case U_DBMV: - return v+ 30.0 + 20.0*log10(sqrt(50)); + return v + 30.0 + 20.0*log10(sqrt(50)); break; case U_DBUV: - return v+ 90.0 + 20.0*log10(sqrt(50.0)); + return v + 90.0 + 20.0*log10(sqrt(50.0)); break; case U_MVOLT: return pow(10, (v-30.0)/20.0) * sqrt(50.0) * 1000.0; @@ -480,6 +480,34 @@ value(const float v) } +float +to_dBm(const float v) +{ + switch(setting.unit) + { + case U_DBMV: + return v - 30.0 - 20.0*log10(sqrt(50)); + break; + case U_DBUV: + return v - 90.0 - 20.0*log10(sqrt(50.0)); + break; + case U_MVOLT: + return log10( v / (sqrt(50.0) * 1000.0)) * 20.0 + 30.0 ; + break; + case U_UVOLT: + return log10(v / (sqrt(50.0) * 1000000.0))*20.0 + 30.0; + break; + case U_MWATT: + return log10(v)*10.0; + break; + case U_UWATT: + return log10(v/1000.0)*10.0; + break; + } +// case U_DBM: + return v; // raw data is in logmag*10 format + +} #ifdef __VNA_ diff --git a/sa_core.c b/sa_core.c index 45ebb04..2ef9ed4 100644 --- a/sa_core.c +++ b/sa_core.c @@ -217,10 +217,22 @@ void set_IF(int f) void set_unit(int u) { - if (UNIT_IS_LINEAR(setting.unit) && !UNIT_IS_LINEAR(u)) { + float r = to_dBm(setting.reflevel); // Get neutral unit + float s = to_dBm(setting.scale); +// float t = setting.trigger; // Is always in dBm + // float m = r - NGRIDSY*s; + + setting.unit = u; // Switch unit + + r = value(r); // Convert to target unit + s = value(s); + if (UNIT_IS_LINEAR(setting.unit)) { + set_reflevel(r); + set_scale(r/10.0); + } else { + r = 10 * round((r*1.2)/10.0); set_scale(10); } - setting.unit = u; dirty = true; } diff --git a/ui_sa.c b/ui_sa.c index 56403df..6a4ce20 100644 --- a/ui_sa.c +++ b/ui_sa.c @@ -423,7 +423,7 @@ static const char * const keypad_mode_label[] = { static const char * const keypad_mode_label[] = { "error", "START", "STOP", "CENTER", "SPAN", "FREQ", "REFPOS", "SCALE", // 0-7 "\2ATTENUATE\0 0-31dB", "\2ACTUAL\0POWER", "IF", "\2SAMPLE\0TIME", "DRIVE", "LEVEL", "LEVEL", "LEVEL", // 8-15 - "OFFSET" , "REPEATS", "OFFSET", "TRIGGER", "\2LEVEL\0SWEEP", "\2SWEEP\0SECONDS"// 16- + "OFFSET" , "REPEATS", "OFFSET", "\2TRIGGER\0LEVEL", "\2LEVEL\0SWEEP", "\2SWEEP\0SECONDS"// 16- }; #endif @@ -1843,7 +1843,7 @@ set_numeric_value(void) set_sweep_time(uistat.value); break; case KM_TRIGGER: - set_trigger_level(uistat.value); + set_trigger_level(to_dBm(uistat.value)); break; } }