Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
MLX90620.cpp@0:8c2ddd9801ca, 2016-06-14 (annotated)
- 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?
| 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 | 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 |