Keep reflevel

tinySA-v0.2
erikkaashoek 6 years ago
parent 9c0584abd7
commit c1c1681c29

@ -816,6 +816,7 @@ void self_test(int);
//extern int setting_test; //extern int setting_test;
void wait_user(void); void wait_user(void);
void calibrate(void); void calibrate(void);
float to_dBm(float);
enum { enum {
M_OFF, M_IMD, M_OIP3, M_PHASE_NOISE, M_STOP_BAND, M_PASS_BAND, M_LINEARITY M_OFF, M_IMD, M_OIP3, M_PHASE_NOISE, M_STOP_BAND, M_PASS_BAND, M_LINEARITY

@ -457,10 +457,10 @@ value(const float v)
switch(setting.unit) switch(setting.unit)
{ {
case U_DBMV: case U_DBMV:
return v+ 30.0 + 20.0*log10(sqrt(50)); return v + 30.0 + 20.0*log10(sqrt(50));
break; break;
case U_DBUV: case U_DBUV:
return v+ 90.0 + 20.0*log10(sqrt(50.0)); return v + 90.0 + 20.0*log10(sqrt(50.0));
break; break;
case U_MVOLT: case U_MVOLT:
return pow(10, (v-30.0)/20.0) * sqrt(50.0) * 1000.0; 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_ #ifdef __VNA_

@ -217,10 +217,22 @@ void set_IF(int f)
void set_unit(int u) 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); set_scale(10);
} }
setting.unit = u;
dirty = true; dirty = true;
} }

@ -423,7 +423,7 @@ static const char * const keypad_mode_label[] = {
static const char * const keypad_mode_label[] = { static const char * const keypad_mode_label[] = {
"error", "START", "STOP", "CENTER", "SPAN", "FREQ", "REFPOS", "SCALE", // 0-7 "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 "\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 #endif
@ -1843,7 +1843,7 @@ set_numeric_value(void)
set_sweep_time(uistat.value); set_sweep_time(uistat.value);
break; break;
case KM_TRIGGER: case KM_TRIGGER:
set_trigger_level(uistat.value); set_trigger_level(to_dBm(uistat.value));
break; break;
} }
} }

Loading…
Cancel
Save

Powered by TurnKey Linux.