Melexis MLX90620 and MLX90621, non-contact, 16x4 infrared array temperature sensor device driver.
Embed:
(wiki syntax)
Show/hide line numbers
MLX90620.h
00001 #ifndef MLX90620_H 00002 #define MLX90620_H 00003 00004 #include "mbed.h" 00005 00006 #define MLX_EEPADDR 0xa0 //eep i2c address 00007 #define MLX_RAMADDR 0xc0 //ram i2c address 00008 00009 //EEPROM offsets 00010 #define MLX620_PTATSENS 0x90 //PTAT sensor reading for MLX90620, 16b 00011 #define MLX621_PTATSENS 0x40 //PTAT sensor reading for MLX90621, 16b 00012 #define MLX620_TGCSENS 0x91 //TGC sensor reading for MLX90620, 16b 00013 #define MLX621_TGCSENS 0x41 //TGC sensor reading for MLX90621, 16b 00014 #define MLX_CONFIG 0x92 //config register, 16b 00015 #define MLX_TRIM 0x93 //oscillator trim, lsb>6b of 16b 00016 00017 #define MLX621_EE_ID_BASE 0xf8 //8 bytes, ID info 00018 #define MLX620_EETRIM 0xf7 //1 byte, oscillator trim value 00019 #define MLX621_CONFIG_LO 0xf5 //Config reg, lo byte 00020 #define MLX621_CONFIG_HI 0xf6 //Config reg, hi byte 00021 00022 #define MLX_TOINDEX 0xd4 //0xD4 and 0xE0 (0xD4 + 0x0C), 6 bytes + 6 bytes 00023 #define MLX_TAINDEX 0xda //0xDA, 6 bytes 00024 00025 #define MLX621_KT1SCALE_BITS 0xf0 //Kt1_scale bits 7:4 00026 #define MLX621_KT2SCALE_BITS 0x0f //Kt2_scale bits 3:0 00027 00028 #define MLX621_KS_SCALE 0xc0 //KS scaling register 00029 #define MLX621_KS4_EE 0xc4 //Ks4_ee register 00030 00031 #define MLX621_A_COMMON_LO 0xd0 //Acommon register, lo byte 00032 #define MLX621_A_COMMON_HI 0xd1 //Acommon register, hi byte 00033 #define MLX621_KT12_SCALE 0xd2 //Kt1_Kt2__scale register 00034 #define MLX621_ACP_LO 0xd3 //ACP register, lo byte 00035 #define MLX621_ACP_HI 0xd4 //ACP register, hi byte 00036 #define MLX621_BCP 0xd5 //BCP register 00037 #define MLX621_ALPHACP_LO 0xd6 //AlphaCP register, lo byte 00038 #define MLX621_ALPHACP_HI 0xd7 //AlphaCP register, hi byte 00039 #define MLX621_TGC 0xd8 //TGC reg 00040 #define MLX621_DELTA_ABI_SCALE 0xd9 //deltaAi_deltaBi_scale register 00041 #define MLX621_VTH25_LO 0xda //Vth(25) register lo byte 00042 #define MLX621_VTH25_HI 0xdb //Vth(25) register hi byte 00043 #define MLX621_KT1_LO 0xdc //Kt1 register lo byte 00044 #define MLX621_KT1_HI 0xdd //Kt1 register lo byte 00045 #define MLX621_KT2_LO 0xde //Kt2 register lo byte 00046 #define MLX621_KT2_HI 0xdf //Kt2 register lo byte 00047 00048 #define MLX621_THETA0_LO 0xe0 //theta 0 register, lo byte 00049 #define MLX621_THETA0_HI 0xe1 //theta 0 register, hi byte 00050 #define MLX621_THETA0_SCALE 0xe2 //theta 0 scale register 00051 #define MLX621_DELTA_TH_SCALE 0xe3 //delta theta scale register 00052 #define MLX621_A_EMMIS_LO 0xe4 //emissivity register, lo byte 00053 #define MLX621_A_EMMIS_HI 0xe5 //emissivity register, hi byte 00054 #define MLX621_KSTA_LO 0xe6 //KsTa register, lo byte 00055 #define MLX621_KSTA_HI 0xe7 //KsTa register, hi byte 00056 00057 #define MLX621_DELTA_AI_LO 0x3f //deltaAi register, lo byte 00058 #define MLX621_DELTA_AI_HI 0x00 //deltaAi register, hi byte 00059 00060 00061 #define MLX621_DAISCALE_BITS 0xf0 //deltaAi_scale bits 7:4 00062 #define MLX621_DBISCALE_BITS 0x0f //deltaBi_scale bits 3:0 00063 #define MLX621_KS_SCALE_BITS 0x0f //KS scaling bits (3:0) 00064 00065 #define MLX621_BIIJ_EEP_LO 0x00 //Bi(ij)eeprom lo byte ******NEED ADDRESS****** 00066 #define MLX621_BIIJ_EEP_HI 0x00 //Bi(ij)eeprom lo byte 00067 00068 #define MLX_TGCX_REG MLX_TOINDEX + 4 00069 #define MLX_THETA0_REG_LO MLX_TOINDEX + 12 00070 #define MLX_THETA0_REG_HI MLX_TOINDEX + 13 00071 #define MLX_THETA0_SCALE_REG MLX_TOINDEX + 14 00072 #define MLX_DELTA_TH_SCALE_REG MLX_TOINDEX + 15 00073 #define MLX_EPSILON_REG_LO MLX_TOINDEX + 16 00074 #define MLX_EPSILON_REG_HI MLX_TOINDEX + 17 00075 00076 //CONFIG register bit equates 00077 #define MLX_BRNOUTFLAG 0x0400 //brownout flag, 0 = brownout occured 00078 #define MLX_IRMEASFLAG 0x0200 //IR measurement, 1 = measurement in progress 00079 #define MLX_TAMEASFLAG 0x0100 //TA measurement, 1 = measurement in progress 00080 00081 #define MLX621_EEP_ENA 0x1000 //mlx621 enable EEPROM access 00082 #define MLX621_RESOLUTION 0x0030 //mlx621 resolution bits 5 & 4 00083 00084 //config register equates 00085 #define MLX621_CONF_LO_REF_ENA 0x4000 //default 00086 #define MLX621_CONF_HI_REF_ENA 0x0000 00087 #define MLX621_CONF_EEP_DIS 0x1000 00088 #define MLX621_CONF_EEP_ENA 0x0000 //seems like default 00089 00090 #define MLX621_CONF_I2C_1MB 0x0000 //default 00091 #define MLX621_CONF_I2C_400K 0x0800 00092 #define MLX621_CONF_MD_1 0x0400 //default MD must write a "1" when uploading Config Reg 00093 #define MLX621_CONF_POR 0x0000 //POR or Brownout occured 00094 #define MLX621_CONF_IR_BUSY 0x0200 //IR measurement running 00095 #define MLX621_CONF_IR_IDLE 0x0000 //IR measurement -not- running 00096 00097 #define MLX621_CONF_MODE_SLEEP 0x0080 //sleep mode 00098 #define MLX621_CONF_MODE_NORM 0x0000 //default, normal mode 00099 #define MLX621_CONF_MODE_STEP 0x0040 //step mode 00100 #define MLX621_CONF_MODE_CONT 0x0000 //default, continious mode 00101 #define MLX621_CONF_ADC_MASK 0x0030 //ADC mask bits 00102 #define MLX621_CONF_ADC18 0x0030 //default, ADC in 18 bit mode 00103 #define MLX621_CONF_ADC17 0x0020 //ADC in 17 bit mode 00104 #define MLX621_CONF_ADC16 0x0010 //ADC in 16 bit mode 00105 #define MLX621_CONF_ADC15 0x0000 //ADC in 15 bit mode 00106 00107 #define MLX621_CONF_REF_MASK 0x000f //refresh mask bits 00108 #define MLX621_CONF_REF_HALF 0x000f //refresh rate 0.5Hz 00109 #define MLX621_CONF_REF_1 0x000e //default, refresh rate 1Hz 00110 #define MLX621_CONF_REF_2 0x000d //refresh rate 2Hz 00111 #define MLX621_CONF_REF_4 0x000c //refresh rate 4Hz 00112 #define MLX621_CONF_REF_8 0x000b //refresh rate 8Hz 00113 #define MLX621_CONF_REF_16 0x000a //refresh rate 16Hz 00114 #define MLX621_CONF_REF_32 0x0009 //refresh rate 32Hz 00115 #define MLX621_CONF_REF_64 0x0008 //refresh rate 64Hz 00116 #define MLX621_CONF_REF_128 0x0007 //refresh rate 128Hz 00117 #define MLX621_CONF_REF_256 0x0006 //refresh rate 256Hz 00118 #define MLX621_CONF_REF_512 0x0005 //refresh rate 512Hz 00119 #define MLX621_CONF_REF_512a 0x0004 //refresh rate 512Hz 00120 #define MLX621_CONF_REF_512b 0x0003 //refresh rate 512Hz 00121 #define MLX621_CONF_REF_512c 0x0002 //refresh rate 512Hz 00122 #define MLX621_CONF_REF_512d 0x0001 //refresh rate 512Hz 00123 #define MLX621_CONF_REF_512e 0x0000 //refresh rate 512Hz 00124 00125 /** Software routines to access the Melexis MLX90620 and MLX90621 64 pixel (4 X 16) infrared sensor array 00126 * The MLX9062x's internal RAM has different i2c behavior than it's internal EEPROM 00127 * As a result, the MLX9062x's RAM uses more primitive mbed i2c commands than does the EEPROM. 00128 * 00129 */ 00130 /* MLX9062x controller class 00131 */ 00132 class MLX9062x { 00133 00134 public: 00135 00136 /** 00137 * Select device MLX90620 or MLX90621 00138 * 00139 **/ 00140 enum MLXdevice { 00141 mlx90620, //device is an MLX90620 00142 mlx90621, //device is an MLX90620 00143 }; 00144 00145 /** 00146 * Public data structure for MLX9062x data values. 00147 * 00148 **/ 00149 typedef struct { 00150 uint16_t Config ; /*!< MLX9062x configuration register*/ 00151 uint16_t OscTrim ; /*!< MLX9062x oscillator trim register*/ 00152 uint16_t PtatD ; /*!< MLX9062x PTAT data register*/ 00153 int16_t VCP ; /*!< MLX90621 VCP data register*/ 00154 int mlxDevice ; /*!< MLX90620 or MLX90621 device type flag*/ 00155 uint32_t mlx621IDhi ; /*!< MLX90621 only, device ID hi 32 bits*/ 00156 uint32_t mlx621IDlo ; /*!< MLX90621 only, device ID lo 32 bits*/ 00157 char MLXEEbuf[256]; /*!< MLX9062x EEPROM data buffer, 0x00 - 0xff*/ 00158 char MLXRamBuf[128]; /*!< MLX9062x RAM data buffer, 0x00 - 0x7f*/ 00159 char MLXRamCmmd[8]; /*!< MLX9062x i2c command i/o buffer*/ 00160 double DieTemp ; /*!< MLX9062x die temperature*/ 00161 } mlx_struct; 00162 00163 00164 /** Create a MLX90620 object using the specified I2C object 00165 * 00166 * Original Constructor 00167 * 00168 * @param sda pin for I2C object 00169 * @param scl pin for I2C object 00170 * @param name of MLX90620 object 00171 */ 00172 MLX9062x(PinName sda, PinName scl, const char* name); 00173 00174 00175 /** Create a MLX9062x object using the specified I2C object 00176 * 00177 * New Constructor with ability to select between a MLX90620 and MLX90621 00178 * 00179 * @param sda pin for I2C object 00180 * @param scl pin for I2C object 00181 * @param MLXdevice select between mlx90620 and mlx90621 device 00182 * @param name of MLX9062x object 00183 */ 00184 MLX9062x(PinName sda, PinName scl, MLXdevice MLXtype, const char* name); 00185 00186 00187 /** Copy the contents of the MLX9062x EEPROM into local buffer 00188 * 00189 * Loads all 256 bytes from EEPROM into local buffer inside mlx_struct 00190 * 00191 * Note: Only done at initialization. MUST be the first thing you do in MAIN. 00192 * 00193 * @param pointer to struct mlx_struct 00194 * 00195 * @returns '1' if i2c error, '0' if ok. 00196 */ 00197 int LoadEEPROM(mlx_struct& Pntr); 00198 00199 00200 /** Initialize the MLX9062x's Oscillator Trim Register 00201 * 00202 * 7 lsb bits from 16 bit value, 00203 * 00204 * Data is derived from values received from the EEPROM 00205 * 00206 * Register is only set once during initialization 00207 * 00208 * @param pointer to struct mlx_struct 00209 * 00210 * @returns '1' if i2c error, '0' if ok. 00211 */ 00212 int SetOscTrimReg(mlx_struct& Pntr); 00213 00214 00215 /** Get the MLX9062x's Oscillator Trim Register 00216 * 00217 * 7 lsb bits from 16 bit value, Read from MLX RAM 00218 * 00219 * @param pointer to struct mlx_struct 00220 * 00221 * @returns OTR - Oscillator Trim Register value 00222 */ 00223 uint16_t GetOscTrimReg(mlx_struct& Pntr); 00224 00225 00226 /** Set the MLX9062x's Configuration Register 00227 * 00228 * 16 bit value set by code at initialization 00229 * 00230 * Register is set only during initialization. Inital setup: 00231 * 00232 * 1. ADC low reference 00233 * 00234 * 2. Ta Ref Rate 8Hz 00235 * 00236 * 3. I2C FM+ mode enabled 00237 * 00238 * 4. MD / Brownout bit set 00239 * 00240 * 5. Normal Operation (non-Sleep) mode 00241 * 00242 * 6. Step(Melexis reserved) mode. (removed from later datasheets, but used in this code) 00243 * 00244 * 7. IR refresh rate 4Hz 00245 * 00246 * @param pointer to struct mlx_struct 00247 * 00248 * @returns '1' if i2c error, '0' if ok. 00249 */ 00250 int SetConfigReg(mlx_struct& Pntr); 00251 00252 00253 /** Get the MLX9062x's Configuration Register 00254 * 00255 * 16 bit value, Read from MLX RAM 00256 * 00257 * Periodic check for Ta ready, IR Array ready and brownout conditions 00258 * 00259 * @param pointer to struct mlx_struct 00260 * 00261 * @returns CR - Configuration Register value 00262 */ 00263 uint16_t GetConfigReg(mlx_struct& Pntr); 00264 00265 00266 /** Get the MLX9062x's PTAT register. Register read at every Ta cycle 00267 * 00268 * 16 bit value, PTAT sensor, Read from MLX RAM 00269 * 00270 * Returns the Proportional To Ambient Temperature Register value 00271 * 00272 * @param pointer to struct mlx_struct 00273 * 00274 * @returns PTAT Register value 00275 */ 00276 uint16_t GetPTATReg(mlx_struct& Pntr); 00277 00278 00279 /** Get the MLX9062x's TGC register 00280 * 00281 * 16 bit value, TGC, Read from MLX RAM 00282 * 00283 * Returns the Temperature Gradient Coefficient Register value 00284 * 00285 * @param pointer to struct mlx_struct 00286 * 00287 * @returns TGC - Temperature Gradient Coefficient Register value 00288 */ 00289 int16_t GetTGCReg(mlx_struct& Pntr); 00290 00291 00292 /** Get the MLX9062x's IR pixel array and dump into local buffer 00293 * 00294 * Loads IR Pixel array into buffer (0x7F bytes, 0x3f Pixels), Read from MLX RAM 00295 * 00296 * @param pointer to struct mlx_struct 00297 * 00298 * @returns NONE 00299 */ 00300 void LoadMLXRam(mlx_struct& Pntr); 00301 00302 00303 /** Start a Ta and IR array conversion update cycle 00304 * 00305 * MLX9062x starts aquiring data, takes about 250mS /w 4Hz refresh rate 00306 * 00307 * Also calls GetPTATReg() and GetTGCReg() 00308 * 00309 * @param pointer to struct mlx_struct 00310 * 00311 * @returns '1' if i2c error, '0' if ok. 00312 */ 00313 int StartMeasurement(mlx_struct& Pntr); 00314 00315 00316 /** Get the MLX9062x's die temperature in degC 00317 * 00318 * Returns MLX9062x die temperature 00319 * 00320 * Needs to be performed before every array update calculation 00321 * 00322 * @param pointer to struct mlx_struct 00323 * 00324 * @returns die temperature of MLX9062x in degC 00325 */ 00326 double GetDieTemp(mlx_struct& Pntr); 00327 00328 00329 /** Calculate initial MLX9062x offsets. Performed only at initialization 00330 * 00331 * Sets the MLX9062x with die correcting factors at initialization 00332 * 00333 * @param pointer to struct mlx_struct 00334 * 00335 * @returns NONE 00336 */ 00337 void CalcTa_To(mlx_struct& Pntr); 00338 00339 00340 /** Calculate temperature of any pixel within the array (0 - 63) 00341 * 00342 * After an IR array dump into local buffer 00343 * 00344 * @param set int(0-63) of pixel to convert, 00345 * @param pointer to struct mlx_struct 00346 * 00347 * @returns pixel temperature of selected pixel in degC 00348 */ 00349 double CalcPixel(mlx_struct& Pntr, int Pixel); 00350 00351 00352 00353 00354 private: 00355 I2C _i2c; 00356 int mlxDev; 00357 int16_t Vth25; 00358 int8_t AcpX; 00359 int8_t BcpX; 00360 double Kt1_f; 00361 double Kt2_f; 00362 double Ta; 00363 int8_t TGCX; 00364 uint8_t BiScaleX; 00365 uint16_t theta0X; 00366 uint8_t theta0ScaleX; 00367 uint8_t deltaThetaScaleX; 00368 uint16_t elipsonX; 00369 int8_t AiPix; 00370 int8_t BiPix; 00371 uint8_t d_Th_Pix; 00372 int16_t VirPix; 00373 double TempPxlX; 00374 int16_t ConfigReg54; 00375 int16_t ScaleCR54; 00376 int16_t AiScale621; 00377 int16_t AlphaCP; 00378 int16_t ACP_ee; 00379 float aCP; 00380 float bCP; 00381 float Tgc621; 00382 double VcpCPOffComp; 00383 void DumpRawRegs(mlx_struct& Pntr); 00384 void DSSetup(mlx_struct& Pntr, int Pixel); 00385 void DumpPixRegs(mlx_struct& Pntr, int Pixel); 00386 int16_t Kt1; 00387 int16_t Kt2; 00388 int16_t TGCReg; 00389 int8_t TempTCG; 00390 00391 int8_t Ks4_ee; 00392 double Ks4; 00393 int16_t KsTa; 00394 double KsTaF; 00395 double TaK4; 00396 double ThPix; 00397 double ThetaCP; 00398 double ThetaCompPix; 00399 double VirComp; 00400 int16_t Th_0; 00401 int8_t Th_0_sc; 00402 int8_t d_Th_sc; 00403 00404 int16_t Acommon; 00405 int16_t Emiss; 00406 uint16_t deltaAi621; 00407 uint16_t deltaAiScale621; 00408 int16_t BiScale621; 00409 float Ai_ij; 00410 int16_t Bi_ijEEP; 00411 float Bi_ij; 00412 00413 float VirOffComp; 00414 float VircpTgcComp; 00415 float VirTGCComp; 00416 float VirPix_tgc_comp; 00417 double SxGuts; 00418 double Sx; 00419 double TempPxl; 00420 00421 }; 00422 00423 #endif
Generated on Wed Jul 13 2022 01:43:23 by 1.7.2