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.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