From 09c45187636cd314df6bac8377cbaa93ad61f23a Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Wed, 21 Sep 2022 00:15:49 +0300 Subject: [PATCH] add full range to MLX --- MLX90640_OrangePi/main.c | 52 +++++++-- MLX90640_OrangePi/mlx | Bin 21664 -> 21576 bytes MLX90640_OrangePi/mlx90640.c | 186 ++++++++++++++++++++++-------- MLX90640_OrangePi/mlx90640.h | 1 + MLX90640_OrangePi/mlx90640_regs.h | 10 ++ 5 files changed, 192 insertions(+), 57 deletions(-) diff --git a/MLX90640_OrangePi/main.c b/MLX90640_OrangePi/main.c index 47a425d..f4fc2bc 100644 --- a/MLX90640_OrangePi/main.c +++ b/MLX90640_OrangePi/main.c @@ -39,7 +39,15 @@ void signals(int sig){ exit(sig); } - +static double image[MLX_PIXNO]; +static double image2[MLX_PIXNO]; +static void pushima(const double *img){ + for(int i = 0; i < MLX_PIXNO; ++i){ + double val = *img++; + image[i] += val; + image2[i] += val*val; + } +} int main (int argc, char **argv){ initial_setup(); @@ -50,16 +58,38 @@ int main (int argc, char **argv){ if(GP->logfile) OPENLOG(GP->logfile, LOGLEVEL_ANY, 1); if(!mlx90640_init(GP->device, DEVICE_ID)) ERR("Can't open device"); - double *ima = NULL; - if(!mlx90640_take_image(0, &ima) || !ima) ERRX("Can't take image"); - // mlx90640_dump_parameters(); - double *ptr = ima; - green("Image:\n"); - for(int row = 0; row < MLX_H; ++row){ - for(int col = 0; col < MLX_W; ++col){ - printf("%5.1f ", *ptr++); + //mlx90640_dump_parameters(); +#define N 9 + double T0 = dtime(); + uint8_t simple = 2; + //for(uint8_t simple = 0; simple < 3; ++simple){ + memset(image, 0, sizeof(image)); + memset(image2, 0, sizeof(image)); + for(int i = 0; i < N; ++i){ + double *ima = NULL; + if(!mlx90640_take_image(simple, &ima) || !ima) ERRX("Can't take image"); + pushima(ima); + printf("Got image %d, T=%g\n", i, dtime() - T0); } - printf("\n"); - } + double *im = image, *im2 = image2; + green("\nImage (simple=%d):\n", simple); + for(int row = 0; row < MLX_H; ++row){ + for(int col = 0; col < MLX_W; ++col){ + double v = *im++, v2 = *im2; + v /= N; v2 /= N; + printf("%5.1f ", v); + *im2++ = v2 - v*v; + } + printf("\n"); + } + green("\nRMS:\n"); + im2 = image2; + for(int row = 0; row < MLX_H; ++row){ + for(int col = 0; col < MLX_W; ++col){ + printf("%5.1f ", *im2++); + } + printf("\n"); + } + //} return 0; } diff --git a/MLX90640_OrangePi/mlx b/MLX90640_OrangePi/mlx index fe423f413e8a49b5d83b1f6d202f3e18ace47429..4d751ef87023301cfb297e9b2be4ba6b71e09e90 100755 GIT binary patch literal 21576 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 MLX_MAXERR_COUNT){ DBG("-> M_ERROR"); return FALSE;}else continue;}while(0) +#define chktmout() do{DBG("chktmout, T=%g", dtime()-Tlast); if(dtime() - Tlast > MLX_TIMEOUT){ DBG("Timeout! -> M_ERROR"); return FALSE;}else continue;}while(0) + + // read register value static int read_reg(uint16_t regaddr, uint16_t *data){ if(I2Cfd < 1) return FALSE; @@ -66,6 +73,55 @@ static int read_reg(uint16_t regaddr, uint16_t *data){ return TRUE; } + +//#if 0 + // Sometimes don't work :( +// read N values starting from regaddr +static int read_regN(uint16_t regaddr, uint16_t *data, uint16_t N){ + if(I2Cfd < 1 || N > 128 || N == 0) return FALSE; + struct i2c_msg m[2]; + struct i2c_rdwr_ioctl_data x = {.msgs = m, .nmsgs = 2}; + m[0].addr = lastaddr; m[1].addr = lastaddr; + m[0].flags = 0; + m[1].flags = I2C_M_RD; + m[0].len = 2; m[1].len = N * 2; + uint8_t a[2], d[256] = {0}; + a[0] = regaddr >> 8; + a[1] = regaddr & 0xff; + m[0].buf = a; m[1].buf = d; + if(ioctl(I2Cfd, I2C_RDWR, &x) < 0) return FALSE; + if(data) for(int i = 0; i < N; ++i){ + *data++ = (uint16_t)((d[2*i] << 8) | (d[2*i + 1])); + } + return TRUE; +} + +// blocking read N uint16_t values starting from `reg` +// @param reg - register to read +// @param N (io) - amount of bytes to read / bytes read +// @return `dataarray` or NULL if failed +static uint16_t *read_data(uint16_t reg, uint16_t *N){ + if(I2Cfd < 1 || !N || *N < 1) return NULL; + uint16_t n = *N; + if(n < 1 || n > MLX_DMA_MAXLEN) return NULL; + uint16_t *data = dataarray; + uint16_t got = 0, rest = *N; + do{ + uint8_t l = (rest > 128) ? 128 : (uint8_t)rest; + if(!read_regN(reg, data, l)){ + DBG("can't read"); + break; + } + rest -= l; + reg += l; + data += l; + got += l; + }while(rest); + *N = got; + return dataarray; +} +//#endif +#if 0 // blocking read N uint16_t values starting from `reg` // @param reg - register to read // @param N (io) - amount of bytes to read / bytes read @@ -84,6 +140,8 @@ static uint16_t *read_data(uint16_t reg, uint16_t *N){ *N = i; return dataarray; } +#endif + // write register value static int write_reg(uint16_t regaddr, uint16_t data){ @@ -109,15 +167,6 @@ int mlx90640_set_slave_address(uint8_t addr){ return TRUE; } -int mlx90640_init(const char *dev, uint8_t ID){ - if(I2Cfd > 0) close(I2Cfd); - I2Cfd = open(dev, O_RDWR); - if(I2Cfd < 1) return FALSE; - if(!mlx90640_set_slave_address(ID)) return FALSE; - if(!read_reg(0, NULL)) return FALSE; - return TRUE; -} - static void dumpIma(double *im){ for(int row = 0; row < MLX_H; ++row){ for(int col = 0; col < MLX_W; ++col){ @@ -139,6 +188,14 @@ void mlx90640_dump_parameters(){ printf("kv[]={"); for(int i = 0; i < 4; ++i) printf("%s%g", (i) ? ", " : "", params.kv[i]); printf("}\n"); printf("cpAlpha[]={%g, %g}\n", params.cpAlpha[0], params.cpAlpha[1]); printf("cpOffset[]={%d, %d}\n", params.cpOffset[0], params.cpOffset[1]); + printf("outliers[]=\n"); + uint8_t *o = params.outliers; + for(int row = 0; row < MLX_H; ++row){ + for(int col = 0; col < MLX_W; ++col){ + printf("%d ", *o++); + } + printf("\n"); + } } /***************************************************************************** @@ -222,6 +279,7 @@ static int get_parameters(){ accRemScale = 1<<(val & 0x0f); pu16 = &CREG_VAL(REG_OFFAK1); double *kta = params.kta, *offset = params.offset; + uint8_t *ol = params.outliers; for(int row = 0; row < MLX_H; ++row){ int idx = (row&1)<<1; for(int col = 0; col < MLX_W; ++col){ @@ -239,6 +297,7 @@ static int get_parameters(){ if(i16 > 0x1F) i16 -= 0x40; double oft = (double)a_r + accRow[row]*accRowScale + accColumn[col]*accColumnScale +i16*accRemScale; *a++ = oft / diva; + *ol++ = (rv&1) ? 1 : 0; } } scale1 = (CREG_VAL(REG_KTAVSCALE) >> 8) & 0xF; // kvscale @@ -281,16 +340,23 @@ static int get_parameters(){ i8 = (int8_t)(CREG_VAL(REG_KSTATGC) >> 8); params.KsTa = (double)i8/(1<<13); div = 1<<((CREG_VAL(REG_CT34) & 0x0F) + 8); // kstoscale + DBG("kstoscale=%g (regct34=0x%04x)", div, CREG_VAL(REG_CT34)); val = CREG_VAL(REG_KSTO12); + DBG("ksto12=0x%04x", val); i8 = (int8_t)(val & 0xFF); - params.ksTo[0] = 273.15 * i8 / div; + DBG("To1ee=%d", i8); + params.ksTo[0] = i8 / div; i8 = (int8_t)(val >> 8); - params.ksTo[1] = 273.15 * i8 / div; + DBG("To2ee=%d", i8); + params.ksTo[1] = i8 / div; val = CREG_VAL(REG_KSTO34); + DBG("ksto34=0x%04x", val); i8 = (int8_t)(val & 0xFF); - params.ksTo[2] = 273.15 * i8 / div; + DBG("To3ee=%d", i8); + params.ksTo[2] = i8 / div; i8 = (int8_t)(val >> 8); - params.ksTo[3] = 273.15 * i8 / div; + DBG("To4ee=%d", i8); + params.ksTo[3] = i8 / div; params.CT[0] = 0.; // 0degr - between ranges 1 and 2 val = CREG_VAL(REG_CT34); mul = ((val & 0x3000)>>12)*10.; // step @@ -306,9 +372,14 @@ static int get_parameters(){ /** * @brief process_subpage - calculate all parameters from `dataarray` into `mlx_image` + * @param subpageno - number of subpage + * @param simpleimage == 0 - simplest, 1 - narrow range, 2 - extended range */ static void process_subpage(int subpageno, int simpleimage){ - DBG("process_subpage(%d)", subpageno); + DBG("\nprocess_subpage(%d)", subpageno); +#ifdef EBUG + chstate(); +#endif int16_t i16a = (int16_t)IMD_VAL(REG_IVDDPIX); double dvdd = i16a - params.vdd25; dvdd = dvdd / params.kVdd; @@ -334,7 +405,7 @@ static void process_subpage(int subpageno, int simpleimage){ curval -= params.offset[pixno] * (1. + params.kta[pixno]*dTa) * (1. + params.kv[idx|(col&1)]*dvdd); // add offset double IRcompens = curval; // IR_compensated - if(simpleimage){ + if(simpleimage == 0){ curval -= params.cpOffset[subpageno] * (1. - params.cpKta * dTa) * (1. + params.cpKv * dvdd); // CP curval = IRcompens - params.tgc * curval; // IR gradient compens @@ -347,21 +418,29 @@ static void process_subpage(int subpageno, int simpleimage){ double ac3 = alphaComp*alphaComp*alphaComp; double Sx = ac3*IRcompens + alphaComp*ac3*Tar; Sx = params.KsTa * sqrt(sqrt(Sx)); - double To = IRcompens / (alphaComp * (1. - params.ksTo[1]) + Sx) + Tar; + double To = IRcompens / (alphaComp * (1. - 273.15*params.ksTo[1]) + Sx) + Tar; curval = sqrt(sqrt(To)) - 273.15; // To - // TODO: extended + // extended range + if(simpleimage == 2){ + int idx = 0; // range 1 by default + double ctx = -40.; + if(curval > params.CT[0] && curval < params.CT[1]){ // range 2 + idx = 1; ctx = params.CT[0]; + }else if(curval < params.CT[2]){ // range 3 + idx = 2; ctx = params.CT[1]; + }else{ // range 4 + idx = 3; ctx = params.CT[2]; + } + To = IRcompens / (alphaComp * params.alphacorr[idx] * (1. + params.ksTo[idx]*(curval - ctx))) + Tar; + curval = sqrt(sqrt(To)) - 273.15; + } } mlx_image[pixno] = curval; } } + DBG("Time: %g", dtime()-Tlast); } -static int errctr = 0; -static double Tlast = 0.; -#define chstate() do{errctr = 0; Tlast = dtime(); }while(0) -#define chkerr() do{if(++errctr > MLX_MAXERR_COUNT){ DBG("-> M_ERROR"); return FALSE;}else continue;}while(0) -#define chktmout() do{if(dtime() - Tlast > MLX_TIMEOUT){ DBG("Timeout! -> M_ERROR"); return FALSE;}else continue;}while(0) - static int process_readconf(){ chstate(); while(1){ @@ -371,15 +450,19 @@ static int process_readconf(){ } static int process_firstrun(){ uint16_t reg, N; + write_reg(REG_CONTROL, REG_CONTROL_DEFAULT); + usleep(50); + write_reg(REG_CONTROL, REG_CONTROL_DEFAULT); + usleep(50); chstate(); while(1){ if(write_reg(REG_CONTROL, reg_control_val[0]) && read_reg(REG_CONTROL, ®)){ - DBG("REG_CTRL=0x%04x", reg); + DBG("REG_CTRL=0x%04x, T=%g", reg, dtime()-Tlast); if(read_reg(REG_STATUS, ®)) DBG("REG_STATUS=0x%04x", reg); N = REG_CALIDATA_LEN; if(read_data(REG_CALIDATA, &N)){ - DBG("-> M_READCONF"); + DBG("-> M_READCONF, T=%g", dtime()-Tlast); return process_readconf(); }else chkerr(); }else chkerr(); @@ -389,29 +472,32 @@ static int process_firstrun(){ // start image acquiring for next subpage static int process_startima(int subpageno){ chstate(); - DBG("startima()"); + DBG("startima(%d)", subpageno); uint16_t reg, N; while(1){ // write `overwrite` flag twice if(!write_reg(REG_CONTROL, reg_control_val[subpageno]) || !write_reg(REG_STATUS, REG_STATUS_OVWEN) || !write_reg(REG_STATUS, REG_STATUS_OVWEN)) chkerr(); - if(read_reg(REG_STATUS, ®)){ - if(reg & REG_STATUS_NEWDATA){ - if(subpageno != (reg & REG_STATUS_SPNO)){ - DBG("wrong subpage number -> M_ERROR"); - return FALSE; - }else{ // all OK, run image reading - chstate(); - write_reg(REG_STATUS, 0); // clear rdy bit - N = MLX_PIXARRSZ; - if(read_data(REG_IMAGEDATA, &N)){ - DBG("-> M_READOUT, N=%u", N); - return TRUE; - }else chkerr(); - } - }else chktmout(); - }else chkerr(); + while(1){ + if(read_reg(REG_STATUS, ®)){ + if(reg & REG_STATUS_NEWDATA){ + DBG("got newdata: %g", dtime() - Tlast); + if(subpageno != (reg & REG_STATUS_SPNO)){ + DBG("wrong subpage number -> M_ERROR"); + return FALSE; + }else{ // all OK, run image reading + chstate(); + write_reg(REG_STATUS, 0); // clear rdy bit + N = MLX_PIXARRSZ; + if(read_data(REG_IMAGEDATA, &N) && N == MLX_PIXARRSZ){ + DBG("got readoutm N=%d: %g", N, dtime() - Tlast); + return TRUE; + }else chkerr(); + } + }else chktmout(); + }else chkerr(); + } } return FALSE; } @@ -428,8 +514,7 @@ int mlx90640_take_image(uint8_t simple, double **image){ if(params.kVdd == 0){ // no parameters -> make first run if(!process_firstrun()) return FALSE; } - //subpageno = 0; - DBG("-> M_STARTIMA"); + DBG("\n\n\n-> M_STARTIMA"); for(int sp = 0; sp < 2; ++sp){ if(!process_startima(sp)) return FALSE; // get first subpage process_subpage(sp, simple); @@ -438,4 +523,13 @@ int mlx90640_take_image(uint8_t simple, double **image){ return TRUE; } +int mlx90640_init(const char *dev, uint8_t ID){ + if(I2Cfd > 0) close(I2Cfd); + I2Cfd = open(dev, O_RDWR); + if(I2Cfd < 1) return FALSE; + if(!mlx90640_set_slave_address(ID)) return FALSE; + if(!read_reg(0, NULL)) return FALSE; + if(!process_firstrun()) return FALSE; + return TRUE; +} diff --git a/MLX90640_OrangePi/mlx90640.h b/MLX90640_OrangePi/mlx90640.h index f8daa99..e906462 100644 --- a/MLX90640_OrangePi/mlx90640.h +++ b/MLX90640_OrangePi/mlx90640.h @@ -57,6 +57,7 @@ typedef struct{ double kv[4]; // full - with scale; 0 - odd row, odd col; 1 - odd row even col; 2 - even row, odd col; 3 - even row, even col double cpAlpha[2]; // alpha_CP_subpage 0 and 1 int16_t cpOffset[2]; + uint8_t outliers[MLX_PIXNO]; // outliers - bad pixels (if == 1) } MLX90640_params; // default I2C address diff --git a/MLX90640_OrangePi/mlx90640_regs.h b/MLX90640_OrangePi/mlx90640_regs.h index 71d1ad9..d5b657c 100644 --- a/MLX90640_OrangePi/mlx90640_regs.h +++ b/MLX90640_OrangePi/mlx90640_regs.h @@ -27,13 +27,23 @@ #define REG_CONTROL_CHESS (1<<12) #define REG_CONTROL_RES18 (2<<10) #define REG_CONTROL_RESMASK (3<<10) +#define REG_CONTROL_REFR_05HZ (0<<7) +#define REG_CONTROL_REFR_1HZ (1<<7) #define REG_CONTROL_REFR_2HZ (2<<7) +#define REG_CONTROL_REFR_4HZ (3<<7) +#define REG_CONTROL_REFR_8HZ (4<<7) +#define REG_CONTROL_REFR_16HZ (5<<7) +#define REG_CONTROL_REFR_32HZ (6<<7) +#define REG_CONTROL_REFR_64HZ (7<<7) #define REG_CONTROL_SUBP1 (1<<4) #define REG_CONTROL_SUBPMASK (3<<4) #define REG_CONTROL_SUBPSEL (1<<3) #define REG_CONTROL_DATAHOLD (1<<2) #define REG_CONTROL_SUBPEN (1<<0) +// default value +#define REG_CONTROL_DEFAULT (REG_CONTROL_CHESS|REG_CONTROL_RES18|REG_CONTROL_REFR_2HZ|REG_CONTROL_SUBPEN) + // calibration data start & len #define REG_CALIDATA 0x2410 #define REG_CALIDATA_LEN 816