Melexis MLX90620 and MLX90621, non-contact, 16x4 infrared array temperature sensor device driver.

Dependents:   KL25Z_MLX90620

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?

UserRevisionLine numberNew 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