Melexis MLX90620 and MLX90621, non-contact, 16x4 infrared array temperature sensor device driver.

Dependents:   KL25Z_MLX90620

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MLX90620.h Source File

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