Driver for the Melexis MLX90620 infrared temperature sensor array. 64 pixels in a 16 x 4 format. Updated driver for KL25Z

Dependents:   lpc812_mlx90620

Melexis MLX90620 home page:

Note: I had to delete the original repository and start a new one due to issues I had with publishing. It should be at Rev 2, but it starts fresh at Rev 0. The reason for the new revision was basic ic2 command cleanup in order to work with the KL25Z board.

The datasheet for the MLX90620 can be found here: http://www.melexis.com/MLX90620

Note that the conversion-start process that is used in the mbed driver, the "Step" mode in section 9.3.2, is not longer in the datasheet. It was last described in the datasheet dated 20120620. Step mode was bit 6 of the Configuration Register 0x92, section 8.2.2.1, Table 10. Melexis claims that the temperature readings were not as accurate as the back-to-back-to-back "Normal" continous conversion method.

However, in my main.cpp code, I do start another conversion immediately after the current conversion completes and all of the sensor array RAM values have been read. Then, I perform all of the floating point math and update the display while the new conversion is taking place. At 4 conversions per second using the KL25Z board, there is about 110mS of idle time before the new conversion is ready to be read out. Reading bits 8 and 9 in the Configuration Register tell you when it is time to read the sensor array RAM values.

The datasheet says the the MLX90620 needs to operate at 2.6V for best performance (certain versions can operate up to 3.0V). Use an LDO from 3.3V to generate 2.6V. Though you could use a regular diode to drop 3.3V to 2.6V, it is not consistent from diode-to-diode and the voltage drop will vary with temperature. I highly recommend using an LDO. And don't forget to use bypass caps!!! BTW: Though the device VCC is limited to 2.6V, the i2c I/O pins can operate at 3.3V.

With an mbed1768, the MLX90620 operates with an i2c frequency of 400KHz and 4 feet of 4-wire cable. I have not tried 4 feet on the KL25Z, but it does work at 1 foot. The i2c pullup resistors are 2.2k.

In the overall program that I use for the MLX90620 (to be published), an mbed1768 can run with a USB Serial output of 921600 baud, whereas the KL25Z is limited to 115200 baud. Anything faster on the KL25Z, output characters get dropped.

...kevin

Committer:
loopsva
Date:
Mon Jul 29 23:32:09 2013 +0000
Revision:
0:a86b8d0294ee
Added text title field in magenta

Who changed what in which revision?

UserRevisionLine numberNew contents of line
loopsva 0:a86b8d0294ee 1 //NOTE: "Step Measurement Mode" was removed from new MLX90620 data sheet, page 22 dated Sept 19 2012
loopsva 0:a86b8d0294ee 2 // which is used in this implementation
loopsva 0:a86b8d0294ee 3
loopsva 0:a86b8d0294ee 4 #include "mbed.h"
loopsva 0:a86b8d0294ee 5 #include "MLX90620.h"
loopsva 0:a86b8d0294ee 6
loopsva 0:a86b8d0294ee 7 extern char* EEbuf;
loopsva 0:a86b8d0294ee 8 extern char* RamBuf;
loopsva 0:a86b8d0294ee 9 extern char* RamCmmd; //must reside in main.cpp
loopsva 0:a86b8d0294ee 10
loopsva 0:a86b8d0294ee 11 const int PTATSENS = 0x90; //ram offset = 0x90, PTAT sensor reading, 16b
loopsva 0:a86b8d0294ee 12 const int TGCSENS = 0x91; //ram offset = 0x91, TGC sensor reading, 16b
loopsva 0:a86b8d0294ee 13 const int MLXCONFIG = 0x92; //ram offset = 0x92, config register, 16b
loopsva 0:a86b8d0294ee 14 const int MLXTRIM = 0x93; //ram offset = 0x93, oscillator trim, lsb>6b of 16b
loopsva 0:a86b8d0294ee 15 const int EETRIM = 0xf7; //eep offset = 0xf0, 1 byte, oscillator trim value
loopsva 0:a86b8d0294ee 16
loopsva 0:a86b8d0294ee 17 unsigned short Config = 0; //MLX90620 configuration register
loopsva 0:a86b8d0294ee 18 unsigned short OscTrim = 0; //MLX90620 oscillator trim register
loopsva 0:a86b8d0294ee 19 unsigned short PtatD = 0; //MLX90620 PTAT data register
loopsva 0:a86b8d0294ee 20 short VCP = 0; //VCP / TGC
loopsva 0:a86b8d0294ee 21 short Vth25X = 0;
loopsva 0:a86b8d0294ee 22 float TaXX = 0.0;
loopsva 0:a86b8d0294ee 23
loopsva 0:a86b8d0294ee 24 //For To
loopsva 0:a86b8d0294ee 25 signed char AcpX = 0;
loopsva 0:a86b8d0294ee 26 signed char BcpX = 0;
loopsva 0:a86b8d0294ee 27 float Kt1fX = 0.0;
loopsva 0:a86b8d0294ee 28 float Kt2fX = 0.0;
loopsva 0:a86b8d0294ee 29 signed char TGCX = 0;
loopsva 0:a86b8d0294ee 30 char BiScaleX = 0;
loopsva 0:a86b8d0294ee 31 unsigned short theta0X = 0;
loopsva 0:a86b8d0294ee 32 char theta0ScaleX = 0;
loopsva 0:a86b8d0294ee 33 char deltaThetaScaleX = 0;
loopsva 0:a86b8d0294ee 34 unsigned short elipsonX = 0;
loopsva 0:a86b8d0294ee 35 signed char AiPixelX = 0; //eeprom address range 0x00 - 0x3f
loopsva 0:a86b8d0294ee 36 signed char BiPixelX = 0; //eeprom address range 0x40 - 0x7f
loopsva 0:a86b8d0294ee 37 char dThetaPixelX = 0; //eeprom address range 0x80 - 0xbf
loopsva 0:a86b8d0294ee 38 short VirPixelX = 0;
loopsva 0:a86b8d0294ee 39 double TempPxlX = 0;
loopsva 0:a86b8d0294ee 40 const int TOINDEX = 0xd4; //eep offset = 0xD4 and 0xE0 (0xD4 + 0x0C), 6 bytes + 6 bytes
loopsva 0:a86b8d0294ee 41 const int TAINDEX = 0xda; //eep offset = 0xDA, 6 bytes
loopsva 0:a86b8d0294ee 42
loopsva 0:a86b8d0294ee 43 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:a86b8d0294ee 44 // Constructor
loopsva 0:a86b8d0294ee 45
loopsva 0:a86b8d0294ee 46 MLX90620::MLX90620(PinName sda, PinName scl, const char* name) : _i2c(sda, scl){
loopsva 0:a86b8d0294ee 47 _i2c.frequency(400000); //set up i2c speed
loopsva 0:a86b8d0294ee 48 _i2c.stop();
loopsva 0:a86b8d0294ee 49 }
loopsva 0:a86b8d0294ee 50
loopsva 0:a86b8d0294ee 51 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:a86b8d0294ee 52 //copy contents of EEPROM inside the MLX90620 into a local buffer. Data is used for lookup tables and parameters
loopsva 0:a86b8d0294ee 53
loopsva 0:a86b8d0294ee 54 int MLX90620::LoadEEPROM() {
loopsva 0:a86b8d0294ee 55 //clear out buffer first
loopsva 0:a86b8d0294ee 56 for(int i = 0; i < 256; i++) {
loopsva 0:a86b8d0294ee 57 EEbuf[i] = 0;
loopsva 0:a86b8d0294ee 58 }
loopsva 0:a86b8d0294ee 59
loopsva 0:a86b8d0294ee 60 //load the entire EEPROM
loopsva 0:a86b8d0294ee 61 EEbuf[0] = 0;
loopsva 0:a86b8d0294ee 62 if(!_i2c.write(0xa0, EEbuf, 1, true)) { //0 returned is ok
loopsva 0:a86b8d0294ee 63 _i2c.read(0xa0, EEbuf, 256); //load contents of EEPROM
loopsva 0:a86b8d0294ee 64 } else {
loopsva 0:a86b8d0294ee 65 _i2c.stop();
loopsva 0:a86b8d0294ee 66 return(1);
loopsva 0:a86b8d0294ee 67 }
loopsva 0:a86b8d0294ee 68 return(0);
loopsva 0:a86b8d0294ee 69 }
loopsva 0:a86b8d0294ee 70
loopsva 0:a86b8d0294ee 71 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:a86b8d0294ee 72 //copy oscillator offset from EEbuf to MLX90620 (MS byte = 0)
loopsva 0:a86b8d0294ee 73
loopsva 0:a86b8d0294ee 74 int MLX90620::SetOscTrimReg() {
loopsva 0:a86b8d0294ee 75 RamCmmd[0] = 4; //command
loopsva 0:a86b8d0294ee 76 RamCmmd[1] = EEbuf[EETRIM] - 0xaa; //LS byte check
loopsva 0:a86b8d0294ee 77 RamCmmd[2] = EEbuf[EETRIM]; //oscillator trim value
loopsva 0:a86b8d0294ee 78 RamCmmd[3] = 0x100 - 0xaa; //MS byte check
loopsva 0:a86b8d0294ee 79 RamCmmd[4] = 0; //MS byte = 0
loopsva 0:a86b8d0294ee 80 int r = _i2c.write(0xc0, RamCmmd, 5, false);
loopsva 0:a86b8d0294ee 81 return(r);
loopsva 0:a86b8d0294ee 82 }
loopsva 0:a86b8d0294ee 83
loopsva 0:a86b8d0294ee 84 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:a86b8d0294ee 85 //get oscillator offset register from MLX90620
loopsva 0:a86b8d0294ee 86
loopsva 0:a86b8d0294ee 87 unsigned short MLX90620::GetOscTrimReg() {
loopsva 0:a86b8d0294ee 88 RamCmmd[0] = 2; //command
loopsva 0:a86b8d0294ee 89 RamCmmd[1] = MLXTRIM; //address of register
loopsva 0:a86b8d0294ee 90 RamCmmd[2] = 0; //address step
loopsva 0:a86b8d0294ee 91 RamCmmd[3] = 1; //# of reads
loopsva 0:a86b8d0294ee 92 _i2c.write(0xc0, RamCmmd, 4, true);
loopsva 0:a86b8d0294ee 93 _i2c.read(0xc0, RamCmmd, 2);
loopsva 0:a86b8d0294ee 94 OscTrim = (RamCmmd[1] << 8) + RamCmmd[0];
loopsva 0:a86b8d0294ee 95 return(OscTrim);
loopsva 0:a86b8d0294ee 96 }
loopsva 0:a86b8d0294ee 97
loopsva 0:a86b8d0294ee 98 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:a86b8d0294ee 99 //initialize the configuration register
loopsva 0:a86b8d0294ee 100 //******* NOTE: Step measurement mode was removed from new data sheet dated Sept 19 2012
loopsva 0:a86b8d0294ee 101
loopsva 0:a86b8d0294ee 102 int MLX90620::SetConfigReg() {
loopsva 0:a86b8d0294ee 103 RamCmmd[0] = 3; //command
loopsva 0:a86b8d0294ee 104 RamCmmd[1] = 0x14c - 0x55; //LS byte check
loopsva 0:a86b8d0294ee 105 RamCmmd[2] = 0x4c; //LS config value, step meas mode, 4Hz array *******
loopsva 0:a86b8d0294ee 106 RamCmmd[3] = 0x5c - 0x55; //MS byte check
loopsva 0:a86b8d0294ee 107 RamCmmd[4] = 0x5c; //MS config value, 8Hz Ta, 400k i2c
loopsva 0:a86b8d0294ee 108 int r = _i2c.write(0xc0, RamCmmd, 5, false);
loopsva 0:a86b8d0294ee 109 return(r);
loopsva 0:a86b8d0294ee 110 }
loopsva 0:a86b8d0294ee 111
loopsva 0:a86b8d0294ee 112 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:a86b8d0294ee 113 //get configuration register from MLX90620
loopsva 0:a86b8d0294ee 114
loopsva 0:a86b8d0294ee 115 unsigned short MLX90620::GetConfigReg() {
loopsva 0:a86b8d0294ee 116 RamCmmd[0] = 2; //command
loopsva 0:a86b8d0294ee 117 RamCmmd[1] = MLXCONFIG; //address of register
loopsva 0:a86b8d0294ee 118 RamCmmd[2] = 0; //address step
loopsva 0:a86b8d0294ee 119 RamCmmd[3] = 1; //# of reads
loopsva 0:a86b8d0294ee 120 _i2c.write(0xc0, RamCmmd, 4, true);
loopsva 0:a86b8d0294ee 121 _i2c.read(0xc0, RamCmmd, 2);
loopsva 0:a86b8d0294ee 122 Config = (RamCmmd[1] << 8) + RamCmmd[0];
loopsva 0:a86b8d0294ee 123 return(Config);
loopsva 0:a86b8d0294ee 124 }
loopsva 0:a86b8d0294ee 125
loopsva 0:a86b8d0294ee 126 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:a86b8d0294ee 127 //get PTAT register from MLX90620
loopsva 0:a86b8d0294ee 128
loopsva 0:a86b8d0294ee 129 unsigned short MLX90620::GetPTATReg() {
loopsva 0:a86b8d0294ee 130 RamCmmd[0] = 2; //command
loopsva 0:a86b8d0294ee 131 RamCmmd[1] = PTATSENS; //address of register
loopsva 0:a86b8d0294ee 132 RamCmmd[2] = 0; //address step
loopsva 0:a86b8d0294ee 133 RamCmmd[3] = 1; //# of reads
loopsva 0:a86b8d0294ee 134 _i2c.write(0xc0, RamCmmd, 4, true);
loopsva 0:a86b8d0294ee 135 _i2c.read(0xc0, RamCmmd, 2);
loopsva 0:a86b8d0294ee 136 PtatD = (RamCmmd[1] << 8) + RamCmmd[0];
loopsva 0:a86b8d0294ee 137 return(PtatD);
loopsva 0:a86b8d0294ee 138 }
loopsva 0:a86b8d0294ee 139
loopsva 0:a86b8d0294ee 140 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:a86b8d0294ee 141 //get VCP / TGC register from MLX90620
loopsva 0:a86b8d0294ee 142
loopsva 0:a86b8d0294ee 143 short MLX90620::GetTGCReg() {
loopsva 0:a86b8d0294ee 144 RamCmmd[0] = 2; //command
loopsva 0:a86b8d0294ee 145 RamCmmd[1] = TGCSENS; //address of register
loopsva 0:a86b8d0294ee 146 RamCmmd[2] = 0; //address step
loopsva 0:a86b8d0294ee 147 RamCmmd[3] = 1; //# of reads
loopsva 0:a86b8d0294ee 148 _i2c.write(0xc0, RamCmmd, 4, true);
loopsva 0:a86b8d0294ee 149 _i2c.read(0xc0, RamCmmd, 2);
loopsva 0:a86b8d0294ee 150 VCP = (RamCmmd[1] << 8) + RamCmmd[0];
loopsva 0:a86b8d0294ee 151 return(VCP);
loopsva 0:a86b8d0294ee 152 }
loopsva 0:a86b8d0294ee 153
loopsva 0:a86b8d0294ee 154 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:a86b8d0294ee 155 //get RAM dump from MLX90620
loopsva 0:a86b8d0294ee 156 bool firstDump = false;
loopsva 0:a86b8d0294ee 157
loopsva 0:a86b8d0294ee 158 void MLX90620::LoadMLXRam() {
loopsva 0:a86b8d0294ee 159 RamCmmd[0] = 2; //command
loopsva 0:a86b8d0294ee 160 RamCmmd[1] = 0; //start address
loopsva 0:a86b8d0294ee 161 RamCmmd[2] = 1; //address step
loopsva 0:a86b8d0294ee 162 RamCmmd[3] = 0x40; //# of reads
loopsva 0:a86b8d0294ee 163 _i2c.write(0xc0, RamCmmd, 4, true);
loopsva 0:a86b8d0294ee 164 _i2c.read(0xc0, RamBuf, 0x80);
loopsva 0:a86b8d0294ee 165 PtatD = MLX90620::GetPTATReg();
loopsva 0:a86b8d0294ee 166 VCP = MLX90620::GetTGCReg();
loopsva 0:a86b8d0294ee 167 }
loopsva 0:a86b8d0294ee 168
loopsva 0:a86b8d0294ee 169 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:a86b8d0294ee 170 //start measurement MLX90620
loopsva 0:a86b8d0294ee 171
loopsva 0:a86b8d0294ee 172 int MLX90620::StartMeasurement() {
loopsva 0:a86b8d0294ee 173 RamCmmd[0] = 1; //command
loopsva 0:a86b8d0294ee 174 RamCmmd[1] = 8; //address of config register
loopsva 0:a86b8d0294ee 175
loopsva 0:a86b8d0294ee 176 int r = _i2c.write(0xc0, RamCmmd, 2, false);
loopsva 0:a86b8d0294ee 177 return(r);
loopsva 0:a86b8d0294ee 178 }
loopsva 0:a86b8d0294ee 179
loopsva 0:a86b8d0294ee 180 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:a86b8d0294ee 181 // Initial Calculations for Ta and To
loopsva 0:a86b8d0294ee 182
loopsva 0:a86b8d0294ee 183 float MLX90620::GetDieTemp() {
loopsva 0:a86b8d0294ee 184 PtatD = MLX90620::GetPTATReg();
loopsva 0:a86b8d0294ee 185 float TaX = (-Kt1fX + sqrtf(powf(Kt1fX, 2.0) - 4.0 * Kt2fX * (Vth25X - PtatD)))/(2.0 * Kt2fX) + 25.0;
loopsva 0:a86b8d0294ee 186 return(TaX);
loopsva 0:a86b8d0294ee 187 }
loopsva 0:a86b8d0294ee 188
loopsva 0:a86b8d0294ee 189 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:a86b8d0294ee 190 // Initial Calculations for Ta and To
loopsva 0:a86b8d0294ee 191
loopsva 0:a86b8d0294ee 192 void MLX90620::CalcTa_To() {
loopsva 0:a86b8d0294ee 193 //Calculate Ta first
loopsva 0:a86b8d0294ee 194 Vth25X = (EEbuf[TAINDEX + 1] << 8) + EEbuf[TAINDEX + 0];
loopsva 0:a86b8d0294ee 195 short Kt1 = (EEbuf[TAINDEX + 3] << 8) + EEbuf[TAINDEX + 2];
loopsva 0:a86b8d0294ee 196 short Kt2 = (EEbuf[TAINDEX + 5] << 8) + EEbuf[TAINDEX + 4];
loopsva 0:a86b8d0294ee 197 Kt1fX = Kt1 / 1024.0;
loopsva 0:a86b8d0294ee 198 Kt2fX = Kt2 / 1048576.0;
loopsva 0:a86b8d0294ee 199 TaXX = MLX90620::GetDieTemp();
loopsva 0:a86b8d0294ee 200
loopsva 0:a86b8d0294ee 201 //Calculate To
loopsva 0:a86b8d0294ee 202 AcpX = EEbuf[TOINDEX + 0];
loopsva 0:a86b8d0294ee 203 BcpX = EEbuf[TOINDEX + 1];
loopsva 0:a86b8d0294ee 204 // unsigned short thetaCPX = (EEbuf[TOINDEX + 3] << 8) + EEbuf[TOINDEX + 2];
loopsva 0:a86b8d0294ee 205 TGCX = EEbuf[TOINDEX + 4];
loopsva 0:a86b8d0294ee 206 BiScaleX = EEbuf[TOINDEX + 5];
loopsva 0:a86b8d0294ee 207 theta0X = (EEbuf[TOINDEX + 13] << 8) + EEbuf[TOINDEX + 12];
loopsva 0:a86b8d0294ee 208 theta0ScaleX = EEbuf[TOINDEX + 14];
loopsva 0:a86b8d0294ee 209 deltaThetaScaleX = EEbuf[TOINDEX + 15];
loopsva 0:a86b8d0294ee 210 elipsonX = (EEbuf[TOINDEX + 17] << 8) + EEbuf[TOINDEX + 16];
loopsva 0:a86b8d0294ee 211 /*
loopsva 0:a86b8d0294ee 212 printf("Vth(25) = %6d 0x%x\nTa1 = %6d 0x%x\nTa2 = %6d 0x%x\n", Vth25X, Vth25X, Kt1, Kt1, Kt2, Kt2);
loopsva 0:a86b8d0294ee 213 printf("Kt1fX = %f\nKt2fX = %f\nTaXX = %f\n\n", Kt1fX, Kt2fX, TaXX);
loopsva 0:a86b8d0294ee 214 printf("Acp = %6d 0x%x\nBcp = %6d 0x%x\nThCP = %6d 0x%x\n", AcpX, AcpX, BcpX, BcpX, thetaCPX, thetaCPX);
loopsva 0:a86b8d0294ee 215 printf("TGC = %6d 0x%x\nBiS = %6d 0x%x\nTh0 = %6d 0x%x\n", TGCX, TGCX, BiScaleX, BiScaleX, theta0X, theta0X);
loopsva 0:a86b8d0294ee 216 printf("T0s = %6d 0x%x\nDts = %6d 0x%x\nelip = %6d 0x%x\n\n", theta0ScaleX, theta0ScaleX, deltaThetaScaleX, deltaThetaScaleX, elipsonX, elipsonX);
loopsva 0:a86b8d0294ee 217 */
loopsva 0:a86b8d0294ee 218 }
loopsva 0:a86b8d0294ee 219
loopsva 0:a86b8d0294ee 220 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:a86b8d0294ee 221 // Pixel Temperature Calculation
loopsva 0:a86b8d0294ee 222
loopsva 0:a86b8d0294ee 223 double MLX90620::CalcPixel(int Pixel) {
loopsva 0:a86b8d0294ee 224 AiPixelX = EEbuf[Pixel]; //eeprom address range 0x00 - 0x3f
loopsva 0:a86b8d0294ee 225 BiPixelX = EEbuf[Pixel + 0x40]; //eeprom address range 0x40 - 0x7f
loopsva 0:a86b8d0294ee 226 dThetaPixelX = EEbuf[Pixel + 0x80]; //eeprom address range 0x08 - 0xbf
loopsva 0:a86b8d0294ee 227 VirPixelX = (RamBuf[Pixel * 2 + 1] << 8) + RamBuf[Pixel * 2]; //ram address range 0x000 - 0x08f, 16b
loopsva 0:a86b8d0294ee 228 float Vcp_off_comp = VCP - (AcpX + BcpX / powf(2.0,BiScaleX) * (TaXX - 25.0));
loopsva 0:a86b8d0294ee 229 float VirPixel_off_comp = VirPixelX - (AiPixelX + BiPixelX / powf(2.0,BiScaleX) * (TaXX - 25.0));
loopsva 0:a86b8d0294ee 230 float VirPixel_off_comp2 = (float(AiPixelX) + float(BiPixelX) / float(1 << BiScaleX) * (TaXX - 25.0));
loopsva 0:a86b8d0294ee 231 VirPixel_off_comp2 = VirPixelX - VirPixel_off_comp2;
loopsva 0:a86b8d0294ee 232 float VirPixel_tgc_comp = VirPixel_off_comp - TGCX / 32.0 * Vcp_off_comp;
loopsva 0:a86b8d0294ee 233 float elipsonf = elipsonX / 32768.0;
loopsva 0:a86b8d0294ee 234 float VirPixel_comp = VirPixel_tgc_comp / elipsonf;
loopsva 0:a86b8d0294ee 235 double theta28 = theta0X / powf(2.0, theta0ScaleX) + dThetaPixelX / powf(2.0, deltaThetaScaleX);
loopsva 0:a86b8d0294ee 236 double TempPxl = powf((VirPixel_comp / theta28 + powf((TaXX + 273.15), 4.0)), (1.0 / 4.0)) - 273.15;
loopsva 0:a86b8d0294ee 237 /*
loopsva 0:a86b8d0294ee 238 printf("pixel = %d\n", Pixel);
loopsva 0:a86b8d0294ee 239 printf("Acp = %d\nBcp = %d\nBiS = %d\n", AcpX, BcpX, BiScaleX);
loopsva 0:a86b8d0294ee 240 printf("Vcp = %d\neps = %d\nTGC = %d\n", VCP, elipsonX, TGCX);
loopsva 0:a86b8d0294ee 241 printf("Vcp_off_comp = %f\n", Vcp_off_comp);
loopsva 0:a86b8d0294ee 242 printf("VirPixel_off_comp = %f\n", VirPixel_off_comp);
loopsva 0:a86b8d0294ee 243 printf("VirPixel = %d\n", VirPixelX);
loopsva 0:a86b8d0294ee 244 printf("AiPixel = %d\n", AiPixelX);
loopsva 0:a86b8d0294ee 245 printf("BiPixel = %d\n", BiPixelX);
loopsva 0:a86b8d0294ee 246 printf("BiScale = %d\n", BiScaleX);
loopsva 0:a86b8d0294ee 247 printf("2^BiScale = %f\n", (powf(2.0,BiScaleX)));
loopsva 0:a86b8d0294ee 248 printf("1 << BiScale = %d\n", (1 << BiScaleX));
loopsva 0:a86b8d0294ee 249 printf("Ta-25.0 = %f\n", (TaXX - 25.0));
loopsva 0:a86b8d0294ee 250 printf("BiPix/2^BiScale = %f\n", (BiPixelX / powf(2.0,BiScaleX)));
loopsva 0:a86b8d0294ee 251 printf("AiP+BiP/2^BiScale)*(Ta-25= %f\n", (AiPixelX + BiPixelX / powf(2.0,BiScaleX) * (TaXX - 25.0)));
loopsva 0:a86b8d0294ee 252 printf("VirPixel_off_comp again = %f\n", (VirPixelX - (AiPixelX + BiPixelX / powf(2.0,BiScaleX) * (TaXX - 25.0))));
loopsva 0:a86b8d0294ee 253 printf("VirPixel_off_comp2 step = %f\n", VirPixel_off_comp2);
loopsva 0:a86b8d0294ee 254 printf("VirPixel_tgc_comp = %f\n", VirPixel_tgc_comp);
loopsva 0:a86b8d0294ee 255 printf("elipsonf = %f\n", elipsonf);
loopsva 0:a86b8d0294ee 256 printf("VirPixel_comp = %f\n", VirPixel_comp);
loopsva 0:a86b8d0294ee 257 printf("theta28 = %f << double print problem\n", (theta28 * 100000000.0)); //<<< can't print a double
loopsva 0:a86b8d0294ee 258 printf("TempPxl = %f\n", TempPxl);
loopsva 0:a86b8d0294ee 259 */
loopsva 0:a86b8d0294ee 260 return(TempPxl);
loopsva 0:a86b8d0294ee 261 }
loopsva 0:a86b8d0294ee 262