Melexis MLX90620 and MLX90621, non-contact, 16x4 infrared array temperature sensor device driver.
MLX90620.cpp@2:82782c73251e, 2016-07-26 (annotated)
- Committer:
- loopsva
- Date:
- Tue Jul 26 19:52:23 2016 +0000
- Revision:
- 2:82782c73251e
- Parent:
- 1:fd536ebc7eaf
Fixes bug in DISCO_F746NG when reading MLX9062x EEPROM. The F746 has a 255 byte I2C limit. Any transfer larger, the buffer returns all 0xff. So, the MLX's EEPROM needs to be read 1 + 255 bytes in order to get all 256. A compiler flag is used.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
loopsva | 0:8c2ddd9801ca | 1 | //NOTE: "Step Measurement Mode" was removed from new MLX90620 data sheet, page 22 dated Sept 19 2012 |
loopsva | 0:8c2ddd9801ca | 2 | // which is used in this implementation |
loopsva | 0:8c2ddd9801ca | 3 | |
loopsva | 0:8c2ddd9801ca | 4 | #include "mbed.h" |
loopsva | 0:8c2ddd9801ca | 5 | #include "MLX90620.h" |
loopsva | 0:8c2ddd9801ca | 6 | |
loopsva | 1:fd536ebc7eaf | 7 | //for debugging purposes (uncomment) |
loopsva | 1:fd536ebc7eaf | 8 | //#define MLXTEST_621b 1 |
loopsva | 0:8c2ddd9801ca | 9 | |
loopsva | 0:8c2ddd9801ca | 10 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 1:fd536ebc7eaf | 11 | // Original Constructor |
loopsva | 0:8c2ddd9801ca | 12 | |
loopsva | 1:fd536ebc7eaf | 13 | MLX9062x::MLX9062x(PinName sda, PinName scl, const char* name) : _i2c(sda, scl){ |
loopsva | 0:8c2ddd9801ca | 14 | _i2c.frequency(400000); //set up i2c speed |
loopsva | 0:8c2ddd9801ca | 15 | _i2c.stop(); //initialize with a stop |
loopsva | 1:fd536ebc7eaf | 16 | mlxDev = mlx90620; //default device is MLX90620 |
loopsva | 0:8c2ddd9801ca | 17 | } |
loopsva | 0:8c2ddd9801ca | 18 | |
loopsva | 0:8c2ddd9801ca | 19 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 1:fd536ebc7eaf | 20 | // Additional Constructor for selecting the MLX device |
loopsva | 1:fd536ebc7eaf | 21 | |
loopsva | 1:fd536ebc7eaf | 22 | MLX9062x::MLX9062x(PinName sda, PinName scl, MLXdevice MLXtype, const char* name) : _i2c(sda, scl){ |
loopsva | 1:fd536ebc7eaf | 23 | _i2c.frequency(400000); //set up i2c speed |
loopsva | 1:fd536ebc7eaf | 24 | _i2c.stop(); //initialize with a stop |
loopsva | 1:fd536ebc7eaf | 25 | mlxDev = MLXtype; //user select device 620 or 621 |
loopsva | 1:fd536ebc7eaf | 26 | } |
loopsva | 2:82782c73251e | 27 | |
loopsva | 1:fd536ebc7eaf | 28 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 1:fd536ebc7eaf | 29 | //copy contents of EEPROM inside the MLX9062x into a local buffer. Data is used for lookup tables and parameters |
loopsva | 0:8c2ddd9801ca | 30 | |
loopsva | 0:8c2ddd9801ca | 31 | #define MLX_EEP_EASY_LOAD 1 |
loopsva | 0:8c2ddd9801ca | 32 | |
loopsva | 1:fd536ebc7eaf | 33 | int MLX9062x::LoadEEPROM(mlx_struct& Pntr) { |
loopsva | 1:fd536ebc7eaf | 34 | Pntr.mlx621IDhi = 0; |
loopsva | 1:fd536ebc7eaf | 35 | Pntr.mlx621IDlo = 0; |
loopsva | 1:fd536ebc7eaf | 36 | Pntr.mlxDevice = mlxDev; //make strurcture device same as local device |
loopsva | 0:8c2ddd9801ca | 37 | |
loopsva | 0:8c2ddd9801ca | 38 | //clear out buffer first |
loopsva | 1:fd536ebc7eaf | 39 | for(int i = 0; i < 256; i++) Pntr.MLXEEbuf[i] = 0; //clear out entire EEMPROM buffer |
loopsva | 2:82782c73251e | 40 | |
loopsva | 2:82782c73251e | 41 | //the following code addition of a 1 byte I2C fetch is due to a bug in the F746NG which can only transfer 255 bytes at a time. grrr!!!.... |
loopsva | 2:82782c73251e | 42 | #if defined(TARGET_DISCO_F746NG) |
loopsva | 2:82782c73251e | 43 | #warning "TARGET_DISCO_F746NG i2c bug, 255 byte limit!!!" |
loopsva | 2:82782c73251e | 44 | Pntr.MLXEEbuf[0] = 255; |
loopsva | 2:82782c73251e | 45 | if(!_i2c.write(MLX_EEPADDR, Pntr.MLXEEbuf, 1, true)) { |
loopsva | 2:82782c73251e | 46 | _i2c.read((MLX_EEPADDR + 1), Pntr.MLXEEbuf, 1, false); |
loopsva | 2:82782c73251e | 47 | Pntr.MLXEEbuf[255] = Pntr.MLXEEbuf[0]; |
loopsva | 2:82782c73251e | 48 | Pntr.MLXEEbuf[0] = 0; |
loopsva | 2:82782c73251e | 49 | _i2c.write(MLX_EEPADDR, Pntr.MLXEEbuf, 1, true); |
loopsva | 2:82782c73251e | 50 | _i2c.read((MLX_EEPADDR + 1), Pntr.MLXEEbuf, 255, false); //s/b 256 if F746NG bug wasn't there |
loopsva | 2:82782c73251e | 51 | #else |
loopsva | 0:8c2ddd9801ca | 52 | if(!_i2c.write(MLX_EEPADDR, Pntr.MLXEEbuf, 1, true)) { //send command, 0 returned is ok |
loopsva | 2:82782c73251e | 53 | _i2c.read((MLX_EEPADDR + 1), Pntr.MLXEEbuf, 256, false); |
loopsva | 0:8c2ddd9801ca | 54 | #endif |
loopsva | 0:8c2ddd9801ca | 55 | |
loopsva | 0:8c2ddd9801ca | 56 | } else { |
loopsva | 0:8c2ddd9801ca | 57 | _i2c.stop(); //don't read EEP if write is broken |
loopsva | 0:8c2ddd9801ca | 58 | return(1); //return with error |
loopsva | 0:8c2ddd9801ca | 59 | } |
loopsva | 1:fd536ebc7eaf | 60 | if(Pntr.mlxDevice == mlx90621) { |
loopsva | 1:fd536ebc7eaf | 61 | Pntr.mlx621IDhi = (Pntr.MLXEEbuf[MLX621_EE_ID_BASE + 7] << 24) | (Pntr.MLXEEbuf[MLX621_EE_ID_BASE + 6] << 16) | |
loopsva | 1:fd536ebc7eaf | 62 | (Pntr.MLXEEbuf[MLX621_EE_ID_BASE + 5] << 8) | Pntr.MLXEEbuf[MLX621_EE_ID_BASE + 4]; |
loopsva | 1:fd536ebc7eaf | 63 | Pntr.mlx621IDlo = (Pntr.MLXEEbuf[MLX621_EE_ID_BASE + 3] << 24) | (Pntr.MLXEEbuf[MLX621_EE_ID_BASE + 2] << 16) | |
loopsva | 1:fd536ebc7eaf | 64 | (Pntr.MLXEEbuf[MLX621_EE_ID_BASE + 1] << 8) | Pntr.MLXEEbuf[MLX621_EE_ID_BASE + 0]; |
loopsva | 1:fd536ebc7eaf | 65 | } |
loopsva | 0:8c2ddd9801ca | 66 | return(0); //return with ok |
loopsva | 0:8c2ddd9801ca | 67 | } |
loopsva | 0:8c2ddd9801ca | 68 | |
loopsva | 0:8c2ddd9801ca | 69 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 1:fd536ebc7eaf | 70 | //copy oscillator offset from MLXEEbuf to MLX9062x (MS byte on 620 always = 0) |
loopsva | 0:8c2ddd9801ca | 71 | |
loopsva | 1:fd536ebc7eaf | 72 | int MLX9062x::SetOscTrimReg(mlx_struct& Pntr) { |
loopsva | 0:8c2ddd9801ca | 73 | Pntr.MLXRamCmmd[0] = 4; //command |
loopsva | 1:fd536ebc7eaf | 74 | Pntr.MLXRamCmmd[1] = Pntr.MLXEEbuf[MLX620_EETRIM] - 0xaa; //LS byte check |
loopsva | 1:fd536ebc7eaf | 75 | Pntr.MLXRamCmmd[2] = Pntr.MLXEEbuf[MLX620_EETRIM]; //oscillator trim value |
loopsva | 0:8c2ddd9801ca | 76 | Pntr.MLXRamCmmd[3] = 0x100 - 0xaa; //MS byte check |
loopsva | 0:8c2ddd9801ca | 77 | Pntr.MLXRamCmmd[4] = 0; //MS byte = 0 |
loopsva | 0:8c2ddd9801ca | 78 | int r = _i2c.write(MLX_RAMADDR, Pntr.MLXRamCmmd, 5, false); //send command |
loopsva | 1:fd536ebc7eaf | 79 | //printf("OscTrim-W: %02x %02x %02x %02x %02x\r\n", Pntr.MLXRamCmmd[0], Pntr.MLXRamCmmd[1], Pntr.MLXRamCmmd[2], Pntr.MLXRamCmmd[3], Pntr.MLXRamCmmd[4]); |
loopsva | 1:fd536ebc7eaf | 80 | return(r); //return ok or error |
loopsva | 0:8c2ddd9801ca | 81 | } |
loopsva | 0:8c2ddd9801ca | 82 | |
loopsva | 0:8c2ddd9801ca | 83 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 1:fd536ebc7eaf | 84 | //get oscillator offset register from MLX9062x |
loopsva | 0:8c2ddd9801ca | 85 | |
loopsva | 1:fd536ebc7eaf | 86 | uint16_t MLX9062x::GetOscTrimReg(mlx_struct& Pntr) { |
loopsva | 0:8c2ddd9801ca | 87 | Pntr.MLXRamCmmd[0] = 2; //command |
loopsva | 0:8c2ddd9801ca | 88 | Pntr.MLXRamCmmd[1] = MLX_TRIM; //address of register |
loopsva | 0:8c2ddd9801ca | 89 | Pntr.MLXRamCmmd[2] = 0; //address step |
loopsva | 0:8c2ddd9801ca | 90 | Pntr.MLXRamCmmd[3] = 1; //# of reads |
loopsva | 0:8c2ddd9801ca | 91 | _i2c.write(MLX_RAMADDR, Pntr.MLXRamCmmd, 4, true); //send command |
loopsva | 1:fd536ebc7eaf | 92 | _i2c.read(MLX_RAMADDR, Pntr.MLXRamCmmd, 2, false); //get 16 bit register |
loopsva | 1:fd536ebc7eaf | 93 | Pntr.OscTrim = (Pntr.MLXRamCmmd[1] << 8) + Pntr.MLXRamCmmd[0]; //store register |
loopsva | 1:fd536ebc7eaf | 94 | //printf("OscTrim-R: %02x %02x\r\n", Pntr.MLXRamCmmd[0], Pntr.MLXRamCmmd[1]); |
loopsva | 1:fd536ebc7eaf | 95 | return(Pntr.OscTrim); //return value |
loopsva | 0:8c2ddd9801ca | 96 | } |
loopsva | 0:8c2ddd9801ca | 97 | |
loopsva | 0:8c2ddd9801ca | 98 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 0:8c2ddd9801ca | 99 | //initialize the configuration register |
loopsva | 0:8c2ddd9801ca | 100 | //******* NOTE: Step measurement mode was removed from new data sheet dated Sept 19 2012 |
loopsva | 0:8c2ddd9801ca | 101 | |
loopsva | 1:fd536ebc7eaf | 102 | int MLX9062x::SetConfigReg(mlx_struct& Pntr) { |
loopsva | 1:fd536ebc7eaf | 103 | Pntr.MLXRamCmmd[0] = 3; //command |
loopsva | 1:fd536ebc7eaf | 104 | if(Pntr.mlxDevice == mlx90621) { |
loopsva | 1:fd536ebc7eaf | 105 | Pntr.MLXRamCmmd[2] = Pntr.MLXEEbuf[MLX621_CONFIG_LO]; //LS byte |
loopsva | 1:fd536ebc7eaf | 106 | Pntr.MLXRamCmmd[4] = Pntr.MLXEEbuf[MLX621_CONFIG_HI]; //MS byte |
loopsva | 1:fd536ebc7eaf | 107 | //here you can manipulate the Config Register contents from the default EEPROM values of 0x463e |
loopsva | 1:fd536ebc7eaf | 108 | Pntr.MLXRamCmmd[2] = (Pntr.MLXRamCmmd[2] & ~MLX621_CONF_ADC_MASK) | MLX621_CONF_ADC18; |
loopsva | 1:fd536ebc7eaf | 109 | Pntr.MLXRamCmmd[4] = Pntr.MLXRamCmmd[4] | (MLX621_CONF_MD_1 >> 8); |
loopsva | 1:fd536ebc7eaf | 110 | Pntr.MLXRamCmmd[1] = Pntr.MLXRamCmmd[2] - 0x55; //LS byte check |
loopsva | 1:fd536ebc7eaf | 111 | Pntr.MLXRamCmmd[3] = Pntr.MLXRamCmmd[4] - 0x55; //MS byte check |
loopsva | 1:fd536ebc7eaf | 112 | } else { |
loopsva | 1:fd536ebc7eaf | 113 | Pntr.MLXRamCmmd[1] = 0x10c - 0x55; //LS byte check |
loopsva | 1:fd536ebc7eaf | 114 | Pntr.MLXRamCmmd[2] = 0x0c; //LS config value, normal mode, 4Hz array ******* |
loopsva | 1:fd536ebc7eaf | 115 | Pntr.MLXRamCmmd[3] = 0x5c - 0x55; //MS byte check |
loopsva | 1:fd536ebc7eaf | 116 | Pntr.MLXRamCmmd[4] = 0x5c; //MS config value, 8Hz Ta, 400k i2c |
loopsva | 1:fd536ebc7eaf | 117 | } |
loopsva | 0:8c2ddd9801ca | 118 | int r = _i2c.write(MLX_RAMADDR, Pntr.MLXRamCmmd, 5, false); |
loopsva | 1:fd536ebc7eaf | 119 | //printf("Command-W: %02x %02x %02x %02x %02x\r\n", Pntr.MLXRamCmmd[0], Pntr.MLXRamCmmd[1], Pntr.MLXRamCmmd[2], Pntr.MLXRamCmmd[3], Pntr.MLXRamCmmd[4]); |
loopsva | 0:8c2ddd9801ca | 120 | return(r); |
loopsva | 0:8c2ddd9801ca | 121 | } |
loopsva | 0:8c2ddd9801ca | 122 | |
loopsva | 0:8c2ddd9801ca | 123 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 1:fd536ebc7eaf | 124 | //get configuration register from MLX9062x |
loopsva | 0:8c2ddd9801ca | 125 | |
loopsva | 1:fd536ebc7eaf | 126 | uint16_t MLX9062x::GetConfigReg(mlx_struct& Pntr) { |
loopsva | 0:8c2ddd9801ca | 127 | Pntr.MLXRamCmmd[0] = 2; //command |
loopsva | 0:8c2ddd9801ca | 128 | Pntr.MLXRamCmmd[1] = MLX_CONFIG; //address of register |
loopsva | 0:8c2ddd9801ca | 129 | Pntr.MLXRamCmmd[2] = 0; //address step |
loopsva | 0:8c2ddd9801ca | 130 | Pntr.MLXRamCmmd[3] = 1; //# of reads |
loopsva | 0:8c2ddd9801ca | 131 | _i2c.write(MLX_RAMADDR, Pntr.MLXRamCmmd, 4, true); |
loopsva | 0:8c2ddd9801ca | 132 | _i2c.read(MLX_RAMADDR, Pntr.MLXRamCmmd, 2); |
loopsva | 0:8c2ddd9801ca | 133 | Pntr.Config = (Pntr.MLXRamCmmd[1] << 8) + Pntr.MLXRamCmmd[0]; |
loopsva | 0:8c2ddd9801ca | 134 | return(Pntr.Config); |
loopsva | 0:8c2ddd9801ca | 135 | } |
loopsva | 0:8c2ddd9801ca | 136 | |
loopsva | 0:8c2ddd9801ca | 137 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 1:fd536ebc7eaf | 138 | //get PTAT register from MLX9062x |
loopsva | 0:8c2ddd9801ca | 139 | |
loopsva | 1:fd536ebc7eaf | 140 | uint16_t MLX9062x::GetPTATReg(mlx_struct& Pntr) { |
loopsva | 0:8c2ddd9801ca | 141 | Pntr.MLXRamCmmd[0] = 2; //command |
loopsva | 1:fd536ebc7eaf | 142 | Pntr.MLXRamCmmd[1] = MLX620_PTATSENS; //address of register |
loopsva | 1:fd536ebc7eaf | 143 | if(Pntr.mlxDevice == mlx90621) Pntr.MLXRamCmmd[1] = MLX621_PTATSENS; |
loopsva | 0:8c2ddd9801ca | 144 | Pntr.MLXRamCmmd[2] = 0; //address step |
loopsva | 0:8c2ddd9801ca | 145 | Pntr.MLXRamCmmd[3] = 1; //# of reads |
loopsva | 0:8c2ddd9801ca | 146 | _i2c.write(MLX_RAMADDR, Pntr.MLXRamCmmd, 4, true); |
loopsva | 0:8c2ddd9801ca | 147 | _i2c.read(MLX_RAMADDR, Pntr.MLXRamCmmd, 2); |
loopsva | 0:8c2ddd9801ca | 148 | Pntr.PtatD = (Pntr.MLXRamCmmd[1] << 8) + Pntr.MLXRamCmmd[0]; |
loopsva | 1:fd536ebc7eaf | 149 | #ifdef MLXTEST_621b |
loopsva | 1:fd536ebc7eaf | 150 | if(Pntr.mlxDevice == mlx90620) { |
loopsva | 1:fd536ebc7eaf | 151 | Pntr.PtatD = 0x1ac0; |
loopsva | 1:fd536ebc7eaf | 152 | } else { |
loopsva | 1:fd536ebc7eaf | 153 | if(ConfigReg54 == 0) { |
loopsva | 1:fd536ebc7eaf | 154 | Pntr.PtatD = 0x0cfb; |
loopsva | 1:fd536ebc7eaf | 155 | } else |
loopsva | 1:fd536ebc7eaf | 156 | if(ConfigReg54 == 1) { |
loopsva | 1:fd536ebc7eaf | 157 | Pntr.PtatD = 0x19f7; |
loopsva | 1:fd536ebc7eaf | 158 | } else |
loopsva | 1:fd536ebc7eaf | 159 | if(ConfigReg54 == 2) { |
loopsva | 1:fd536ebc7eaf | 160 | Pntr.PtatD = 0x33ef; |
loopsva | 1:fd536ebc7eaf | 161 | } else |
loopsva | 1:fd536ebc7eaf | 162 | if(ConfigReg54 == 3) { |
loopsva | 1:fd536ebc7eaf | 163 | Pntr.PtatD = 0x67de; |
loopsva | 1:fd536ebc7eaf | 164 | } else { |
loopsva | 1:fd536ebc7eaf | 165 | Pntr.PtatD = 0; |
loopsva | 1:fd536ebc7eaf | 166 | } |
loopsva | 1:fd536ebc7eaf | 167 | } |
loopsva | 1:fd536ebc7eaf | 168 | #endif |
loopsva | 0:8c2ddd9801ca | 169 | return(Pntr.PtatD); |
loopsva | 0:8c2ddd9801ca | 170 | } |
loopsva | 0:8c2ddd9801ca | 171 | |
loopsva | 0:8c2ddd9801ca | 172 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 1:fd536ebc7eaf | 173 | //get VCP / TGC register from MLX9062x |
loopsva | 0:8c2ddd9801ca | 174 | |
loopsva | 1:fd536ebc7eaf | 175 | int16_t MLX9062x::GetTGCReg(mlx_struct& Pntr) { |
loopsva | 0:8c2ddd9801ca | 176 | Pntr.MLXRamCmmd[0] = 2; //command |
loopsva | 1:fd536ebc7eaf | 177 | Pntr.MLXRamCmmd[1] = MLX620_TGCSENS; //address of register |
loopsva | 1:fd536ebc7eaf | 178 | if(Pntr.mlxDevice == mlx90621) Pntr.MLXRamCmmd[1] = MLX621_TGCSENS; |
loopsva | 0:8c2ddd9801ca | 179 | Pntr.MLXRamCmmd[2] = 0; //address step |
loopsva | 0:8c2ddd9801ca | 180 | Pntr.MLXRamCmmd[3] = 1; //# of reads |
loopsva | 0:8c2ddd9801ca | 181 | _i2c.write(MLX_RAMADDR, Pntr.MLXRamCmmd, 4, true); |
loopsva | 0:8c2ddd9801ca | 182 | _i2c.read(MLX_RAMADDR, Pntr.MLXRamCmmd, 2); |
loopsva | 1:fd536ebc7eaf | 183 | int16_t VCP = (Pntr.MLXRamCmmd[1] << 8) + Pntr.MLXRamCmmd[0]; |
loopsva | 1:fd536ebc7eaf | 184 | #ifdef MLXTEST_621b |
loopsva | 1:fd536ebc7eaf | 185 | VCP = 0xffdc; |
loopsva | 1:fd536ebc7eaf | 186 | #endif |
loopsva | 1:fd536ebc7eaf | 187 | Pntr.VCP = VCP; |
loopsva | 0:8c2ddd9801ca | 188 | return(VCP); |
loopsva | 0:8c2ddd9801ca | 189 | } |
loopsva | 0:8c2ddd9801ca | 190 | |
loopsva | 0:8c2ddd9801ca | 191 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 1:fd536ebc7eaf | 192 | //get RAM dump from MLX9062x |
loopsva | 0:8c2ddd9801ca | 193 | |
loopsva | 1:fd536ebc7eaf | 194 | void MLX9062x::LoadMLXRam(mlx_struct& Pntr) { |
loopsva | 0:8c2ddd9801ca | 195 | Pntr.MLXRamCmmd[0] = 2; //command |
loopsva | 0:8c2ddd9801ca | 196 | Pntr.MLXRamCmmd[1] = 0; //start address |
loopsva | 0:8c2ddd9801ca | 197 | Pntr.MLXRamCmmd[2] = 1; //address step |
loopsva | 0:8c2ddd9801ca | 198 | Pntr.MLXRamCmmd[3] = 0x40; //# of reads |
loopsva | 0:8c2ddd9801ca | 199 | _i2c.write(MLX_RAMADDR, Pntr.MLXRamCmmd, 4, true); |
loopsva | 0:8c2ddd9801ca | 200 | _i2c.read(MLX_RAMADDR, Pntr.MLXRamBuf, 0x80); |
loopsva | 1:fd536ebc7eaf | 201 | Pntr.PtatD = MLX9062x::GetPTATReg(Pntr); |
loopsva | 1:fd536ebc7eaf | 202 | Pntr.VCP = MLX9062x::GetTGCReg(Pntr); |
loopsva | 0:8c2ddd9801ca | 203 | } |
loopsva | 0:8c2ddd9801ca | 204 | |
loopsva | 0:8c2ddd9801ca | 205 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 1:fd536ebc7eaf | 206 | //start measurement MLX9062x |
loopsva | 0:8c2ddd9801ca | 207 | |
loopsva | 1:fd536ebc7eaf | 208 | int MLX9062x::StartMeasurement(mlx_struct& Pntr) { |
loopsva | 1:fd536ebc7eaf | 209 | if(Pntr.mlxDevice == mlx90621) return(0); //there is no start_meas in the 90621 |
loopsva | 0:8c2ddd9801ca | 210 | Pntr.MLXRamCmmd[0] = 1; //command |
loopsva | 0:8c2ddd9801ca | 211 | Pntr.MLXRamCmmd[1] = 8; //address of config register |
loopsva | 0:8c2ddd9801ca | 212 | int r = _i2c.write(MLX_RAMADDR, Pntr.MLXRamCmmd, 2, false); |
loopsva | 0:8c2ddd9801ca | 213 | return(r); |
loopsva | 0:8c2ddd9801ca | 214 | } |
loopsva | 0:8c2ddd9801ca | 215 | |
loopsva | 0:8c2ddd9801ca | 216 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 1:fd536ebc7eaf | 217 | // Only a test to set up values in EEPROM and RAM buffers to debug math. |
loopsva | 1:fd536ebc7eaf | 218 | //Note: must be performed after reading the EEPROM and RAM data |
loopsva | 0:8c2ddd9801ca | 219 | |
loopsva | 1:fd536ebc7eaf | 220 | void MLX9062x::DSSetup(mlx_struct& Pntr, int Pixel) { |
loopsva | 1:fd536ebc7eaf | 221 | #ifdef MLXTEST_621b |
loopsva | 1:fd536ebc7eaf | 222 | #warning "MLX90620 test mode B" |
loopsva | 1:fd536ebc7eaf | 223 | if(Pntr.mlxDevice == mlx90620) { |
loopsva | 1:fd536ebc7eaf | 224 | Pntr.MLXEEbuf[0xda] = 0x78; |
loopsva | 1:fd536ebc7eaf | 225 | Pntr.MLXEEbuf[0xdb] = 0x1a; |
loopsva | 1:fd536ebc7eaf | 226 | Pntr.MLXEEbuf[0xdc] = 0x33; |
loopsva | 1:fd536ebc7eaf | 227 | Pntr.MLXEEbuf[0xdd] = 0x5b; |
loopsva | 1:fd536ebc7eaf | 228 | Pntr.MLXEEbuf[0xde] = 0xcc; |
loopsva | 1:fd536ebc7eaf | 229 | Pntr.MLXEEbuf[0xdf] = 0xed; |
loopsva | 1:fd536ebc7eaf | 230 | } else { |
loopsva | 1:fd536ebc7eaf | 231 | //7.3.2 for Ta Calculations |
loopsva | 1:fd536ebc7eaf | 232 | Pntr.MLXEEbuf[0xda] = 0x20; |
loopsva | 1:fd536ebc7eaf | 233 | Pntr.MLXEEbuf[0xdb] = 0x64; |
loopsva | 1:fd536ebc7eaf | 234 | Pntr.MLXEEbuf[0xdc] = 0x89; |
loopsva | 1:fd536ebc7eaf | 235 | Pntr.MLXEEbuf[0xdd] = 0x55; |
loopsva | 1:fd536ebc7eaf | 236 | Pntr.MLXEEbuf[0xde] = 0x7e; |
loopsva | 1:fd536ebc7eaf | 237 | Pntr.MLXEEbuf[0xdf] = 0x5e; |
loopsva | 1:fd536ebc7eaf | 238 | Pntr.MLXEEbuf[0xd2] = 0x8b; |
loopsva | 1:fd536ebc7eaf | 239 | |
loopsva | 1:fd536ebc7eaf | 240 | //7.3.4 for To Calculations (pixel 11) |
loopsva | 1:fd536ebc7eaf | 241 | Pntr.MLXEEbuf[0x00 + Pixel] = 0x21; |
loopsva | 1:fd536ebc7eaf | 242 | Pntr.MLXEEbuf[0x40 + Pixel] = 0xbc; |
loopsva | 1:fd536ebc7eaf | 243 | Pntr.MLXEEbuf[0x80 + Pixel] = 0xcd; |
loopsva | 1:fd536ebc7eaf | 244 | |
loopsva | 1:fd536ebc7eaf | 245 | Pntr.MLXEEbuf[0xc0] = 0x99; |
loopsva | 1:fd536ebc7eaf | 246 | Pntr.MLXEEbuf[0xc4] = 0x9e; |
loopsva | 1:fd536ebc7eaf | 247 | |
loopsva | 1:fd536ebc7eaf | 248 | Pntr.MLXEEbuf[0xd0] = 0x8a; |
loopsva | 1:fd536ebc7eaf | 249 | Pntr.MLXEEbuf[0xd1] = 0xff; |
loopsva | 1:fd536ebc7eaf | 250 | |
loopsva | 1:fd536ebc7eaf | 251 | Pntr.MLXEEbuf[0xd3] = 0x9d; |
loopsva | 1:fd536ebc7eaf | 252 | Pntr.MLXEEbuf[0xd4] = 0xff; |
loopsva | 1:fd536ebc7eaf | 253 | Pntr.MLXEEbuf[0xd5] = 0xa2; |
loopsva | 1:fd536ebc7eaf | 254 | Pntr.MLXEEbuf[0xd6] = 0xa8; |
loopsva | 1:fd536ebc7eaf | 255 | Pntr.MLXEEbuf[0xd7] = 0x0f; |
loopsva | 1:fd536ebc7eaf | 256 | Pntr.MLXEEbuf[0xd8] = 0x18; |
loopsva | 1:fd536ebc7eaf | 257 | Pntr.MLXEEbuf[0xd9] = 0x07; |
loopsva | 1:fd536ebc7eaf | 258 | |
loopsva | 1:fd536ebc7eaf | 259 | Pntr.MLXEEbuf[0xe0] = 0xae; |
loopsva | 1:fd536ebc7eaf | 260 | Pntr.MLXEEbuf[0xe1] = 0x4e; |
loopsva | 1:fd536ebc7eaf | 261 | Pntr.MLXEEbuf[0xe2] = 0x26; |
loopsva | 1:fd536ebc7eaf | 262 | Pntr.MLXEEbuf[0xe3] = 0x1f; |
loopsva | 1:fd536ebc7eaf | 263 | Pntr.MLXEEbuf[0xe4] = 0x00; |
loopsva | 1:fd536ebc7eaf | 264 | Pntr.MLXEEbuf[0xe5] = 0x80; |
loopsva | 1:fd536ebc7eaf | 265 | Pntr.MLXEEbuf[0xe6] = 0x0c; |
loopsva | 1:fd536ebc7eaf | 266 | Pntr.MLXEEbuf[0xe7] = 0x02; |
loopsva | 1:fd536ebc7eaf | 267 | |
loopsva | 1:fd536ebc7eaf | 268 | VirPix = 0x01b7; |
loopsva | 1:fd536ebc7eaf | 269 | } |
loopsva | 1:fd536ebc7eaf | 270 | #endif |
loopsva | 0:8c2ddd9801ca | 271 | } |
loopsva | 0:8c2ddd9801ca | 272 | |
loopsva | 0:8c2ddd9801ca | 273 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 0:8c2ddd9801ca | 274 | // Initial Calculations for Ta and To |
loopsva | 0:8c2ddd9801ca | 275 | |
loopsva | 1:fd536ebc7eaf | 276 | //#define MLXTEST_621 1 |
loopsva | 1:fd536ebc7eaf | 277 | |
loopsva | 1:fd536ebc7eaf | 278 | double MLX9062x::GetDieTemp(mlx_struct& Pntr) { |
loopsva | 1:fd536ebc7eaf | 279 | Pntr.PtatD = MLX9062x::GetPTATReg(Pntr); |
loopsva | 1:fd536ebc7eaf | 280 | |
loopsva | 1:fd536ebc7eaf | 281 | //Note: There seems to be a scaling error in the following routine |
loopsva | 1:fd536ebc7eaf | 282 | //MLX621_CONF_ADC18 = +26.891C |
loopsva | 1:fd536ebc7eaf | 283 | //MLX621_CONF_ADC17 = +25.934C |
loopsva | 1:fd536ebc7eaf | 284 | //MLX621_CONF_ADC16 = +25.467C |
loopsva | 1:fd536ebc7eaf | 285 | //MLX621_CONF_ADC15 = +25.187C |
loopsva | 1:fd536ebc7eaf | 286 | |
loopsva | 1:fd536ebc7eaf | 287 | double TaX = (-Kt1_f + sqrt(pow(Kt1_f, 2.0) - 4.0 * Kt2_f * (((Vth25 - (double)Pntr.PtatD)/ScaleCR54))))/(2.0 * Kt2_f) + 25.0; |
loopsva | 1:fd536ebc7eaf | 288 | Pntr.DieTemp = TaX; |
loopsva | 1:fd536ebc7eaf | 289 | return(TaX); |
loopsva | 1:fd536ebc7eaf | 290 | } |
loopsva | 1:fd536ebc7eaf | 291 | |
loopsva | 1:fd536ebc7eaf | 292 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 1:fd536ebc7eaf | 293 | // Display internal PIXEL registers for debugging math |
loopsva | 1:fd536ebc7eaf | 294 | |
loopsva | 1:fd536ebc7eaf | 295 | void MLX9062x::DumpPixRegs(mlx_struct& Pntr, int Pixel) { |
loopsva | 1:fd536ebc7eaf | 296 | #ifdef MLXTEST_621b |
loopsva | 1:fd536ebc7eaf | 297 | if(Pntr.mlxDevice == mlx90620) { |
loopsva | 1:fd536ebc7eaf | 298 | /* |
loopsva | 1:fd536ebc7eaf | 299 | printf("\r\n\r\npixel = %d\r\n", Pixel); |
loopsva | 1:fd536ebc7eaf | 300 | printf("Acp = %d\r\nBcp = %d\r\nBiS = %d\r\n", AcpX, BcpX, BiScaleX); |
loopsva | 1:fd536ebc7eaf | 301 | printf("Vcp = %d\r\neps = %d\r\nTGC = %d\r\n", VCP, elipsonX, TGCX); |
loopsva | 1:fd536ebc7eaf | 302 | printf("Vcp_off_comp = %f\r\n", Vcp_off_comp); |
loopsva | 1:fd536ebc7eaf | 303 | printf("VirPix_off_comp = %f\r\n", VirPix_off_comp); |
loopsva | 1:fd536ebc7eaf | 304 | printf("VirPix = %d\r\n", VirPix); |
loopsva | 1:fd536ebc7eaf | 305 | printf("AiPix = %d\r\n", AiPix); |
loopsva | 1:fd536ebc7eaf | 306 | printf("BiPix = %d\r\n", BiPix); |
loopsva | 1:fd536ebc7eaf | 307 | printf("BiScale = %d\r\n", BiScaleX); |
loopsva | 1:fd536ebc7eaf | 308 | printf("2^BiScale = %f\r\n", (powf(2.0,BiScaleX))); |
loopsva | 1:fd536ebc7eaf | 309 | printf("1 << BiScale = %d\r\n", (1 << BiScaleX)); |
loopsva | 1:fd536ebc7eaf | 310 | printf("Ta-25.0 = %f\r\n", (Ta - 25.0f)); |
loopsva | 1:fd536ebc7eaf | 311 | printf("BiPix/2^BiScale = %f\r\n", (BiPix / powf(2.0,BiScaleX))); |
loopsva | 1:fd536ebc7eaf | 312 | printf("AiP+BiP/2^BiScale)*(Ta-25= %f\r\n", (AiPix + BiPix / powf(2.0,BiScaleX) * (Ta - 25.0f))); |
loopsva | 1:fd536ebc7eaf | 313 | printf("VirPix_off_comp again = %f\r\n", (VirPix - (AiPix + BiPix / powf(2.0,BiScaleX) * (Ta - 25.0f)))); |
loopsva | 1:fd536ebc7eaf | 314 | printf("VirPix_off_comp2 step = %f\r\n", VirPix_off_comp2); |
loopsva | 1:fd536ebc7eaf | 315 | printf("VirPix_tgc_comp = %f\r\n", VirPix_tgc_comp); |
loopsva | 1:fd536ebc7eaf | 316 | printf("elipsonf = %f\r\n", elipsonf); |
loopsva | 1:fd536ebc7eaf | 317 | printf("VirPix_comp = %f\r\n", VirPix_comp); |
loopsva | 1:fd536ebc7eaf | 318 | printf("theta28 = %f << double print problem\r\n", (theta28 * 100000000.0)); //<<< can't print a double |
loopsva | 1:fd536ebc7eaf | 319 | printf("TempPxl = %f\r\n", TempPxl); |
loopsva | 1:fd536ebc7eaf | 320 | */ |
loopsva | 1:fd536ebc7eaf | 321 | |
loopsva | 1:fd536ebc7eaf | 322 | } else { |
loopsva | 1:fd536ebc7eaf | 323 | printf("Pixel,%2d\r\n", Pixel); |
loopsva | 1:fd536ebc7eaf | 324 | |
loopsva | 1:fd536ebc7eaf | 325 | //DSSetup(Pntr, Pixel); |
loopsva | 1:fd536ebc7eaf | 326 | printf("VirPix,%d,%x\r\n", VirPix, VirPix); |
loopsva | 1:fd536ebc7eaf | 327 | printf("VCP,%d\r\n", Pntr.VCP); |
loopsva | 1:fd536ebc7eaf | 328 | printf("Ta,%.3f\r\n\r\n", Ta); |
loopsva | 1:fd536ebc7eaf | 329 | |
loopsva | 1:fd536ebc7eaf | 330 | printf("Acommon_mod,%d\r\n", Acommon); |
loopsva | 1:fd536ebc7eaf | 331 | printf("AiPix,%d\r\n", AiPix); |
loopsva | 1:fd536ebc7eaf | 332 | printf("Ai_ij_f,%.16f\r\n", Ai_ij); |
loopsva | 1:fd536ebc7eaf | 333 | printf("BiPix_mod,%d\r\n", BiPix); |
loopsva | 1:fd536ebc7eaf | 334 | printf("Bi_ij_f,%.16f\r\n", Bi_ij); |
loopsva | 1:fd536ebc7eaf | 335 | printf("VirOffComp,%.16f\r\n", VirOffComp); |
loopsva | 1:fd536ebc7eaf | 336 | printf("ACP_ee_mod,%d\r\n", ACP_ee); |
loopsva | 1:fd536ebc7eaf | 337 | int8_t bCPx = Pntr.MLXEEbuf[MLX621_BCP]; |
loopsva | 1:fd536ebc7eaf | 338 | if(bCPx > 127) bCPx -= 256; |
loopsva | 1:fd536ebc7eaf | 339 | printf("bCP_ee_mod,%d\r\n", bCPx); |
loopsva | 1:fd536ebc7eaf | 340 | printf("bCP,%.16f\r\n", bCP); |
loopsva | 1:fd536ebc7eaf | 341 | printf("VcpCPOffComp,%.16f\r\n", VcpCPOffComp); |
loopsva | 1:fd536ebc7eaf | 342 | printf("TempTCG_mod,%d\r\n\r\n", TempTCG); |
loopsva | 1:fd536ebc7eaf | 343 | |
loopsva | 1:fd536ebc7eaf | 344 | printf("Tgc621 mod,%.16f\r\n", Tgc621); |
loopsva | 1:fd536ebc7eaf | 345 | printf("Emiss mod,%d\r\n", Emiss); |
loopsva | 1:fd536ebc7eaf | 346 | printf("VirTGCComp,%.16f\r\n", VirTGCComp); |
loopsva | 1:fd536ebc7eaf | 347 | printf("VirComp,%.16f\r\n", VirComp); |
loopsva | 0:8c2ddd9801ca | 348 | |
loopsva | 1:fd536ebc7eaf | 349 | printf("KsTa,%d\r\n", KsTa); |
loopsva | 1:fd536ebc7eaf | 350 | printf("KsTaF,%.16f\r\n", KsTaF); |
loopsva | 1:fd536ebc7eaf | 351 | printf("ThPix,%.16f\r\n", ThPix); |
loopsva | 1:fd536ebc7eaf | 352 | printf("ThetaCP,%.16f\r\n", ThetaCP); |
loopsva | 1:fd536ebc7eaf | 353 | printf("ThetaCompPix,%.16f\r\n", ThetaCompPix); |
loopsva | 1:fd536ebc7eaf | 354 | |
loopsva | 1:fd536ebc7eaf | 355 | printf("Ks4_ee,%d\r\n", Ks4_ee); |
loopsva | 1:fd536ebc7eaf | 356 | printf("Ks4_scale,%d,%x\r\n", Pntr.MLXEEbuf[MLX621_KS_SCALE], Pntr.MLXEEbuf[MLX621_KS_SCALE]); |
loopsva | 1:fd536ebc7eaf | 357 | printf("Ks4,%.16f\r\n", Ks4); |
loopsva | 1:fd536ebc7eaf | 358 | printf("TaK4,%.2f\r\n", TaK4); |
loopsva | 1:fd536ebc7eaf | 359 | printf("Sx,%.16f\r\n", Sx); |
loopsva | 1:fd536ebc7eaf | 360 | /* |
loopsva | 1:fd536ebc7eaf | 361 | |
loopsva | 1:fd536ebc7eaf | 362 | printf("BiPix,%d,%x\r\n", Pntr.MLXEEbuf[Pixel + 0x40], Pntr.MLXEEbuf[Pixel + 0x40]); |
loopsva | 1:fd536ebc7eaf | 363 | printf("d_Th_Pix,%d,%x\r\n", d_Th_Pix, d_Th_Pix); |
loopsva | 1:fd536ebc7eaf | 364 | |
loopsva | 1:fd536ebc7eaf | 365 | //printf("VirOff_(Ta - 25.0f),%.16f\r\n", (Ta - 25.0f)); |
loopsva | 1:fd536ebc7eaf | 366 | //printf("VirOff_Bi_ij * (Ta - 25.0f),%.16f\r\n", Bi_ij * (Ta - 25.0f)); |
loopsva | 1:fd536ebc7eaf | 367 | //printf("VirOff_(Ai_ij + Bi_ij * (Ta - 25.0f)),%.16f\r\n", (Ai_ij + Bi_ij * (Ta - 25.0f))); |
loopsva | 1:fd536ebc7eaf | 368 | |
loopsva | 1:fd536ebc7eaf | 369 | printf("VircpTgcComp,%.16f\r\n", VircpTgcComp); |
loopsva | 1:fd536ebc7eaf | 370 | printf("VirTGCComp,%.16f\r\n", VirTGCComp); |
loopsva | 1:fd536ebc7eaf | 371 | printf("DELTA_TH_SCALE,%d,%.0f\r\n", Pntr.MLXEEbuf[MLX621_DELTA_TH_SCALE], (double) powf(2.0,Pntr.MLXEEbuf[MLX621_DELTA_TH_SCALE])); |
loopsva | 1:fd536ebc7eaf | 372 | printf("THETA0_SCALE,%d,%.0f\r\n", Pntr.MLXEEbuf[MLX621_THETA0_SCALE], (double) powf(2.0,Pntr.MLXEEbuf[MLX621_THETA0_SCALE])); |
loopsva | 1:fd536ebc7eaf | 373 | //printf("Alpha_ij_raw,%d,%04x\r\n", (Pntr.MLXEEbuf[MLX621_THETA0_HI] << 8) + Pntr.MLXEEbuf[MLX621_THETA0_LO], (Pntr.MLXEEbuf[MLX621_THETA0_HI] << 8) + Pntr.MLXEEbuf[MLX621_THETA0_LO]); |
loopsva | 1:fd536ebc7eaf | 374 | //printf("Alpha_ij_f,%.16f\r\n", Alpha_ij); |
loopsva | 1:fd536ebc7eaf | 375 | //printf("VirNorm,%.16f\r\n", VirNorm); |
loopsva | 1:fd536ebc7eaf | 376 | printf("VirComp,%.16f\r\n", VirComp); |
loopsva | 1:fd536ebc7eaf | 377 | printf("TempPxl,%.16f\r\n", TempPxl); |
loopsva | 1:fd536ebc7eaf | 378 | |
loopsva | 1:fd536ebc7eaf | 379 | //printf("TempPxl_a,%.16f\r\n", powf((Ta + 273.15), 4.0)); |
loopsva | 1:fd536ebc7eaf | 380 | //printf("TempPxl_b,%.16f\r\n", log10((VirComp + powf((Ta + 273.15), 4.0)) / 4.0)); |
loopsva | 1:fd536ebc7eaf | 381 | //printf("TempPxl_c,%.16f\r\n", exp((log10((VirComp + powf((Ta + 273.15), 4.0)) / 4.0)))); |
loopsva | 1:fd536ebc7eaf | 382 | //printf("TempPxl_d,%.16f\r\n", powf((Ta + 273.15), 1.0)); |
loopsva | 1:fd536ebc7eaf | 383 | //printf("TempPxl_e,%.16f\r\n", Ta + 273.15); |
loopsva | 1:fd536ebc7eaf | 384 | //printf("TempPxl_f,%.16f\r\n", Ta + 273.15); |
loopsva | 1:fd536ebc7eaf | 385 | printf("Th_0 ,%.16f\r\n", (double)Th_0 / pow(2.0,(double)Th_0_sc)); |
loopsva | 1:fd536ebc7eaf | 386 | //printf("d_Th_Pix,%d,%x\r\n", d_Th_Pix, d_Th_Pix); |
loopsva | 1:fd536ebc7eaf | 387 | //printf("d_Th_Pix_raw,%d,%3.20f\r\n", Pntr.MLXEEbuf[Pixel + 0x80], (double)Pntr.MLXEEbuf[Pixel + 0x80]); |
loopsva | 1:fd536ebc7eaf | 388 | //printf("ThDeltaZ,%3.20f\r\n", (double)d_Th_Pix); // !!!!! coverting 205 to 34!! |
loopsva | 1:fd536ebc7eaf | 389 | //d_Th_Pix = Pntr.MLXEEbuf[Pixel + 0x80]; |
loopsva | 1:fd536ebc7eaf | 390 | //printf("ThDelta1,%.16f\r\n", (double)d_Th_Pix); |
loopsva | 1:fd536ebc7eaf | 391 | //printf("ThDelta2,%.16f\r\n", (double)Th_0 / pow(2.0,(double)Th_0_sc)); |
loopsva | 1:fd536ebc7eaf | 392 | //printf("ThDelta3,%.16f\r\n", (double)d_Th_Pix / pow(2.0,(double)d_Th_sc)); |
loopsva | 1:fd536ebc7eaf | 393 | //printf("ThDelta4,%.16f\r\n", (double)Th_0 / pow(2.0,(double)Th_0_sc) + (double)d_Th_Pix / pow(2.0,(double)d_Th_sc)); |
loopsva | 1:fd536ebc7eaf | 394 | //printf("ThDelta5,%.16f\r\n", (double)d_Th_Pix / pow(2.0,(double)d_Th_sc)); |
loopsva | 1:fd536ebc7eaf | 395 | |
loopsva | 1:fd536ebc7eaf | 396 | //ThPix = (((double)Th_0 / pow(2.0,(double)Th_0_sc) + ((double)d_Th_Pix / pow(2.0,(double)d_Th_sc)))) / ScaleCR54; |
loopsva | 1:fd536ebc7eaf | 397 | |
loopsva | 1:fd536ebc7eaf | 398 | printf("ThPix,%.16f\r\n", ThPix); |
loopsva | 1:fd536ebc7eaf | 399 | printf("ThetaCP,%.16f\r\n", ThetaCP); |
loopsva | 1:fd536ebc7eaf | 400 | printf("ThetaCompPix,%.16f\r\n", ThetaCompPix); |
loopsva | 1:fd536ebc7eaf | 401 | //printf("SxGuts1,%.32f\r\n", pow(ThetaCompPix, 3.0)); |
loopsva | 1:fd536ebc7eaf | 402 | //printf("SxGuts2,%.32f\r\n", pow(ThetaCompPix, 3.0) * VirComp); |
loopsva | 1:fd536ebc7eaf | 403 | //printf("SxGuts3,%.32f\r\n", pow(ThetaCompPix, 4.0)); |
loopsva | 1:fd536ebc7eaf | 404 | //printf("SxGuts4,%.32f\r\n", pow(ThetaCompPix, 4.0) * TaK4); |
loopsva | 1:fd536ebc7eaf | 405 | //printf("SxGuts5,%.32f\r\n", pow(ThetaCompPix, 3.0) * VirComp + (pow(ThetaCompPix, 4.0) * TaK4)); |
loopsva | 1:fd536ebc7eaf | 406 | printf("SxGuts,%.32f\r\n", SxGuts); |
loopsva | 1:fd536ebc7eaf | 407 | printf("Sx,%.16f\r\n", Sx); |
loopsva | 0:8c2ddd9801ca | 408 | */ |
loopsva | 1:fd536ebc7eaf | 409 | printf("TempPxl,%.16f\r\n", TempPxl); |
loopsva | 1:fd536ebc7eaf | 410 | printf("\r\n"); |
loopsva | 1:fd536ebc7eaf | 411 | } |
loopsva | 1:fd536ebc7eaf | 412 | #endif |
loopsva | 1:fd536ebc7eaf | 413 | } |
loopsva | 1:fd536ebc7eaf | 414 | |
loopsva | 1:fd536ebc7eaf | 415 | |
loopsva | 1:fd536ebc7eaf | 416 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 1:fd536ebc7eaf | 417 | // Display internal registers for debugging math |
loopsva | 1:fd536ebc7eaf | 418 | |
loopsva | 1:fd536ebc7eaf | 419 | void MLX9062x::DumpRawRegs(mlx_struct& Pntr) { |
loopsva | 1:fd536ebc7eaf | 420 | #ifdef MLXTEST_621b |
loopsva | 1:fd536ebc7eaf | 421 | if(Pntr.mlxDevice == mlx90620) { |
loopsva | 1:fd536ebc7eaf | 422 | printf("\r\n\r\nMLX90620 Ta_T0 regs:\r\n"); |
loopsva | 1:fd536ebc7eaf | 423 | //printf("ConfigReg54 = %d\r\n", ConfigReg54); |
loopsva | 1:fd536ebc7eaf | 424 | //printf("ScaleCR54 = %d\r\n", ScaleCR54); |
loopsva | 1:fd536ebc7eaf | 425 | //printf("Ktbits = %02x\r\n",Pntr.MLXEEbuf[MLX621_KT12_SCALE]); |
loopsva | 1:fd536ebc7eaf | 426 | printf("Kt1,%d,%x\r\n", Kt1, Kt1); |
loopsva | 1:fd536ebc7eaf | 427 | //printf("Kt1_0xd2 = %d\r\n", 1 << ((Pntr.MLXEEbuf[MLX621_KT12_SCALE] & MLX621_KT1SCALE_BITS) >> 4)); |
loopsva | 1:fd536ebc7eaf | 428 | printf("Kt2,%d,%x\r\n", Kt2, Kt2); |
loopsva | 1:fd536ebc7eaf | 429 | //printf("Kt2_0xd2 = %d %x\r\n", 1 << (Pntr.MLXEEbuf[MLX621_KT12_SCALE] & MLX621_KT2SCALE_BITS), 1 << (Pntr.MLXEEbuf[MLX621_KT12_SCALE] & MLX621_KT2SCALE_BITS)); |
loopsva | 1:fd536ebc7eaf | 430 | //printf("Kt2_0xd2 2 = %d %x\r\n", 1 << 10 << (Pntr.MLXEEbuf[MLX621_KT12_SCALE] & MLX621_KT2SCALE_BITS), 1 << 10 << (Pntr.MLXEEbuf[MLX621_KT12_SCALE] & MLX621_KT2SCALE_BITS)); |
loopsva | 1:fd536ebc7eaf | 431 | printf("Vth25,%d,%x\r\n", Vth25, Vth25); |
loopsva | 1:fd536ebc7eaf | 432 | printf("Kt1_f,%f\r\n", Kt1_f); |
loopsva | 1:fd536ebc7eaf | 433 | printf("Kt2_f,%f\r\n", Kt2_f); |
loopsva | 1:fd536ebc7eaf | 434 | printf("Pntr.PtatD,%d,%x\r\n", Pntr.PtatD, Pntr.PtatD); |
loopsva | 1:fd536ebc7eaf | 435 | printf("Ta,%f\r\n", Ta); |
loopsva | 1:fd536ebc7eaf | 436 | //printf("Tak4 = %f\r\n", Tak4); |
loopsva | 1:fd536ebc7eaf | 437 | |
loopsva | 1:fd536ebc7eaf | 438 | //printf("MLX621_KS4_EE = %d\r\n", Pntr.MLXEEbuf[MLX621_KS4_EE]); |
loopsva | 1:fd536ebc7eaf | 439 | //printf("MLX621_KS_SCALE = %d\r\n", Pntr.MLXEEbuf[MLX621_KS_SCALE]); |
loopsva | 1:fd536ebc7eaf | 440 | //printf("ks4 = %d\r\n", ks4); |
loopsva | 1:fd536ebc7eaf | 441 | //printf("Acommon = %d\r\n", Acommon); |
loopsva | 1:fd536ebc7eaf | 442 | //printf("deltaAi621 = %d\r\n", deltaAi621); |
loopsva | 1:fd536ebc7eaf | 443 | //printf("deltaAiScale621 = %d\r\n", deltaAiScale621); |
loopsva | 1:fd536ebc7eaf | 444 | //printf("Ai_ij = %d\r\n", Ai_ij); |
loopsva | 1:fd536ebc7eaf | 445 | |
loopsva | 1:fd536ebc7eaf | 446 | //printf("BiScale621 = %d\r\n", BiScale621); |
loopsva | 1:fd536ebc7eaf | 447 | //printf("Bi_ijEEP = %d **\r\n", Bi_ijEEP); |
loopsva | 1:fd536ebc7eaf | 448 | //printf("Bi_ij = %d\r\n", Bi_ij); |
loopsva | 1:fd536ebc7eaf | 449 | |
loopsva | 1:fd536ebc7eaf | 450 | //printf("ACP_ee = %d **\r\n", ACP_ee); |
loopsva | 1:fd536ebc7eaf | 451 | //printf("aCP = %d\r\n", aCP); //was 8 bit, now 16 |
loopsva | 1:fd536ebc7eaf | 452 | |
loopsva | 1:fd536ebc7eaf | 453 | //printf("Vth(25) = %6d 0x%x\nTa1 = %6d 0x%x\nTa2 = %6d 0x%x\n", Vth25, Vth25, Kt1, Kt1, Kt2, Kt2); |
loopsva | 1:fd536ebc7eaf | 454 | //printf("Kt1_f = %f\nKt2_f = %f\nTa = %f\n\n", Kt1_f, Kt2_f, Ta); |
loopsva | 1:fd536ebc7eaf | 455 | //printf("Acp = %6d 0x%x\nBcp = %6d 0x%x\nThCP = %6d 0x%x\n", AcpX, AcpX, BcpX, BcpX, thetaCPX, thetaCPX); |
loopsva | 1:fd536ebc7eaf | 456 | //printf("TGC = %6d 0x%x\nBiS = %6d 0x%x\nTh0 = %6d 0x%x\n", TGCX, TGCX, BiScaleX, BiScaleX, theta0X, theta0X); |
loopsva | 1:fd536ebc7eaf | 457 | //printf("T0s = %6d 0x%x\nDts = %6d 0x%x\nelip = %6d 0x%x\n\n", theta0ScaleX, theta0ScaleX, deltaThetaScaleX, deltaThetaScaleX, elipsonX, elipsonX); |
loopsva | 1:fd536ebc7eaf | 458 | } else { |
loopsva | 1:fd536ebc7eaf | 459 | printf("\r\n\r\nMLX90621 Ta_T0 regs:\r\n"); |
loopsva | 1:fd536ebc7eaf | 460 | printf("ConfigReg54,%d,%02x\r\n", (Pntr.Config & MLX621_RESOLUTION) >> 4, (Pntr.Config & MLX621_RESOLUTION) >> 4); |
loopsva | 1:fd536ebc7eaf | 461 | printf("Pntr.PtatD,%d,%x\r\n", Pntr.PtatD, Pntr.PtatD); |
loopsva | 1:fd536ebc7eaf | 462 | printf("Vth25 mod,%d,%x\r\n", Vth25, Vth25); |
loopsva | 1:fd536ebc7eaf | 463 | printf("Kt1_f,%.16f\r\n", Kt1_f); |
loopsva | 1:fd536ebc7eaf | 464 | printf("Kt2_f,%.16f\r\n", Kt2_f); |
loopsva | 1:fd536ebc7eaf | 465 | printf("Ta,%.16f\r\n\r\n", Ta); |
loopsva | 1:fd536ebc7eaf | 466 | |
loopsva | 1:fd536ebc7eaf | 467 | printf("ScaleCR54,%d,%x\r\n", 1 << (3 - ((Pntr.Config & MLX621_RESOLUTION) >> 4)), 1 << (3 - ((Pntr.Config & MLX621_RESOLUTION) >> 4))); |
loopsva | 1:fd536ebc7eaf | 468 | printf("Ktbits,%02x\r\n",Pntr.MLXEEbuf[MLX621_KT12_SCALE]); |
loopsva | 1:fd536ebc7eaf | 469 | printf("Kt1,%d,%x\r\n", (int16_t)(Pntr.MLXEEbuf[MLX621_KT1_HI] << 8) | Pntr.MLXEEbuf[MLX621_KT1_LO], (Pntr.MLXEEbuf[MLX621_KT1_HI] << 8) | Pntr.MLXEEbuf[MLX621_KT1_LO]); |
loopsva | 1:fd536ebc7eaf | 470 | printf("Kt1_0xd2,%d\r\n", 1 << ((Pntr.MLXEEbuf[MLX621_KT12_SCALE] & MLX621_KT1SCALE_BITS) >> 4)); |
loopsva | 1:fd536ebc7eaf | 471 | printf("Kt1 mod,%d,%x\r\n", Kt1, Kt1); |
loopsva | 1:fd536ebc7eaf | 472 | printf("Kt2,%d,%x\r\n", (int16_t)((Pntr.MLXEEbuf[MLX621_KT2_HI] << 8) | Pntr.MLXEEbuf[MLX621_KT2_LO]), ((Pntr.MLXEEbuf[MLX621_KT2_HI] << 8) | Pntr.MLXEEbuf[MLX621_KT2_LO])); |
loopsva | 1:fd536ebc7eaf | 473 | printf("Kt2_0xd2,%d,%x\r\n", 1 << (Pntr.MLXEEbuf[MLX621_KT12_SCALE] & MLX621_KT2SCALE_BITS), 1 << (Pntr.MLXEEbuf[MLX621_KT12_SCALE] & MLX621_KT2SCALE_BITS)); |
loopsva | 1:fd536ebc7eaf | 474 | printf("Kt2_0xd2_2,%d,%x\r\n", 1 << 10 << (Pntr.MLXEEbuf[MLX621_KT12_SCALE] & MLX621_KT2SCALE_BITS), 1 << 10 << (Pntr.MLXEEbuf[MLX621_KT12_SCALE] & MLX621_KT2SCALE_BITS)); |
loopsva | 1:fd536ebc7eaf | 475 | printf("Kt2 mod,%d,%x\r\n", Kt2, Kt2); |
loopsva | 1:fd536ebc7eaf | 476 | printf("Vth25,%d,%x\r\n", (int16_t)(((Pntr.MLXEEbuf[MLX621_VTH25_HI] << 8) | Pntr.MLXEEbuf[MLX621_VTH25_LO])), (((Pntr.MLXEEbuf[MLX621_VTH25_HI] << 8) | Pntr.MLXEEbuf[MLX621_VTH25_LO]))); |
loopsva | 1:fd536ebc7eaf | 477 | printf("Kt1_f^2,%12f\r\n", pow(Kt1_f, 2.0)); |
loopsva | 1:fd536ebc7eaf | 478 | printf("Vth25-PtatD,%12f\r\n", (Vth25 - (double)Pntr.PtatD)); |
loopsva | 1:fd536ebc7eaf | 479 | printf("4*Kt2_f,%12f\r\n", 4.0 * Kt2_f); |
loopsva | 1:fd536ebc7eaf | 480 | printf("4*Kt2_f*(Vth25 - Pntr.PtatD),%12f\r\n", 4.0 * Kt2_f * (Vth25 - (double)Pntr.PtatD)); |
loopsva | 1:fd536ebc7eaf | 481 | printf("TopBeforesqrt,%12f\r\n", -pow(Kt1_f, 2.0) - 4.0 * Kt2_f * (Vth25 - (double)Pntr.PtatD)); |
loopsva | 1:fd536ebc7eaf | 482 | printf("\r\n"); |
loopsva | 1:fd536ebc7eaf | 483 | |
loopsva | 1:fd536ebc7eaf | 484 | printf("Acommon,%d,%x\r\n", (int16_t)(Pntr.MLXEEbuf[MLX621_A_COMMON_HI] << 8) + Pntr.MLXEEbuf[MLX621_A_COMMON_LO], (Pntr.MLXEEbuf[MLX621_A_COMMON_HI] << 8) + Pntr.MLXEEbuf[MLX621_A_COMMON_LO]); |
loopsva | 1:fd536ebc7eaf | 485 | printf("Acommon mod,%d,%x\r\n", Acommon, Acommon); |
loopsva | 1:fd536ebc7eaf | 486 | printf("Emiss,%d,%x\r\n", (uint16_t)((Pntr.MLXEEbuf[MLX621_A_EMMIS_HI] << 8) + Pntr.MLXEEbuf[MLX621_A_EMMIS_LO]), ((Pntr.MLXEEbuf[MLX621_A_EMMIS_HI] << 8) + Pntr.MLXEEbuf[MLX621_A_EMMIS_LO])); |
loopsva | 1:fd536ebc7eaf | 487 | printf("Emiss mod,%d,%x\r\n", Emiss, Emiss); |
loopsva | 1:fd536ebc7eaf | 488 | printf("ACP_ee,%d,%x\r\n", (int16_t)(Pntr.MLXEEbuf[MLX621_ACP_HI] << 8) + Pntr.MLXEEbuf[MLX621_ACP_LO], (Pntr.MLXEEbuf[MLX621_ACP_HI] << 8) + Pntr.MLXEEbuf[MLX621_ACP_LO]); |
loopsva | 1:fd536ebc7eaf | 489 | printf("ACP_ee mod,%d,%x\r\n", ACP_ee, ACP_ee); |
loopsva | 1:fd536ebc7eaf | 490 | printf("AlphaCP,%d,%x\r\n", (int16_t)((Pntr.MLXEEbuf[MLX621_ALPHACP_HI] << 8) + Pntr.MLXEEbuf[MLX621_ALPHACP_LO]), ((Pntr.MLXEEbuf[MLX621_ALPHACP_HI] << 8) + Pntr.MLXEEbuf[MLX621_ALPHACP_LO])); |
loopsva | 1:fd536ebc7eaf | 491 | printf("AlphaCP mod,%d,%x\r\n", AlphaCP, AlphaCP); |
loopsva | 1:fd536ebc7eaf | 492 | printf("aCP,%.16f\r\n", aCP); |
loopsva | 1:fd536ebc7eaf | 493 | printf("AiScale621,%d,%x\r\n", (int16_t)(Pntr.MLXEEbuf[MLX621_DELTA_ABI_SCALE] & MLX621_DAISCALE_BITS) >> 4, (Pntr.MLXEEbuf[MLX621_DELTA_ABI_SCALE] & MLX621_DAISCALE_BITS) >> 4); |
loopsva | 1:fd536ebc7eaf | 494 | printf("BiScale621,%d,%x\r\n", (int16_t)(Pntr.MLXEEbuf[MLX621_DELTA_ABI_SCALE] & MLX621_DBISCALE_BITS), (Pntr.MLXEEbuf[MLX621_DELTA_ABI_SCALE] & MLX621_DBISCALE_BITS)); |
loopsva | 1:fd536ebc7eaf | 495 | printf("bCP,%d,%x\r\n", (int8_t)Pntr.MLXEEbuf[MLX621_BCP], Pntr.MLXEEbuf[MLX621_BCP]); |
loopsva | 1:fd536ebc7eaf | 496 | printf("bCP mod,%.16f\r\n", bCP); |
loopsva | 1:fd536ebc7eaf | 497 | |
loopsva | 1:fd536ebc7eaf | 498 | printf("TempTCG,%d,%x\r\n", (int8_t)Pntr.MLXEEbuf[MLX621_TGC], Pntr.MLXEEbuf[MLX621_TGC]); |
loopsva | 1:fd536ebc7eaf | 499 | printf("TempTCG mod,%d,%x\r\n", TempTCG, TempTCG); |
loopsva | 1:fd536ebc7eaf | 500 | printf("Tgc621 mod,%.16f\r\n", Tgc621); |
loopsva | 1:fd536ebc7eaf | 501 | //printf("TGCReg,%d,%x\r\n", (int16_t)TGCReg, TGCReg); |
loopsva | 1:fd536ebc7eaf | 502 | printf("VCP,%d,%x\r\n", (int16_t)Pntr.VCP, Pntr.VCP); |
loopsva | 1:fd536ebc7eaf | 503 | printf("VcpCPOffComp,%.16f\r\n", VcpCPOffComp); |
loopsva | 1:fd536ebc7eaf | 504 | printf("KsTa,%d,%x\r\n", (int16_t)KsTa, KsTa); |
loopsva | 1:fd536ebc7eaf | 505 | printf("KsTaF,%.16f\r\n", KsTaF); |
loopsva | 1:fd536ebc7eaf | 506 | printf("Ks4_ee,%d,%x\r\n", (int16_t)Ks4_ee, Ks4_ee); |
loopsva | 1:fd536ebc7eaf | 507 | printf("Ks4_scale,%d,%x\r\n", Pntr.MLXEEbuf[MLX621_KS_SCALE], Pntr.MLXEEbuf[MLX621_KS_SCALE]); |
loopsva | 1:fd536ebc7eaf | 508 | printf("Ks4,%.16f\r\n", Ks4); |
loopsva | 1:fd536ebc7eaf | 509 | printf("TaK4,%.16f\r\n", TaK4); |
loopsva | 1:fd536ebc7eaf | 510 | printf("Th_0,%d,%x\r\n", (int16_t)Th_0, Th_0); |
loopsva | 1:fd536ebc7eaf | 511 | printf("Th_0_sc,%d,%x\r\n", (int16_t)Th_0_sc, Th_0_sc); |
loopsva | 1:fd536ebc7eaf | 512 | printf("d_Th_sc,%d,%x\r\n", (int16_t)d_Th_sc, d_Th_sc); |
loopsva | 1:fd536ebc7eaf | 513 | printf("\r\n"); |
loopsva | 1:fd536ebc7eaf | 514 | } |
loopsva | 1:fd536ebc7eaf | 515 | #endif |
loopsva | 1:fd536ebc7eaf | 516 | } |
loopsva | 1:fd536ebc7eaf | 517 | |
loopsva | 1:fd536ebc7eaf | 518 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 1:fd536ebc7eaf | 519 | // Initial Calculations for Ta and To |
loopsva | 1:fd536ebc7eaf | 520 | |
loopsva | 1:fd536ebc7eaf | 521 | void MLX9062x::CalcTa_To(mlx_struct& Pntr) { |
loopsva | 1:fd536ebc7eaf | 522 | #ifdef MLXTEST_621b |
loopsva | 1:fd536ebc7eaf | 523 | DSSetup(Pntr, 11); |
loopsva | 1:fd536ebc7eaf | 524 | #endif |
loopsva | 1:fd536ebc7eaf | 525 | if(Pntr.mlxDevice == mlx90620) { |
loopsva | 1:fd536ebc7eaf | 526 | //Calculate Ta first |
loopsva | 1:fd536ebc7eaf | 527 | Vth25 = (Pntr.MLXEEbuf[MLX_TAINDEX + 1] << 8) + Pntr.MLXEEbuf[MLX_TAINDEX + 0]; |
loopsva | 1:fd536ebc7eaf | 528 | Kt1 = (Pntr.MLXEEbuf[MLX_TAINDEX + 3] << 8) + Pntr.MLXEEbuf[MLX_TAINDEX + 2]; |
loopsva | 1:fd536ebc7eaf | 529 | Kt2 = (Pntr.MLXEEbuf[MLX_TAINDEX + 5] << 8) + Pntr.MLXEEbuf[MLX_TAINDEX + 4]; |
loopsva | 1:fd536ebc7eaf | 530 | if(Vth25 > 32767) Vth25 -= 65536; |
loopsva | 1:fd536ebc7eaf | 531 | if(Kt1 > 32767) Kt1 -= 65536; |
loopsva | 1:fd536ebc7eaf | 532 | if(Kt2 > 32767) Kt2 -= 65536; |
loopsva | 1:fd536ebc7eaf | 533 | |
loopsva | 1:fd536ebc7eaf | 534 | Kt1_f = (double)Kt1 / 1024.0f; |
loopsva | 1:fd536ebc7eaf | 535 | Kt2_f = (double)Kt2 / 1048576.0f; |
loopsva | 1:fd536ebc7eaf | 536 | ScaleCR54 = 1; |
loopsva | 1:fd536ebc7eaf | 537 | Ta = MLX9062x::GetDieTemp(Pntr); |
loopsva | 1:fd536ebc7eaf | 538 | |
loopsva | 1:fd536ebc7eaf | 539 | //Calculate To |
loopsva | 1:fd536ebc7eaf | 540 | AcpX = Pntr.MLXEEbuf[MLX621_A_COMMON_LO]; //[MLX_TOINDEX + 0]; |
loopsva | 1:fd536ebc7eaf | 541 | BcpX = Pntr.MLXEEbuf[MLX621_A_COMMON_HI]; //[MLX_TOINDEX + 1]; |
loopsva | 1:fd536ebc7eaf | 542 | //uint16_t thetaCPX = (EEbuf[MLX_TOINDEX + 3] << 8) + MLXEEbuf[MLX_TOINDEX + 2]; |
loopsva | 1:fd536ebc7eaf | 543 | TGCX = Pntr.MLXEEbuf[MLX_TGCX_REG]; //[MLX_TOINDEX + 4]; |
loopsva | 1:fd536ebc7eaf | 544 | BiScaleX = Pntr.MLXEEbuf[MLX621_DELTA_ABI_SCALE]; //[MLX_TOINDEX + 5]; |
loopsva | 1:fd536ebc7eaf | 545 | theta0X = (Pntr.MLXEEbuf[MLX_THETA0_REG_HI] << 8) + Pntr.MLXEEbuf[MLX_THETA0_REG_LO]; //[MLX_TOINDEX + 13] << 8) + Pntr.MLXEEbuf[MLX_TOINDEX + 12]; |
loopsva | 1:fd536ebc7eaf | 546 | theta0ScaleX = Pntr.MLXEEbuf[MLX_THETA0_SCALE_REG]; //[MLX_TOINDEX + 14]; |
loopsva | 1:fd536ebc7eaf | 547 | deltaThetaScaleX = Pntr.MLXEEbuf[MLX_DELTA_TH_SCALE_REG]; //[MLX_TOINDEX + 15]; |
loopsva | 1:fd536ebc7eaf | 548 | elipsonX = (Pntr.MLXEEbuf[MLX_EPSILON_REG_HI] << 8) + Pntr.MLXEEbuf[MLX_EPSILON_REG_LO]; //[MLX_TOINDEX + 17] << 8) + Pntr.MLXEEbuf[MLX_TOINDEX + 16]; |
loopsva | 1:fd536ebc7eaf | 549 | } else { |
loopsva | 1:fd536ebc7eaf | 550 | ConfigReg54 = (Pntr.Config & MLX621_RESOLUTION) >> 4; |
loopsva | 1:fd536ebc7eaf | 551 | ScaleCR54 = 1 << (3 - ((Pntr.Config & MLX621_RESOLUTION) >> 4)); //1 << (3 - ConfigReg54); |
loopsva | 1:fd536ebc7eaf | 552 | Kt1 = (int16_t)((Pntr.MLXEEbuf[MLX621_KT1_HI] << 8) | Pntr.MLXEEbuf[MLX621_KT1_LO]); |
loopsva | 1:fd536ebc7eaf | 553 | Kt2 = (int16_t)((Pntr.MLXEEbuf[MLX621_KT2_HI] << 8) | Pntr.MLXEEbuf[MLX621_KT2_LO]); |
loopsva | 1:fd536ebc7eaf | 554 | Vth25 = (int16_t)(((Pntr.MLXEEbuf[MLX621_VTH25_HI] << 8) | Pntr.MLXEEbuf[MLX621_VTH25_LO])); |
loopsva | 1:fd536ebc7eaf | 555 | |
loopsva | 1:fd536ebc7eaf | 556 | #ifdef MLXTEST_621 |
loopsva | 1:fd536ebc7eaf | 557 | #warning "MLX90620 test mode" |
loopsva | 1:fd536ebc7eaf | 558 | //for testing only |
loopsva | 1:fd536ebc7eaf | 559 | ConfigReg54 = 0; |
loopsva | 1:fd536ebc7eaf | 560 | ScaleCR54 = 1 << (3 - ConfigReg54); |
loopsva | 1:fd536ebc7eaf | 561 | Vth25 = 0x6420; |
loopsva | 1:fd536ebc7eaf | 562 | Kt1 = 0x5589; |
loopsva | 1:fd536ebc7eaf | 563 | Kt2 = 0x5e7e; |
loopsva | 1:fd536ebc7eaf | 564 | #endif |
loopsva | 1:fd536ebc7eaf | 565 | |
loopsva | 1:fd536ebc7eaf | 566 | if(Kt1 > 32767) Kt1 -= 65536; |
loopsva | 1:fd536ebc7eaf | 567 | if(Kt2 > 32767) Kt2 -= 65536; |
loopsva | 1:fd536ebc7eaf | 568 | if(Vth25 > 32767) Vth25 -= 65536; |
loopsva | 1:fd536ebc7eaf | 569 | Vth25 /= ScaleCR54; |
loopsva | 1:fd536ebc7eaf | 570 | Kt1_f = (double)Kt1 / ((1 << ((Pntr.MLXEEbuf[MLX621_KT12_SCALE] & MLX621_KT1SCALE_BITS) >> 4)) * ScaleCR54); |
loopsva | 1:fd536ebc7eaf | 571 | Kt2_f = (double)Kt2 / ((1 << 10 << (Pntr.MLXEEbuf[MLX621_KT12_SCALE] & MLX621_KT2SCALE_BITS)) * ScaleCR54); |
loopsva | 1:fd536ebc7eaf | 572 | Ta = MLX9062x::GetDieTemp(Pntr); |
loopsva | 1:fd536ebc7eaf | 573 | //double Tak4 = pow(Ta + 273.15, 4.0); |
loopsva | 1:fd536ebc7eaf | 574 | |
loopsva | 1:fd536ebc7eaf | 575 | Acommon = (int16_t)(Pntr.MLXEEbuf[MLX621_A_COMMON_HI] << 8) + Pntr.MLXEEbuf[MLX621_A_COMMON_LO]; |
loopsva | 1:fd536ebc7eaf | 576 | Emiss = (uint16_t)((Pntr.MLXEEbuf[MLX621_A_EMMIS_HI] << 8) + Pntr.MLXEEbuf[MLX621_A_EMMIS_LO]) / 32768; |
loopsva | 1:fd536ebc7eaf | 577 | ACP_ee = (int16_t)(Pntr.MLXEEbuf[MLX621_ACP_HI] << 8) + Pntr.MLXEEbuf[MLX621_ACP_LO]; |
loopsva | 1:fd536ebc7eaf | 578 | AlphaCP = (int16_t)((Pntr.MLXEEbuf[MLX621_ALPHACP_HI] << 8) + Pntr.MLXEEbuf[MLX621_ALPHACP_LO]) / ScaleCR54; |
loopsva | 1:fd536ebc7eaf | 579 | |
loopsva | 1:fd536ebc7eaf | 580 | if(Acommon > 32767) Acommon -= 65536; |
loopsva | 1:fd536ebc7eaf | 581 | //if(Emiss > 32767) Emiss -= 65536; |
loopsva | 1:fd536ebc7eaf | 582 | if(ACP_ee > 32767) ACP_ee -= 65536; |
loopsva | 1:fd536ebc7eaf | 583 | aCP = (float)(ACP_ee / ScaleCR54); |
loopsva | 1:fd536ebc7eaf | 584 | AiScale621 = (int16_t)(Pntr.MLXEEbuf[MLX621_DELTA_ABI_SCALE] & MLX621_DAISCALE_BITS) >> 4; |
loopsva | 1:fd536ebc7eaf | 585 | BiScale621 = (int16_t)(Pntr.MLXEEbuf[MLX621_DELTA_ABI_SCALE] & MLX621_DBISCALE_BITS); |
loopsva | 1:fd536ebc7eaf | 586 | bCP = (float)Pntr.MLXEEbuf[MLX621_BCP]; |
loopsva | 1:fd536ebc7eaf | 587 | if(bCP > 127.0f) bCP -= 256.0f; |
loopsva | 1:fd536ebc7eaf | 588 | bCP /= (pow(2.0f, (float)BiScale621) * (float)ScaleCR54); |
loopsva | 1:fd536ebc7eaf | 589 | TempTCG = Pntr.MLXEEbuf[MLX621_TGC]; |
loopsva | 1:fd536ebc7eaf | 590 | if(TempTCG > 127) TempTCG -= 256; |
loopsva | 1:fd536ebc7eaf | 591 | Tgc621 = (float)TempTCG / 32.0f; |
loopsva | 1:fd536ebc7eaf | 592 | TGCReg = GetTGCReg(Pntr); |
loopsva | 1:fd536ebc7eaf | 593 | if(Pntr.VCP > 32767) Pntr.VCP -= 65536; |
loopsva | 1:fd536ebc7eaf | 594 | VcpCPOffComp = (double)Pntr.VCP - ((double)aCP + bCP * (Ta - 25.0)); |
loopsva | 1:fd536ebc7eaf | 595 | KsTa = (Pntr.MLXEEbuf[MLX621_KSTA_HI] << 8) + Pntr.MLXEEbuf[MLX621_KSTA_LO]; |
loopsva | 1:fd536ebc7eaf | 596 | if(KsTa > 32767) KsTa -= 65536; |
loopsva | 1:fd536ebc7eaf | 597 | KsTaF = (double)KsTa / pow(2.0, 20); |
loopsva | 1:fd536ebc7eaf | 598 | Ks4_ee = Pntr.MLXEEbuf[MLX621_KS4_EE]; |
loopsva | 1:fd536ebc7eaf | 599 | if(Ks4_ee > 127) Ks4_ee -= 256; |
loopsva | 1:fd536ebc7eaf | 600 | Ks4 = (double)Ks4_ee / pow(2.0, (double)((Pntr.MLXEEbuf[MLX621_KS_SCALE] & 15) + 8.0)); |
loopsva | 1:fd536ebc7eaf | 601 | TaK4 = pow((Ta + 273.15), 4.0); |
loopsva | 1:fd536ebc7eaf | 602 | Th_0 = (Pntr.MLXEEbuf[MLX621_THETA0_HI] << 8) + Pntr.MLXEEbuf[MLX621_THETA0_LO]; |
loopsva | 1:fd536ebc7eaf | 603 | Th_0_sc = Pntr.MLXEEbuf[MLX621_THETA0_SCALE]; |
loopsva | 1:fd536ebc7eaf | 604 | d_Th_sc = Pntr.MLXEEbuf[MLX621_DELTA_TH_SCALE]; |
loopsva | 1:fd536ebc7eaf | 605 | } |
loopsva | 1:fd536ebc7eaf | 606 | DumpRawRegs(Pntr); |
loopsva | 0:8c2ddd9801ca | 607 | } |
loopsva | 0:8c2ddd9801ca | 608 | |
loopsva | 0:8c2ddd9801ca | 609 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 0:8c2ddd9801ca | 610 | // Pixel Temperature Calculation |
loopsva | 0:8c2ddd9801ca | 611 | |
loopsva | 1:fd536ebc7eaf | 612 | double MLX9062x::CalcPixel(mlx_struct& Pntr, int Pixel) { |
loopsva | 1:fd536ebc7eaf | 613 | if(Pntr.mlxDevice == mlx90620) { |
loopsva | 1:fd536ebc7eaf | 614 | AiPix = Pntr.MLXEEbuf[Pixel]; //eeprom address range 0x00 - 0x3f |
loopsva | 1:fd536ebc7eaf | 615 | BiPix = Pntr.MLXEEbuf[Pixel + 0x40]; //eeprom address range 0x40 - 0x7f |
loopsva | 1:fd536ebc7eaf | 616 | d_Th_Pix = Pntr.MLXEEbuf[Pixel + 0x80]; //eeprom address range 0x08 - 0xbf |
loopsva | 1:fd536ebc7eaf | 617 | VirPix = (Pntr.MLXRamBuf[Pixel * 2 + 1] << 8) + Pntr.MLXRamBuf[Pixel * 2]; //ram address range 0x000 - 0x08f, 16b |
loopsva | 1:fd536ebc7eaf | 618 | float Vcp_off_comp = Pntr.VCP - (AcpX + BcpX / powf(2.0f,BiScaleX) * (Ta - 25.0f)); |
loopsva | 1:fd536ebc7eaf | 619 | float VirPix_off_comp = VirPix - (AiPix + BiPix / powf(2.0f,BiScaleX) * (Ta - 25.0f)); |
loopsva | 1:fd536ebc7eaf | 620 | float VirPix_off_comp2 = (float(AiPix) + float(BiPix) / float(1 << BiScaleX) * (Ta - 25.0f)); |
loopsva | 1:fd536ebc7eaf | 621 | VirPix_off_comp2 = VirPix - VirPix_off_comp2; |
loopsva | 1:fd536ebc7eaf | 622 | float VirPix_tgc_comp = VirPix_off_comp - TGCX / 32.0 * Vcp_off_comp; |
loopsva | 1:fd536ebc7eaf | 623 | float elipsonf = elipsonX / 32768.0; |
loopsva | 1:fd536ebc7eaf | 624 | float VirPix_comp = VirPix_tgc_comp / elipsonf; |
loopsva | 1:fd536ebc7eaf | 625 | double theta28 = theta0X / powf(2.0, theta0ScaleX) + d_Th_Pix / powf(2.0, deltaThetaScaleX); |
loopsva | 1:fd536ebc7eaf | 626 | TempPxl = powf((VirPix_comp / theta28 + powf((Ta + 273.15f), 4.0f)), (1.0f / 4.0f)) - 273.15f; |
loopsva | 1:fd536ebc7eaf | 627 | } else { |
loopsva | 1:fd536ebc7eaf | 628 | AiPix = Pntr.MLXEEbuf[Pixel]; //eeprom address range 0x00 - 0x3f |
loopsva | 1:fd536ebc7eaf | 629 | BiPix = Pntr.MLXEEbuf[Pixel + 0x40]; //eeprom address range 0x40 - 0x7f |
loopsva | 1:fd536ebc7eaf | 630 | d_Th_Pix = Pntr.MLXEEbuf[Pixel + 0x80]; //eeprom address range 0x08 - 0xbf |
loopsva | 1:fd536ebc7eaf | 631 | VirPix = (Pntr.MLXRamBuf[Pixel * 2 + 1] << 8) + Pntr.MLXRamBuf[Pixel * 2]; //ram address range 0x000 - 0x08f, 16b |
loopsva | 1:fd536ebc7eaf | 632 | #ifdef MLXTEST_621b |
loopsva | 1:fd536ebc7eaf | 633 | VirPix = 0x01b7; |
loopsva | 1:fd536ebc7eaf | 634 | #endif |
loopsva | 1:fd536ebc7eaf | 635 | if(VirPix > 32767) VirPix -= 65536; |
loopsva | 1:fd536ebc7eaf | 636 | if(BiPix > 127) BiPix -= 256; |
loopsva | 1:fd536ebc7eaf | 637 | Ai_ij = (float)(Acommon + AiPix * pow(2.0, AiScale621)) / (float)ScaleCR54; |
loopsva | 1:fd536ebc7eaf | 638 | Bi_ij = (float)BiPix / (float)((1 << BiScale621) * ScaleCR54); |
loopsva | 1:fd536ebc7eaf | 639 | |
loopsva | 1:fd536ebc7eaf | 640 | VirOffComp = (float)VirPix - (Ai_ij + Bi_ij * (Ta - 25.0f)); |
loopsva | 1:fd536ebc7eaf | 641 | VirTGCComp = VirOffComp - Tgc621 * VcpCPOffComp; |
loopsva | 1:fd536ebc7eaf | 642 | VirComp = VirTGCComp / Emiss; |
loopsva | 1:fd536ebc7eaf | 643 | |
loopsva | 1:fd536ebc7eaf | 644 | ThPix = (((double)Th_0 / pow(2.0,(double)Th_0_sc) + ((double)d_Th_Pix / pow(2.0,(double)d_Th_sc)))) / ScaleCR54; |
loopsva | 1:fd536ebc7eaf | 645 | ThetaCP = (double)AlphaCP / (pow(2.0, (double)Th_0_sc) * ScaleCR54); |
loopsva | 1:fd536ebc7eaf | 646 | ThetaCompPix = (1.0 + KsTaF * (Ta - 25.0)) * (ThPix - Tgc621 * ThetaCP); |
loopsva | 1:fd536ebc7eaf | 647 | SxGuts = pow(ThetaCompPix, 3.0) * VirComp + (pow(ThetaCompPix, 4.0) * TaK4); |
loopsva | 1:fd536ebc7eaf | 648 | Sx = sqrt(SxGuts); |
loopsva | 1:fd536ebc7eaf | 649 | Sx = Ks4 * sqrt(Sx); |
loopsva | 1:fd536ebc7eaf | 650 | |
loopsva | 1:fd536ebc7eaf | 651 | TempPxl = ThetaCompPix * (1.0 - (Ks4 * 273.15)) + Sx; |
loopsva | 1:fd536ebc7eaf | 652 | TempPxl = (VirComp / TempPxl) + TaK4; |
loopsva | 1:fd536ebc7eaf | 653 | TempPxl = sqrt(TempPxl); |
loopsva | 1:fd536ebc7eaf | 654 | TempPxl = sqrt(TempPxl) - 273.15; |
loopsva | 1:fd536ebc7eaf | 655 | } |
loopsva | 1:fd536ebc7eaf | 656 | DumpPixRegs(Pntr, Pixel); |
loopsva | 0:8c2ddd9801ca | 657 | return(TempPxl); |
loopsva | 0:8c2ddd9801ca | 658 | } |
loopsva | 0:8c2ddd9801ca | 659 | |
loopsva | 0:8c2ddd9801ca | 660 | |
loopsva | 2:82782c73251e | 661 |