From 9dda579abe6ef898d89b6f08d2bdf087fd02b0a5 Mon Sep 17 00:00:00 2001 From: TT Date: Fri, 14 Oct 2016 21:47:00 +0900 Subject: [PATCH] add preliminaly calibration --- ili9431.c | 45 ++++++++++++++++++++++++++++++++++++++----- main.c | 57 ++++++++++++++++++++++++++++++++++++++++++------------- nanovna.h | 17 +++++++++++++++++ 3 files changed, 101 insertions(+), 18 deletions(-) diff --git a/ili9431.c b/ili9431.c index becf696..6ece1b2 100644 --- a/ili9431.c +++ b/ili9431.c @@ -647,7 +647,8 @@ void sweep_tail() void cartesian_scale(float re, float im, int *xp, int *yp) { - float scale = 4e-3; + //float scale = 4e-3; + float scale = 4e-4; int x = WIDTH / 2 - re * scale; int y = HEIGHT / 2 + im * scale; if (x < 0) x = 0; @@ -786,21 +787,55 @@ force_set_markmap(void) void plot_into_index(float measured[101][2][2]) { int i, t; + float coeff[2]; for (i = 0; i < 101; i++) { int x = i * (WIDTH-1) / (101-1); for (t = 0; t < TRACES_MAX; t++) { int n = t % 2; if (!trace[t].enabled) continue; + + coeff[0] = measured[i][n][0]; + coeff[1] = measured[i][n][1]; + if (cal_status & CALSTAT_APPLY) { + if (n == 0) { + float sq = cal_data[i][CAL_OPEN][0] * cal_data[i][CAL_OPEN][0] + + cal_data[i][CAL_OPEN][1] * cal_data[i][CAL_OPEN][1]; + sq /= 1e5; + float m0 = measured[i][n][0]; + float m1 = measured[i][n][1]; + if (cal_status & CALSTAT_LOAD) { + m0 -= cal_data[i][CAL_LOAD][0]; + m1 -= cal_data[i][CAL_LOAD][1]; + } + coeff[0] = (m0 * cal_data[i][CAL_OPEN][0] + + m1 * cal_data[i][CAL_OPEN][1]) / sq; + coeff[1] = (m1 * cal_data[i][CAL_OPEN][0] + - m0 * cal_data[i][CAL_OPEN][1]) / sq; + } else { + float sq = cal_data[i][CAL_THRU][0] * cal_data[i][CAL_THRU][0] + + cal_data[i][CAL_THRU][1] * cal_data[i][CAL_THRU][1]; + sq /= 1e5; + float m0 = measured[i][n][0]; + float m1 = measured[i][n][1]; + if (cal_status & CALSTAT_ISOLN) { + m0 -= cal_data[i][CAL_ISOLN][0]; + m1 -= cal_data[i][CAL_ISOLN][1]; + } + coeff[0] = (m0 * cal_data[i][CAL_THRU][0] + + m1 * cal_data[i][CAL_THRU][1]) / sq; + coeff[1] = (m1 * cal_data[i][CAL_THRU][0] + - m0 * cal_data[i][CAL_THRU][1]) / sq; + } + } + if (trace[t].polar) { int x1, y1; - cartesian_scale(measured[i][n][1], measured[i][n][0], &x1, &y1); + cartesian_scale(coeff[1], coeff[0], &x1, &y1); trace_index[t][i] = INDEX(x1, y1, i); - //mark_map(x1>>5, y1>>5); } else { - int y1 = logmag(measured[i][n]) * 29; + int y1 = logmag(coeff) * 29; trace_index[t][i] = INDEX(x, y1, i); - //mark_map(x>>5, y1>>5); } } } diff --git a/main.c b/main.c index 6423706..48730be 100644 --- a/main.c +++ b/main.c @@ -216,14 +216,8 @@ int16_t dsp_disabled = FALSE; float measured[101][2][2]; uint32_t frequencies[101]; -float caldata[101][5][2]; uint16_t cal_status; - -#define CAL_LOAD 0 -#define CAL_OPEN 1 -#define CAL_SHORT 2 -#define CAL_THRU 3 -#define CAL_ISOLN 4 +float cal_data[101][5][2]; @@ -468,13 +462,50 @@ static void cmd_cal(BaseSequentialStream *chp, int argc, char *argv[]) return; } - char *cmd = argv[1]; - int s; - if (strcmp(cmd, "load")) { - cal_status |= CAL_LOAD; - memcpy(caldata[CAL_LOAD], measured[0], sizeof measured[0]); - } + char *cmd = argv[0]; + int s, d, i; + if (strcmp(cmd, "load") == 0) { + cal_status |= CALSTAT_LOAD; + s = 0; + d = CAL_LOAD; + } else if (strcmp(cmd, "open") == 0) { + cal_status |= CALSTAT_OPEN; + s = 0; + d = CAL_OPEN; + } else if (strcmp(cmd, "short") == 0) { + cal_status |= CALSTAT_SHORT; + s = 0; + d = CAL_SHORT; + } else if (strcmp(cmd, "thru") == 0) { + cal_status |= CALSTAT_THRU; + s = 1; + d = CAL_THRU; + } else if (strcmp(cmd, "isoln") == 0) { + cal_status |= CALSTAT_ISOLN; + s = 1; + d = CAL_ISOLN; + } else if (strcmp(cmd, "done") == 0) { + cal_status |= CALSTAT_APPLY; + return; + } else if (strcmp(cmd, "reset") == 0) { + cal_status = 0; + return; + } else if (strcmp(cmd, "data") == 0) { + chprintf(chp, "%d %d\r\n", cal_data[0][CAL_LOAD][0], cal_data[0][CAL_LOAD][1]); + chprintf(chp, "%d %d\r\n", cal_data[0][CAL_OPEN][0], cal_data[0][CAL_OPEN][1]); + chprintf(chp, "%d %d\r\n", cal_data[0][CAL_SHORT][0], cal_data[0][CAL_SHORT][1]); + chprintf(chp, "%d %d\r\n", cal_data[0][CAL_THRU][0], cal_data[0][CAL_THRU][1]); + chprintf(chp, "%d %d\r\n", cal_data[0][CAL_ISOLN][0], cal_data[0][CAL_ISOLN][1]); + return; + } else { + chprintf(chp, "usage: cal {load|open|short|thru|isoln|done}\r\n"); + return; + } + for (i = 0; i < 101; i++) { + cal_data[i][d][0] = measured[i][s][0]; + cal_data[i][d][1] = measured[i][s][1]; + } } diff --git a/nanovna.h b/nanovna.h index 4a670a9..600ab8d 100644 --- a/nanovna.h +++ b/nanovna.h @@ -51,6 +51,23 @@ void sweep_tail(void); void redraw(void); void polar_plot(float measured[101][4]); +extern uint16_t cal_status; +extern float cal_data[101][5][2]; + +#define CAL_LOAD 0 +#define CAL_OPEN 1 +#define CAL_SHORT 2 +#define CAL_THRU 3 +#define CAL_ISOLN 4 + +#define CALSTAT_LOAD (1<<0) +#define CALSTAT_OPEN (1<<1) +#define CALSTAT_SHORT (1<<2) +#define CALSTAT_THRU (1<<3) +#define CALSTAT_ISOLN (1<<4) +#define CALSTAT_APPLY (1<<5) + + void plot_into_index(float measured[101][2][2]); void draw_cell_all(void);