Kevin Braun / MLX9062x

Dependents:   KL25Z_MLX90620

Committer:
loopsva
Date:
Tue Jun 14 19:17:47 2016 +0000
Revision:
0:8c2ddd9801ca
Child:
1:fd536ebc7eaf
Removed dependencies from main() and created a data structure for shared data.  Also, changed variables.  i.e. was 'unsigned short' now 'uint16_t', etc.

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 0:8c2ddd9801ca 7 //these bufferes must reside in main.cpp
loopsva 0:8c2ddd9801ca 8 //extern char* MLXEEbuf; //256 uint8_ts, holds contents of EEPROM
loopsva 0:8c2ddd9801ca 9 //extern char* MLXRamBuf; //128 uint8_ts, 0x0 - 0x3f 'uint16_t', holds contents of RAM array
loopsva 0:8c2ddd9801ca 10 //extern char* MLXRamCmmd; // 8 uint8_ts, MLX90620 i2c command i/o buffer
loopsva 0:8c2ddd9801ca 11 /*
loopsva 0:8c2ddd9801ca 12 uint16_t Config = 0; //MLX90620 configuration register
loopsva 0:8c2ddd9801ca 13 uint16_t OscTrim = 0; //MLX90620 oscillator trim register
loopsva 0:8c2ddd9801ca 14 uint16_t PtatD = 0; //MLX90620 PTAT data register
loopsva 0:8c2ddd9801ca 15 int16_t VCP = 0; //VCP / TGC
loopsva 0:8c2ddd9801ca 16 int16_t Vth25X = 0;
loopsva 0:8c2ddd9801ca 17 float TaXX = 0.0;
loopsva 0:8c2ddd9801ca 18
loopsva 0:8c2ddd9801ca 19 //For To
loopsva 0:8c2ddd9801ca 20 int8_t AcpX = 0;
loopsva 0:8c2ddd9801ca 21 int8_t BcpX = 0;
loopsva 0:8c2ddd9801ca 22 float Kt1fX = 0.0;
loopsva 0:8c2ddd9801ca 23 float Kt2fX = 0.0;
loopsva 0:8c2ddd9801ca 24 int8_t TGCX = 0;
loopsva 0:8c2ddd9801ca 25 uint8_t BiScaleX = 0;
loopsva 0:8c2ddd9801ca 26 uint16_t theta0X = 0;
loopsva 0:8c2ddd9801ca 27 uint8_t theta0ScaleX = 0;
loopsva 0:8c2ddd9801ca 28 uint8_t deltaThetaScaleX = 0;
loopsva 0:8c2ddd9801ca 29 uint16_t elipsonX = 0;
loopsva 0:8c2ddd9801ca 30 int8_t AiPixelX = 0; //eeprom address range 0x00 - 0x3f
loopsva 0:8c2ddd9801ca 31 int8_t BiPixelX = 0; //eeprom address range 0x40 - 0x7f
loopsva 0:8c2ddd9801ca 32 uint8_t dThetaPixelX = 0; //eeprom address range 0x80 - 0xbf
loopsva 0:8c2ddd9801ca 33 int16_t VirPixelX = 0;
loopsva 0:8c2ddd9801ca 34 double TempPxlX = 0;
loopsva 0:8c2ddd9801ca 35 */
loopsva 0:8c2ddd9801ca 36
loopsva 0:8c2ddd9801ca 37 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:8c2ddd9801ca 38 // Constructor
loopsva 0:8c2ddd9801ca 39
loopsva 0:8c2ddd9801ca 40 MLX90620::MLX90620(PinName sda, PinName scl, const char* name) : _i2c(sda, scl){
loopsva 0:8c2ddd9801ca 41 _i2c.frequency(400000); //set up i2c speed
loopsva 0:8c2ddd9801ca 42 _i2c.stop(); //initialize with a stop
loopsva 0:8c2ddd9801ca 43 }
loopsva 0:8c2ddd9801ca 44
loopsva 0:8c2ddd9801ca 45 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:8c2ddd9801ca 46 //copy contents of EEPROM inside the MLX90620 into a local buffer. Data is used for lookup tables and parameters
loopsva 0:8c2ddd9801ca 47
loopsva 0:8c2ddd9801ca 48 #define MLX_EEP_EASY_LOAD 1
loopsva 0:8c2ddd9801ca 49
loopsva 0:8c2ddd9801ca 50 int MLX90620::LoadEEPROM(mlx_struct& Pntr) {
loopsva 0:8c2ddd9801ca 51
loopsva 0:8c2ddd9801ca 52 //clear out buffer first
loopsva 0:8c2ddd9801ca 53 for(int i = 0; i < 256; i++) { //option to clear out EEPROM buffer first
loopsva 0:8c2ddd9801ca 54 Pntr.MLXEEbuf[i] = 0;
loopsva 0:8c2ddd9801ca 55 }
loopsva 0:8c2ddd9801ca 56
loopsva 0:8c2ddd9801ca 57 //load the entire EEPROM
loopsva 0:8c2ddd9801ca 58 Pntr.MLXEEbuf[0] = 0; //start at address 0 of EEPROM
loopsva 0:8c2ddd9801ca 59 if(!_i2c.write(MLX_EEPADDR, Pntr.MLXEEbuf, 1, true)) { //send command, 0 returned is ok
loopsva 0:8c2ddd9801ca 60
loopsva 0:8c2ddd9801ca 61 #ifdef MLX_EEP_EASY_LOAD
loopsva 0:8c2ddd9801ca 62 _i2c.read((MLX_EEPADDR + 1), Pntr.MLXEEbuf, 256); //**** this command does not work with the KL25Z anv v63 of mbed.lbr !!!! //load contents of EEPROM
loopsva 0:8c2ddd9801ca 63 #else
loopsva 0:8c2ddd9801ca 64 _i2c.start();
loopsva 0:8c2ddd9801ca 65 _i2c.write(MLX_EEPADDR + 1);
loopsva 0:8c2ddd9801ca 66 for(int i = 0; i < 256; i++) {
loopsva 0:8c2ddd9801ca 67 Pntr.MLXEEbuf[i] = _i2c.read(1);
loopsva 0:8c2ddd9801ca 68 }
loopsva 0:8c2ddd9801ca 69 _i2c.stop();
loopsva 0:8c2ddd9801ca 70 #endif
loopsva 0:8c2ddd9801ca 71
loopsva 0:8c2ddd9801ca 72 } else {
loopsva 0:8c2ddd9801ca 73 _i2c.stop(); //don't read EEP if write is broken
loopsva 0:8c2ddd9801ca 74 return(1); //return with error
loopsva 0:8c2ddd9801ca 75 }
loopsva 0:8c2ddd9801ca 76 return(0); //return with ok
loopsva 0:8c2ddd9801ca 77 }
loopsva 0:8c2ddd9801ca 78
loopsva 0:8c2ddd9801ca 79 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:8c2ddd9801ca 80 //copy oscillator offset from MLXEEbuf to MLX90620 (MS byte = 0)
loopsva 0:8c2ddd9801ca 81
loopsva 0:8c2ddd9801ca 82 int MLX90620::SetOscTrimReg(mlx_struct& Pntr) {
loopsva 0:8c2ddd9801ca 83 Pntr.MLXRamCmmd[0] = 4; //command
loopsva 0:8c2ddd9801ca 84 Pntr.MLXRamCmmd[1] = Pntr.MLXEEbuf[MLX_EETRIM] - 0xaa; //LS byte check
loopsva 0:8c2ddd9801ca 85 Pntr.MLXRamCmmd[2] = Pntr.MLXEEbuf[MLX_EETRIM]; //oscillator trim value
loopsva 0:8c2ddd9801ca 86 Pntr.MLXRamCmmd[3] = 0x100 - 0xaa; //MS byte check
loopsva 0:8c2ddd9801ca 87 Pntr.MLXRamCmmd[4] = 0; //MS byte = 0
loopsva 0:8c2ddd9801ca 88 int r = _i2c.write(MLX_RAMADDR, Pntr.MLXRamCmmd, 5, false); //send command
loopsva 0:8c2ddd9801ca 89 return(r); //return ok or error
loopsva 0:8c2ddd9801ca 90 }
loopsva 0:8c2ddd9801ca 91
loopsva 0:8c2ddd9801ca 92 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:8c2ddd9801ca 93 //get oscillator offset register from MLX90620
loopsva 0:8c2ddd9801ca 94
loopsva 0:8c2ddd9801ca 95 uint16_t MLX90620::GetOscTrimReg(mlx_struct& Pntr) {
loopsva 0:8c2ddd9801ca 96 Pntr.MLXRamCmmd[0] = 2; //command
loopsva 0:8c2ddd9801ca 97 Pntr.MLXRamCmmd[1] = MLX_TRIM; //address of register
loopsva 0:8c2ddd9801ca 98 Pntr.MLXRamCmmd[2] = 0; //address step
loopsva 0:8c2ddd9801ca 99 Pntr.MLXRamCmmd[3] = 1; //# of reads
loopsva 0:8c2ddd9801ca 100 _i2c.write(MLX_RAMADDR, Pntr.MLXRamCmmd, 4, true); //send command
loopsva 0:8c2ddd9801ca 101 _i2c.read(MLX_RAMADDR, Pntr.MLXRamCmmd, 2); //get 16 bit register
loopsva 0:8c2ddd9801ca 102 Pntr.OscTrim = (Pntr.MLXRamCmmd[1] << 8) + Pntr.MLXRamCmmd[0]; //store register
loopsva 0:8c2ddd9801ca 103 return(Pntr.OscTrim); //return value
loopsva 0:8c2ddd9801ca 104 }
loopsva 0:8c2ddd9801ca 105
loopsva 0:8c2ddd9801ca 106 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:8c2ddd9801ca 107 //initialize the configuration register
loopsva 0:8c2ddd9801ca 108 //******* NOTE: Step measurement mode was removed from new data sheet dated Sept 19 2012
loopsva 0:8c2ddd9801ca 109
loopsva 0:8c2ddd9801ca 110 int MLX90620::SetConfigReg(mlx_struct& Pntr) {
loopsva 0:8c2ddd9801ca 111 Pntr.MLXRamCmmd[0] = 3; //command
loopsva 0:8c2ddd9801ca 112 //old mode
loopsva 0:8c2ddd9801ca 113 //MLXRamCmmd[1] = 0x14c - 0x55; //LS byte check
loopsva 0:8c2ddd9801ca 114 //MLXRamCmmd[2] = 0x4c; //LS config value, step meas mode, 4Hz array *******
loopsva 0:8c2ddd9801ca 115 Pntr.MLXRamCmmd[1] = 0x10c - 0x55; //LS byte check
loopsva 0:8c2ddd9801ca 116 Pntr.MLXRamCmmd[2] = 0x0c; //LS config value, normal mode, 4Hz array *******
loopsva 0:8c2ddd9801ca 117 Pntr.MLXRamCmmd[3] = 0x5c - 0x55; //MS byte check
loopsva 0:8c2ddd9801ca 118 Pntr.MLXRamCmmd[4] = 0x5c; //MS config value, 8Hz Ta, 400k i2c
loopsva 0:8c2ddd9801ca 119 int r = _i2c.write(MLX_RAMADDR, Pntr.MLXRamCmmd, 5, false);
loopsva 0:8c2ddd9801ca 120 return(r);
loopsva 0:8c2ddd9801ca 121 }
loopsva 0:8c2ddd9801ca 122
loopsva 0:8c2ddd9801ca 123 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:8c2ddd9801ca 124 //get configuration register from MLX90620
loopsva 0:8c2ddd9801ca 125
loopsva 0:8c2ddd9801ca 126 uint16_t MLX90620::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 0:8c2ddd9801ca 138 //get PTAT register from MLX90620
loopsva 0:8c2ddd9801ca 139
loopsva 0:8c2ddd9801ca 140 uint16_t MLX90620::GetPTATReg(mlx_struct& Pntr) {
loopsva 0:8c2ddd9801ca 141 Pntr.MLXRamCmmd[0] = 2; //command
loopsva 0:8c2ddd9801ca 142 Pntr.MLXRamCmmd[1] = MLX_PTATSENS; //address of register
loopsva 0:8c2ddd9801ca 143 Pntr.MLXRamCmmd[2] = 0; //address step
loopsva 0:8c2ddd9801ca 144 Pntr.MLXRamCmmd[3] = 1; //# of reads
loopsva 0:8c2ddd9801ca 145 _i2c.write(MLX_RAMADDR, Pntr.MLXRamCmmd, 4, true);
loopsva 0:8c2ddd9801ca 146 _i2c.read(MLX_RAMADDR, Pntr.MLXRamCmmd, 2);
loopsva 0:8c2ddd9801ca 147 Pntr.PtatD = (Pntr.MLXRamCmmd[1] << 8) + Pntr.MLXRamCmmd[0];
loopsva 0:8c2ddd9801ca 148 return(Pntr.PtatD);
loopsva 0:8c2ddd9801ca 149 }
loopsva 0:8c2ddd9801ca 150
loopsva 0:8c2ddd9801ca 151 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:8c2ddd9801ca 152 //get VCP / TGC register from MLX90620
loopsva 0:8c2ddd9801ca 153
loopsva 0:8c2ddd9801ca 154 int16_t MLX90620::GetTGCReg(mlx_struct& Pntr) {
loopsva 0:8c2ddd9801ca 155 Pntr.MLXRamCmmd[0] = 2; //command
loopsva 0:8c2ddd9801ca 156 Pntr.MLXRamCmmd[1] = MLX_TGCSENS; //address of register
loopsva 0:8c2ddd9801ca 157 Pntr.MLXRamCmmd[2] = 0; //address step
loopsva 0:8c2ddd9801ca 158 Pntr.MLXRamCmmd[3] = 1; //# of reads
loopsva 0:8c2ddd9801ca 159 _i2c.write(MLX_RAMADDR, Pntr.MLXRamCmmd, 4, true);
loopsva 0:8c2ddd9801ca 160 _i2c.read(MLX_RAMADDR, Pntr.MLXRamCmmd, 2);
loopsva 0:8c2ddd9801ca 161 VCP = (Pntr.MLXRamCmmd[1] << 8) + Pntr.MLXRamCmmd[0];
loopsva 0:8c2ddd9801ca 162 return(VCP);
loopsva 0:8c2ddd9801ca 163 }
loopsva 0:8c2ddd9801ca 164
loopsva 0:8c2ddd9801ca 165 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:8c2ddd9801ca 166 //get RAM dump from MLX90620
loopsva 0:8c2ddd9801ca 167 bool firstDump = false;
loopsva 0:8c2ddd9801ca 168
loopsva 0:8c2ddd9801ca 169 void MLX90620::LoadMLXRam(mlx_struct& Pntr) {
loopsva 0:8c2ddd9801ca 170 Pntr.MLXRamCmmd[0] = 2; //command
loopsva 0:8c2ddd9801ca 171 Pntr.MLXRamCmmd[1] = 0; //start address
loopsva 0:8c2ddd9801ca 172 Pntr.MLXRamCmmd[2] = 1; //address step
loopsva 0:8c2ddd9801ca 173 Pntr.MLXRamCmmd[3] = 0x40; //# of reads
loopsva 0:8c2ddd9801ca 174 _i2c.write(MLX_RAMADDR, Pntr.MLXRamCmmd, 4, true);
loopsva 0:8c2ddd9801ca 175 _i2c.read(MLX_RAMADDR, Pntr.MLXRamBuf, 0x80);
loopsva 0:8c2ddd9801ca 176 Pntr.PtatD = MLX90620::GetPTATReg(Pntr);
loopsva 0:8c2ddd9801ca 177 VCP = MLX90620::GetTGCReg(Pntr);
loopsva 0:8c2ddd9801ca 178 }
loopsva 0:8c2ddd9801ca 179
loopsva 0:8c2ddd9801ca 180 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:8c2ddd9801ca 181 //start measurement MLX90620
loopsva 0:8c2ddd9801ca 182
loopsva 0:8c2ddd9801ca 183 int MLX90620::StartMeasurement(mlx_struct& Pntr) {
loopsva 0:8c2ddd9801ca 184 Pntr.MLXRamCmmd[0] = 1; //command
loopsva 0:8c2ddd9801ca 185 Pntr.MLXRamCmmd[1] = 8; //address of config register
loopsva 0:8c2ddd9801ca 186 int r = _i2c.write(MLX_RAMADDR, Pntr.MLXRamCmmd, 2, false);
loopsva 0:8c2ddd9801ca 187 return(r);
loopsva 0:8c2ddd9801ca 188 }
loopsva 0:8c2ddd9801ca 189
loopsva 0:8c2ddd9801ca 190 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:8c2ddd9801ca 191 // Initial Calculations for Ta and To
loopsva 0:8c2ddd9801ca 192
loopsva 0:8c2ddd9801ca 193 float MLX90620::GetDieTemp(mlx_struct& Pntr) {
loopsva 0:8c2ddd9801ca 194 Pntr.PtatD = MLX90620::GetPTATReg(Pntr);
loopsva 0:8c2ddd9801ca 195 float TaX = (-Kt1fX + sqrt(pow(Kt1fX, 2.0f) - 4.0f * Kt2fX * ((float)(Vth25X - Pntr.PtatD))))/(2.0f * Kt2fX) + 25.0f;
loopsva 0:8c2ddd9801ca 196 return(TaX);
loopsva 0:8c2ddd9801ca 197 }
loopsva 0:8c2ddd9801ca 198
loopsva 0:8c2ddd9801ca 199 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:8c2ddd9801ca 200 // Initial Calculations for Ta and To
loopsva 0:8c2ddd9801ca 201
loopsva 0:8c2ddd9801ca 202 void MLX90620::CalcTa_To(mlx_struct& Pntr) {
loopsva 0:8c2ddd9801ca 203 //Calculate Ta first
loopsva 0:8c2ddd9801ca 204 Vth25X = (Pntr.MLXEEbuf[MLX_TAINDEX + 1] << 8) + Pntr.MLXEEbuf[MLX_TAINDEX + 0];
loopsva 0:8c2ddd9801ca 205 int16_t Kt1 = (Pntr.MLXEEbuf[MLX_TAINDEX + 3] << 8) + Pntr.MLXEEbuf[MLX_TAINDEX + 2];
loopsva 0:8c2ddd9801ca 206 int16_t Kt2 = (Pntr.MLXEEbuf[MLX_TAINDEX + 5] << 8) + Pntr.MLXEEbuf[MLX_TAINDEX + 4];
loopsva 0:8c2ddd9801ca 207 Kt1fX = Kt1 / 1024.0;
loopsva 0:8c2ddd9801ca 208 Kt2fX = Kt2 / 1048576.0;
loopsva 0:8c2ddd9801ca 209 TaXX = MLX90620::GetDieTemp(Pntr);
loopsva 0:8c2ddd9801ca 210
loopsva 0:8c2ddd9801ca 211 //Calculate To
loopsva 0:8c2ddd9801ca 212 AcpX = Pntr.MLXEEbuf[MLX_TOINDEX + 0];
loopsva 0:8c2ddd9801ca 213 BcpX = Pntr.MLXEEbuf[MLX_TOINDEX + 1];
loopsva 0:8c2ddd9801ca 214 // uint16_t thetaCPX = (EEbuf[MLX_TOINDEX + 3] << 8) + MLXEEbuf[MLX_TOINDEX + 2];
loopsva 0:8c2ddd9801ca 215 TGCX = Pntr.MLXEEbuf[MLX_TOINDEX + 4];
loopsva 0:8c2ddd9801ca 216 BiScaleX = Pntr.MLXEEbuf[MLX_TOINDEX + 5];
loopsva 0:8c2ddd9801ca 217 theta0X = (Pntr.MLXEEbuf[MLX_TOINDEX + 13] << 8) + Pntr.MLXEEbuf[MLX_TOINDEX + 12];
loopsva 0:8c2ddd9801ca 218 theta0ScaleX = Pntr.MLXEEbuf[MLX_TOINDEX + 14];
loopsva 0:8c2ddd9801ca 219 deltaThetaScaleX = Pntr.MLXEEbuf[MLX_TOINDEX + 15];
loopsva 0:8c2ddd9801ca 220 elipsonX = (Pntr.MLXEEbuf[MLX_TOINDEX + 17] << 8) + Pntr.MLXEEbuf[MLX_TOINDEX + 16];
loopsva 0:8c2ddd9801ca 221 /*
loopsva 0:8c2ddd9801ca 222 printf("Vth(25) = %6d 0x%x\nTa1 = %6d 0x%x\nTa2 = %6d 0x%x\n", Vth25X, Vth25X, Kt1, Kt1, Kt2, Kt2);
loopsva 0:8c2ddd9801ca 223 printf("Kt1fX = %f\nKt2fX = %f\nTaXX = %f\n\n", Kt1fX, Kt2fX, TaXX);
loopsva 0:8c2ddd9801ca 224 printf("Acp = %6d 0x%x\nBcp = %6d 0x%x\nThCP = %6d 0x%x\n", AcpX, AcpX, BcpX, BcpX, thetaCPX, thetaCPX);
loopsva 0:8c2ddd9801ca 225 printf("TGC = %6d 0x%x\nBiS = %6d 0x%x\nTh0 = %6d 0x%x\n", TGCX, TGCX, BiScaleX, BiScaleX, theta0X, theta0X);
loopsva 0:8c2ddd9801ca 226 printf("T0s = %6d 0x%x\nDts = %6d 0x%x\nelip = %6d 0x%x\n\n", theta0ScaleX, theta0ScaleX, deltaThetaScaleX, deltaThetaScaleX, elipsonX, elipsonX);
loopsva 0:8c2ddd9801ca 227 */
loopsva 0:8c2ddd9801ca 228 }
loopsva 0:8c2ddd9801ca 229
loopsva 0:8c2ddd9801ca 230 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:8c2ddd9801ca 231 // Pixel Temperature Calculation
loopsva 0:8c2ddd9801ca 232
loopsva 0:8c2ddd9801ca 233 double MLX90620::CalcPixel(mlx_struct& Pntr, int Pixel) {
loopsva 0:8c2ddd9801ca 234 AiPixelX = Pntr.MLXEEbuf[Pixel]; //eeprom address range 0x00 - 0x3f
loopsva 0:8c2ddd9801ca 235 BiPixelX = Pntr.MLXEEbuf[Pixel + 0x40]; //eeprom address range 0x40 - 0x7f
loopsva 0:8c2ddd9801ca 236 dThetaPixelX = Pntr.MLXEEbuf[Pixel + 0x80]; //eeprom address range 0x08 - 0xbf
loopsva 0:8c2ddd9801ca 237 VirPixelX = (Pntr.MLXRamBuf[Pixel * 2 + 1] << 8) + Pntr.MLXRamBuf[Pixel * 2]; //ram address range 0x000 - 0x08f, 16b
loopsva 0:8c2ddd9801ca 238 float Vcp_off_comp = VCP - (AcpX + BcpX / powf(2.0f,BiScaleX) * (TaXX - 25.0f));
loopsva 0:8c2ddd9801ca 239 float VirPixel_off_comp = VirPixelX - (AiPixelX + BiPixelX / powf(2.0f,BiScaleX) * (TaXX - 25.0f));
loopsva 0:8c2ddd9801ca 240 float VirPixel_off_comp2 = (float(AiPixelX) + float(BiPixelX) / float(1 << BiScaleX) * (TaXX - 25.0f));
loopsva 0:8c2ddd9801ca 241 VirPixel_off_comp2 = VirPixelX - VirPixel_off_comp2;
loopsva 0:8c2ddd9801ca 242 float VirPixel_tgc_comp = VirPixel_off_comp - TGCX / 32.0 * Vcp_off_comp;
loopsva 0:8c2ddd9801ca 243 float elipsonf = elipsonX / 32768.0;
loopsva 0:8c2ddd9801ca 244 float VirPixel_comp = VirPixel_tgc_comp / elipsonf;
loopsva 0:8c2ddd9801ca 245 double theta28 = theta0X / powf(2.0, theta0ScaleX) + dThetaPixelX / powf(2.0, deltaThetaScaleX);
loopsva 0:8c2ddd9801ca 246 double TempPxl = powf((VirPixel_comp / theta28 + powf((TaXX + 273.15f), 4.0f)), (1.0f / 4.0f)) - 273.15f;
loopsva 0:8c2ddd9801ca 247 /*
loopsva 0:8c2ddd9801ca 248 printf("\r\n\r\npixel = %d\r\n", Pixel);
loopsva 0:8c2ddd9801ca 249 printf("Acp = %d\r\nBcp = %d\r\nBiS = %d\r\n", AcpX, BcpX, BiScaleX);
loopsva 0:8c2ddd9801ca 250 printf("Vcp = %d\r\neps = %d\r\nTGC = %d\r\n", VCP, elipsonX, TGCX);
loopsva 0:8c2ddd9801ca 251 printf("Vcp_off_comp = %f\r\n", Vcp_off_comp);
loopsva 0:8c2ddd9801ca 252 printf("VirPixel_off_comp = %f\r\n", VirPixel_off_comp);
loopsva 0:8c2ddd9801ca 253 printf("VirPixel = %d\r\n", VirPixelX);
loopsva 0:8c2ddd9801ca 254 printf("AiPixel = %d\r\n", AiPixelX);
loopsva 0:8c2ddd9801ca 255 printf("BiPixel = %d\r\n", BiPixelX);
loopsva 0:8c2ddd9801ca 256 printf("BiScale = %d\r\n", BiScaleX);
loopsva 0:8c2ddd9801ca 257 printf("2^BiScale = %f\r\n", (powf(2.0,BiScaleX)));
loopsva 0:8c2ddd9801ca 258 printf("1 << BiScale = %d\r\n", (1 << BiScaleX));
loopsva 0:8c2ddd9801ca 259 printf("Ta-25.0 = %f\r\n", (TaXX - 25.0f));
loopsva 0:8c2ddd9801ca 260 printf("BiPix/2^BiScale = %f\r\n", (BiPixelX / powf(2.0,BiScaleX)));
loopsva 0:8c2ddd9801ca 261 printf("AiP+BiP/2^BiScale)*(Ta-25= %f\r\n", (AiPixelX + BiPixelX / powf(2.0,BiScaleX) * (TaXX - 25.0f)));
loopsva 0:8c2ddd9801ca 262 printf("VirPixel_off_comp again = %f\r\n", (VirPixelX - (AiPixelX + BiPixelX / powf(2.0,BiScaleX) * (TaXX - 25.0f))));
loopsva 0:8c2ddd9801ca 263 printf("VirPixel_off_comp2 step = %f\r\n", VirPixel_off_comp2);
loopsva 0:8c2ddd9801ca 264 printf("VirPixel_tgc_comp = %f\r\n", VirPixel_tgc_comp);
loopsva 0:8c2ddd9801ca 265 printf("elipsonf = %f\r\n", elipsonf);
loopsva 0:8c2ddd9801ca 266 printf("VirPixel_comp = %f\r\n", VirPixel_comp);
loopsva 0:8c2ddd9801ca 267 printf("theta28 = %f << double print problem\r\n", (theta28 * 100000000.0)); //<<< can't print a double
loopsva 0:8c2ddd9801ca 268 printf("TempPxl = %f\r\n", TempPxl);
loopsva 0:8c2ddd9801ca 269 */
loopsva 0:8c2ddd9801ca 270 return(TempPxl);
loopsva 0:8c2ddd9801ca 271 }
loopsva 0:8c2ddd9801ca 272
loopsva 0:8c2ddd9801ca 273
loopsva 0:8c2ddd9801ca 274
loopsva 0:8c2ddd9801ca 275