diff --git a/nanovna.h b/nanovna.h index 3cfbc4e..efc8093 100644 --- a/nanovna.h +++ b/nanovna.h @@ -193,7 +193,7 @@ void set_step_delay(int t); void set_repeat(int); void set_level_sweep(float); void set_level(float); -void set_sweep_time(float); +void set_sweep_time_us(uint32_t); //extern int setting.repeat; //extern int setting.rbw; #ifdef __SPUR__ @@ -610,8 +610,8 @@ typedef struct setting int linearity_step; float level; float level_sweep; - float sweep_time; - float actual_sweep_time; + uint32_t sweep_time_us; + uint32_t actual_sweep_time_us; int test_argument; int auto_IF; unsigned int unit_scale_index; @@ -631,12 +631,16 @@ void reset_settings(int m); enum { S_OFF=0, S_ON=1, S_AUTO_OFF=2, S_AUTO_ON=3 }; #ifdef __FAST_SWEEP__ -#define MINIMUM_SWEEP_TIME 3 // Minimum sweep time on zero span in miliseconds +#define MINIMUM_SWEEP_TIME 3000U // Minimum sweep time on zero span in uS #else -#define MINIMUM_SWEEP_TIME 15 // Minimum sweep time on zero span in miliseconds +#define MINIMUM_SWEEP_TIME 15000U // Minimum sweep time on zero span in uS #endif -#define REPEAT_TIME 134.0 // Time per extra repeat in uS -#define MEASURE_TIME 175.0 // Time per vbwstep without stepdelay in uS +#define MAXIMUM_SWEEP_TIME 6000000U // Maximum sweep time uS +#define ONE_SECOND_TIME 1000000U // One second uS +#define ONE_MS_TIME 1000U // One ms uS + +#define REPEAT_TIME 134 // Time per extra repeat in uS +#define MEASURE_TIME 175 // Time per vbwstep without stepdelay in uS extern uint32_t frequencies[POINTS_COUNT]; extern const float unit_scale_value[]; @@ -708,7 +712,7 @@ typedef struct properties { //sizeof(properties_t) == 0x1200 -#define CONFIG_MAGIC 0x434f4e45 /* 'CONF' */ +#define CONFIG_MAGIC 0x434f4e46 /* 'CONF' */ extern int16_t lastsaveid; //extern properties_t *active_props; @@ -877,7 +881,7 @@ void self_test(int); void wait_user(void); void calibrate(void); float to_dBm(float); -float calc_min_sweep_time(void); +uint32_t calc_min_sweep_time_us(void); extern float actual_rbw; enum { diff --git a/plot.c b/plot.c index b7b997e..bdf6515 100644 --- a/plot.c +++ b/plot.c @@ -118,8 +118,7 @@ void update_grid(void) uint32_t grid; if (fspan == 0) { - fspan = setting.actual_sweep_time; // Time in mS - fspan *= 1000; + fspan = setting.actual_sweep_time_us; // Time in uS fstart = 0; } @@ -861,17 +860,17 @@ static void trace_get_value_string( dfreq = frequencies[i]; } if (FREQ_IS_CW()) { - float t = ii*(setting.actual_sweep_time)*1000.0/290.0; + float t = ii*(setting.actual_sweep_time_us)/(sweep_points - 1); #if 1 - plot_printf(&buf2[1], sizeof(buf2) -1, "%.3Fs" , t/1000000.0); + plot_printf(&buf2[1], sizeof(buf2) -1, "%.3Fs" , t/ONE_SECOND_TIME); #else - if (t>1000000.0){ - plot_printf(&buf2[1], sizeof(buf2) -1, "%4f" , t/1000000.0); + if (t>ONE_SECOND_TIME){ + plot_printf(&buf2[1], sizeof(buf2) -1, "%4f" , t/ONE_SECOND_TIME); buf2[5] = 'S'; buf2[6]=0; } else if (t>1000.0) { - plot_printf(&buf2[1], sizeof(buf2) -1, "%4f" , t/1000.0); + plot_printf(&buf2[1], sizeof(buf2) -1, "%4f" , t/ONE_MS_TIME); buf2[5] = 'm'; buf2[6] = 'S'; buf2[7]=0; @@ -2067,11 +2066,11 @@ draw_frequencies(void) if (FREQ_IS_CW()) { plot_printf(buf1, sizeof(buf1), " CW %qHz", get_sweep_frequency(ST_CW)); - float t = calc_min_sweep_time(); // Calc minimum sweep time - if (t < setting.sweep_time) - t = setting.sweep_time; - setting.actual_sweep_time = t; - plot_printf(buf2, sizeof(buf2), " TIME %.3Fs",t/1000.0); + uint32_t t = calc_min_sweep_time_us(); // Calc minimum sweep time + if (t < setting.sweep_time_us) + t = setting.sweep_time_us; + setting.actual_sweep_time_us = t; + plot_printf(buf2, sizeof(buf2), " TIME %.3Fs", (float)t/ONE_SECOND_TIME); } else if (FREQ_IS_STARTSTOP()) { plot_printf(buf1, sizeof(buf1), " START %qHz", get_sweep_frequency(ST_START)); diff --git a/sa_cmd.c b/sa_cmd.c index 2130e29..4b45ea6 100644 --- a/sa_cmd.c +++ b/sa_cmd.c @@ -155,11 +155,11 @@ VNA_SHELL_FUNCTION(cmd_level) VNA_SHELL_FUNCTION(cmd_sweeptime) { if (argc != 1) { - shell_printf("usage: sweeptime 0.03..600\r\n"); + shell_printf("usage: sweeptime 0.003..60\r\n"); return; } float f = my_atof(argv[0]); - set_sweep_time(f*1000.0); + set_sweep_time_us(f*ONE_SECOND_TIME); } diff --git a/sa_core.c b/sa_core.c index e30a510..ca75ee1 100644 --- a/sa_core.c +++ b/sa_core.c @@ -105,7 +105,7 @@ void reset_settings(int m) set_sweep_frequency(ST_START, (uint32_t) 0); set_sweep_frequency(ST_STOP, (uint32_t) 350000000); setting.attenuate = 30.0; - setting.sweep_time = 0; + setting.sweep_time_us = 0; break; #ifdef __ULTRA__ case M_ULTRA: @@ -114,7 +114,7 @@ void reset_settings(int m) set_sweep_frequency(ST_START, (uint32_t) minFreq); set_sweep_frequency(ST_STOP, (uint32_t) maxFreq); setting.attenuate = 0; - setting.sweep_time = 0.0; + setting.sweep_time_us = 0; break; #endif case M_GENLOW: @@ -123,7 +123,7 @@ void reset_settings(int m) maxFreq = 520000000; set_sweep_frequency(ST_CENTER, 10000000); set_sweep_frequency(ST_SPAN, 0); - setting.sweep_time = 10000.0; + setting.sweep_time_us = 10*ONE_SECOND_TIME; break; case M_HIGH: #ifdef __ULTRA_SA__ @@ -135,7 +135,7 @@ void reset_settings(int m) #endif set_sweep_frequency(ST_START, minFreq); set_sweep_frequency(ST_STOP, maxFreq); - setting.sweep_time = 0; + setting.sweep_time_us = 0; break; case M_GENHIGH: setting.drive=8; @@ -143,7 +143,7 @@ void reset_settings(int m) maxFreq = 960000000; set_sweep_frequency(ST_CENTER, 300000000); set_sweep_frequency(ST_SPAN, 0); - setting.sweep_time = 10000.0; + setting.sweep_time_us = 10*ONE_SECOND_TIME; break; } for (int i = 0; i< MARKERS_MAX; i++) { @@ -156,19 +156,19 @@ void reset_settings(int m) dirty = true; } -float calc_min_sweep_time(void) // Calculate minimum sweep time in mS +uint32_t calc_min_sweep_time_us(void) // Calculate minimum sweep time in uS { float t; - float a = (actualStepDelay + MEASURE_TIME)/1000.0; // in mS + float a = (actualStepDelay + MEASURE_TIME); // in uS if (MODE_OUTPUT(setting.mode)) t = 100; else { if (FREQ_IS_CW()) { - a = (float)MINIMUM_SWEEP_TIME / 290.0; // time per step in CW mode - if (setting.repeat != 1 || setting.sweep_time >= 1000 || setting.spur != 0) - a = 15.0 / 290.0; // time per step in CW mode with repeat + a = MINIMUM_SWEEP_TIME / (sweep_points - 1); // time per step in CW mode + if (setting.repeat != 1 || setting.sweep_time_us >= ONE_SECOND_TIME || setting.spur != 0) + a = 15000.0 / (sweep_points - 1); // time per step in CW mode with repeat } - t = vbwSteps * sweep_points * (setting.spur ? 2 : 1) * ( (a + (setting.repeat - 1)* REPEAT_TIME/1000.0)); + t = vbwSteps * (sweep_points - 1) * (setting.spur ? 2 : 1) * ( (a + (setting.repeat - 1)* REPEAT_TIME)); } return t; } @@ -221,17 +221,17 @@ void set_level_sweep(float l) dirty = true; } -void set_sweep_time(float t) +void set_sweep_time_us(uint32_t t) { if (t < MINIMUM_SWEEP_TIME) t = MINIMUM_SWEEP_TIME; - if (t > 600000.0) - t = 600000.0; - setting.sweep_time = t; - float ta = calc_min_sweep_time(); + if (t > MAXIMUM_SWEEP_TIME) + t = MAXIMUM_SWEEP_TIME; + setting.sweep_time_us = t; + uint32_t ta = calc_min_sweep_time_us(); if (ta < t) ta = t; - setting.actual_sweep_time = ta; + setting.actual_sweep_time_us = ta; if (FREQ_IS_CW()) update_grid(); // Really only needed in zero span mode redraw_request |= REDRAW_FREQUENCY; @@ -1449,7 +1449,7 @@ float perform(bool break_on_operation, int i, uint32_t f, int tracking) skip_LO_setting: #ifdef __FAST_SWEEP__ - if (i == 0 && setting.frequency_step == 0 && setting.trigger == T_AUTO && setting.spur == 0 && actualStepDelay == 0 && setting.repeat == 1 && setting.sweep_time < 1000) { + if (i == 0 && setting.frequency_step == 0 && setting.trigger == T_AUTO && setting.spur == 0 && actualStepDelay == 0 && setting.repeat == 1 && setting.sweep_time_us < ONE_SECOND_TIME) { SI4432_Fill(MODE_SELECT(setting.mode), 0); } #endif @@ -1486,7 +1486,7 @@ float perform(bool break_on_operation, int i, uint32_t f, int tracking) if (subRSSI < setting.trigger_level) goto wait; #ifdef __FAST_SWEEP__ - if (i == 0 && setting.frequency_step == 0 /* && setting.trigger == T_AUTO */&& setting.spur == 0 && old_actual_step_delay == 0 && setting.repeat == 1 && setting.sweep_time < 1000) { + if (i == 0 && setting.frequency_step == 0 /* && setting.trigger == T_AUTO */&& setting.spur == 0 && old_actual_step_delay == 0 && setting.repeat == 1 && setting.sweep_time_us < ONE_SECOND_TIME) { SI4432_Fill(MODE_SELECT(setting.mode), 1); } #endif @@ -1542,26 +1542,29 @@ again: repeats = 1000; // to avoid interrupting the tone during UI processing modulation_counter = 0; } - float t = setting.sweep_time - calc_min_sweep_time(); // Time to delay in mS - if (t < 0) + uint32_t t = calc_min_sweep_time_us(); // Time to delay in uS + if (t < setting.sweep_time_us){ + t = setting.sweep_time_us - t; + t = t / (sweep_points - 1); // Now in uS per point + } + else t = 0; - t = t * 1000 / 290.0; // Now in uS per point if (MODE_OUTPUT(setting.mode) && t < 500) // Minimum wait time to prevent LO from lockup t = 500; while (repeats--) { for (int i = 0; i < sweep_points; i++) { RSSI = perform(break_on_operation, i, frequencies[i], setting.tracking); - if (MODE_INPUT(setting.mode) || setting.modulation == MO_NONE) { - if (t < 30000) - my_microsecond_delay((int)t); + if (t && (MODE_INPUT(setting.mode) || setting.modulation == MO_NONE)) { + if (t < 30*ONE_MS_TIME) + my_microsecond_delay(t); else - osalThreadSleepMilliseconds(((int)t)/1000); + osalThreadSleepMilliseconds(t / ONE_MS_TIME); } // back to toplevel to handle ui operation if ((operation_requested || shell_function) && break_on_operation) { - if (setting.actual_sweep_time > 1000) { + if (setting.actual_sweep_time_us > ONE_SECOND_TIME) { ili9341_fill(OFFSETX, HEIGHT_NOSCROLL+1, WIDTH, 1, 0); } @@ -1572,7 +1575,7 @@ again: } if (MODE_INPUT(setting.mode)) { - if (setting.actual_sweep_time > 1000 && (i & 0x07) == 0) { + if (setting.actual_sweep_time_us > ONE_SECOND_TIME && (i & 0x07) == 0) { ili9341_fill(OFFSETX, HEIGHT_NOSCROLL+1, i, 1, BRIGHT_COLOR_GREEN); ili9341_fill(OFFSETX+i, HEIGHT_NOSCROLL+1, WIDTH-i, 1, 0); } @@ -1852,7 +1855,7 @@ again: // redraw_marker(peak_marker, FALSE); // STOP_PROFILE; - if (setting.actual_sweep_time > 1000) { + if (setting.actual_sweep_time_us > ONE_SECOND_TIME) { ili9341_fill(OFFSETX, HEIGHT_NOSCROLL+1, WIDTH, 1, 0); } @@ -2177,11 +2180,11 @@ void draw_cal_status(void) ili9341_drawstring("Scan:", x, y); y += YSTEP; - float t = calc_min_sweep_time(); - if (t < setting.sweep_time) - t = setting.sweep_time; - setting.actual_sweep_time = t; - plot_printf(buf, BLEN, "%.3FS", t/1000.0); + uint32_t t = calc_min_sweep_time_us(); + if (t < setting.sweep_time_us) + t = setting.sweep_time_us; + setting.actual_sweep_time_us = t; + plot_printf(buf, BLEN, "%.3FS", (float)t/ONE_SECOND_TIME); ili9341_drawstring(buf, x, y); // Cal output diff --git a/si4432.c b/si4432.c index 52f7817..2951315 100644 --- a/si4432.c +++ b/si4432.c @@ -395,8 +395,14 @@ void SI4432_Fill(int s, int start) { SI4432_Sel = s; int sel = SI_nSEL[SI4432_Sel]; - float t = setting.sweep_time - calc_min_sweep_time(); // Time to delay in mS for all sweep - uint32_t ti = t < 0 ? 0 : t * 1000 / (sweep_points - 1); // Now in uS per point if (t < 30000) + uint32_t t = calc_min_sweep_time_us(); // Time to delay in uS for all sweep + if (t < setting.sweep_time_us){ + t = setting.sweep_time_us - t; + t = t / (sweep_points - 1); // Now in uS per point + } + else + t = 0; + SPI2_CLK_LOW; int i = 0; do { @@ -405,8 +411,8 @@ void SI4432_Fill(int s, int start) age[i]=(char)shiftIn(); palSetPad(GPIOC, sel); if (++i >= sweep_points) break; - if (ti) - my_microsecond_delay(ti); + if (t) + my_microsecond_delay(t); } while(1); buf_index = start; buf_read = true; diff --git a/ui.c b/ui.c index 3477350..a976a46 100644 --- a/ui.c +++ b/ui.c @@ -1982,7 +1982,7 @@ lever_zoom_span(int status) static void lever_zoom_time(int status) { - uint32_t time = setting.sweep_time; // in mS + uint32_t time = setting.sweep_time_us; // in uS if (time < MINIMUM_SWEEP_TIME) time = MINIMUM_SWEEP_TIME; if (status & EVT_UP) { @@ -1991,7 +1991,7 @@ lever_zoom_time(int status) time = time*25/10; } time = step_round(time); - set_sweep_time(time); + set_sweep_time_us(time); } static void diff --git a/ui_sa.c b/ui_sa.c index 6f3e7ff..37d7f92 100644 --- a/ui_sa.c +++ b/ui_sa.c @@ -1832,11 +1832,11 @@ static void fetch_numeric_target(void) plot_printf(uistat.text, sizeof uistat.text, "%.1fdB", uistat.value); break; case KM_SWEEP_TIME: - if (setting.sweep_time < calc_min_sweep_time()) - uistat.value = calc_min_sweep_time(); + if (setting.sweep_time_us < calc_min_sweep_time_us()) + uistat.value = calc_min_sweep_time_us(); else - uistat.value = setting.sweep_time; - uistat.value /= 1000.0; + uistat.value = setting.sweep_time_us; + uistat.value /= (float)ONE_SECOND_TIME; plot_printf(uistat.text, sizeof uistat.text, "%.3FS", uistat.value); break; case KM_TRIGGER: @@ -1925,7 +1925,7 @@ set_numeric_value(void) set_level_sweep(uistat.value); break; case KM_SWEEP_TIME: - set_sweep_time(uistat.value*1000.0); + set_sweep_time_us(uistat.value*ONE_SECOND_TIME); update_grid(); break; case KM_TRIGGER: