Melexis MLX90620 and MLX90621, non-contact, 16x4 infrared array temperature sensor device driver.
MLX90620.h@2:82782c73251e, 2016-07-26 (annotated)
- Committer:
- loopsva
- Date:
- Tue Jul 26 19:52:23 2016 +0000
- Revision:
- 2:82782c73251e
- Parent:
- 1:fd536ebc7eaf
Fixes bug in DISCO_F746NG when reading MLX9062x EEPROM. The F746 has a 255 byte I2C limit. Any transfer larger, the buffer returns all 0xff. So, the MLX's EEPROM needs to be read 1 + 255 bytes in order to get all 256. A compiler flag is used.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
loopsva | 0:8c2ddd9801ca | 1 | #ifndef MLX90620_H |
loopsva | 0:8c2ddd9801ca | 2 | #define MLX90620_H |
loopsva | 0:8c2ddd9801ca | 3 | |
loopsva | 0:8c2ddd9801ca | 4 | #include "mbed.h" |
loopsva | 0:8c2ddd9801ca | 5 | |
loopsva | 1:fd536ebc7eaf | 6 | #define MLX_EEPADDR 0xa0 //eep i2c address |
loopsva | 1:fd536ebc7eaf | 7 | #define MLX_RAMADDR 0xc0 //ram i2c address |
loopsva | 1:fd536ebc7eaf | 8 | |
loopsva | 1:fd536ebc7eaf | 9 | //EEPROM offsets |
loopsva | 1:fd536ebc7eaf | 10 | #define MLX620_PTATSENS 0x90 //PTAT sensor reading for MLX90620, 16b |
loopsva | 1:fd536ebc7eaf | 11 | #define MLX621_PTATSENS 0x40 //PTAT sensor reading for MLX90621, 16b |
loopsva | 1:fd536ebc7eaf | 12 | #define MLX620_TGCSENS 0x91 //TGC sensor reading for MLX90620, 16b |
loopsva | 1:fd536ebc7eaf | 13 | #define MLX621_TGCSENS 0x41 //TGC sensor reading for MLX90621, 16b |
loopsva | 1:fd536ebc7eaf | 14 | #define MLX_CONFIG 0x92 //config register, 16b |
loopsva | 1:fd536ebc7eaf | 15 | #define MLX_TRIM 0x93 //oscillator trim, lsb>6b of 16b |
loopsva | 1:fd536ebc7eaf | 16 | |
loopsva | 1:fd536ebc7eaf | 17 | #define MLX621_EE_ID_BASE 0xf8 //8 bytes, ID info |
loopsva | 1:fd536ebc7eaf | 18 | #define MLX620_EETRIM 0xf7 //1 byte, oscillator trim value |
loopsva | 1:fd536ebc7eaf | 19 | #define MLX621_CONFIG_LO 0xf5 //Config reg, lo byte |
loopsva | 1:fd536ebc7eaf | 20 | #define MLX621_CONFIG_HI 0xf6 //Config reg, hi byte |
loopsva | 1:fd536ebc7eaf | 21 | |
loopsva | 1:fd536ebc7eaf | 22 | #define MLX_TOINDEX 0xd4 //0xD4 and 0xE0 (0xD4 + 0x0C), 6 bytes + 6 bytes |
loopsva | 1:fd536ebc7eaf | 23 | #define MLX_TAINDEX 0xda //0xDA, 6 bytes |
loopsva | 1:fd536ebc7eaf | 24 | |
loopsva | 1:fd536ebc7eaf | 25 | #define MLX621_KT1SCALE_BITS 0xf0 //Kt1_scale bits 7:4 |
loopsva | 1:fd536ebc7eaf | 26 | #define MLX621_KT2SCALE_BITS 0x0f //Kt2_scale bits 3:0 |
loopsva | 1:fd536ebc7eaf | 27 | |
loopsva | 1:fd536ebc7eaf | 28 | #define MLX621_KS_SCALE 0xc0 //KS scaling register |
loopsva | 1:fd536ebc7eaf | 29 | #define MLX621_KS4_EE 0xc4 //Ks4_ee register |
loopsva | 1:fd536ebc7eaf | 30 | |
loopsva | 1:fd536ebc7eaf | 31 | #define MLX621_A_COMMON_LO 0xd0 //Acommon register, lo byte |
loopsva | 1:fd536ebc7eaf | 32 | #define MLX621_A_COMMON_HI 0xd1 //Acommon register, hi byte |
loopsva | 1:fd536ebc7eaf | 33 | #define MLX621_KT12_SCALE 0xd2 //Kt1_Kt2__scale register |
loopsva | 1:fd536ebc7eaf | 34 | #define MLX621_ACP_LO 0xd3 //ACP register, lo byte |
loopsva | 1:fd536ebc7eaf | 35 | #define MLX621_ACP_HI 0xd4 //ACP register, hi byte |
loopsva | 1:fd536ebc7eaf | 36 | #define MLX621_BCP 0xd5 //BCP register |
loopsva | 1:fd536ebc7eaf | 37 | #define MLX621_ALPHACP_LO 0xd6 //AlphaCP register, lo byte |
loopsva | 1:fd536ebc7eaf | 38 | #define MLX621_ALPHACP_HI 0xd7 //AlphaCP register, hi byte |
loopsva | 1:fd536ebc7eaf | 39 | #define MLX621_TGC 0xd8 //TGC reg |
loopsva | 1:fd536ebc7eaf | 40 | #define MLX621_DELTA_ABI_SCALE 0xd9 //deltaAi_deltaBi_scale register |
loopsva | 1:fd536ebc7eaf | 41 | #define MLX621_VTH25_LO 0xda //Vth(25) register lo byte |
loopsva | 1:fd536ebc7eaf | 42 | #define MLX621_VTH25_HI 0xdb //Vth(25) register hi byte |
loopsva | 1:fd536ebc7eaf | 43 | #define MLX621_KT1_LO 0xdc //Kt1 register lo byte |
loopsva | 1:fd536ebc7eaf | 44 | #define MLX621_KT1_HI 0xdd //Kt1 register lo byte |
loopsva | 1:fd536ebc7eaf | 45 | #define MLX621_KT2_LO 0xde //Kt2 register lo byte |
loopsva | 1:fd536ebc7eaf | 46 | #define MLX621_KT2_HI 0xdf //Kt2 register lo byte |
loopsva | 1:fd536ebc7eaf | 47 | |
loopsva | 1:fd536ebc7eaf | 48 | #define MLX621_THETA0_LO 0xe0 //theta 0 register, lo byte |
loopsva | 1:fd536ebc7eaf | 49 | #define MLX621_THETA0_HI 0xe1 //theta 0 register, hi byte |
loopsva | 1:fd536ebc7eaf | 50 | #define MLX621_THETA0_SCALE 0xe2 //theta 0 scale register |
loopsva | 1:fd536ebc7eaf | 51 | #define MLX621_DELTA_TH_SCALE 0xe3 //delta theta scale register |
loopsva | 1:fd536ebc7eaf | 52 | #define MLX621_A_EMMIS_LO 0xe4 //emissivity register, lo byte |
loopsva | 1:fd536ebc7eaf | 53 | #define MLX621_A_EMMIS_HI 0xe5 //emissivity register, hi byte |
loopsva | 1:fd536ebc7eaf | 54 | #define MLX621_KSTA_LO 0xe6 //KsTa register, lo byte |
loopsva | 1:fd536ebc7eaf | 55 | #define MLX621_KSTA_HI 0xe7 //KsTa register, hi byte |
loopsva | 1:fd536ebc7eaf | 56 | |
loopsva | 1:fd536ebc7eaf | 57 | #define MLX621_DELTA_AI_LO 0x3f //deltaAi register, lo byte |
loopsva | 1:fd536ebc7eaf | 58 | #define MLX621_DELTA_AI_HI 0x00 //deltaAi register, hi byte |
loopsva | 1:fd536ebc7eaf | 59 | |
loopsva | 1:fd536ebc7eaf | 60 | |
loopsva | 1:fd536ebc7eaf | 61 | #define MLX621_DAISCALE_BITS 0xf0 //deltaAi_scale bits 7:4 |
loopsva | 1:fd536ebc7eaf | 62 | #define MLX621_DBISCALE_BITS 0x0f //deltaBi_scale bits 3:0 |
loopsva | 1:fd536ebc7eaf | 63 | #define MLX621_KS_SCALE_BITS 0x0f //KS scaling bits (3:0) |
loopsva | 0:8c2ddd9801ca | 64 | |
loopsva | 1:fd536ebc7eaf | 65 | #define MLX621_BIIJ_EEP_LO 0x00 //Bi(ij)eeprom lo byte ******NEED ADDRESS****** |
loopsva | 1:fd536ebc7eaf | 66 | #define MLX621_BIIJ_EEP_HI 0x00 //Bi(ij)eeprom lo byte |
loopsva | 1:fd536ebc7eaf | 67 | |
loopsva | 1:fd536ebc7eaf | 68 | #define MLX_TGCX_REG MLX_TOINDEX + 4 |
loopsva | 1:fd536ebc7eaf | 69 | #define MLX_THETA0_REG_LO MLX_TOINDEX + 12 |
loopsva | 1:fd536ebc7eaf | 70 | #define MLX_THETA0_REG_HI MLX_TOINDEX + 13 |
loopsva | 1:fd536ebc7eaf | 71 | #define MLX_THETA0_SCALE_REG MLX_TOINDEX + 14 |
loopsva | 1:fd536ebc7eaf | 72 | #define MLX_DELTA_TH_SCALE_REG MLX_TOINDEX + 15 |
loopsva | 1:fd536ebc7eaf | 73 | #define MLX_EPSILON_REG_LO MLX_TOINDEX + 16 |
loopsva | 1:fd536ebc7eaf | 74 | #define MLX_EPSILON_REG_HI MLX_TOINDEX + 17 |
loopsva | 1:fd536ebc7eaf | 75 | |
loopsva | 1:fd536ebc7eaf | 76 | //CONFIG register bit equates |
loopsva | 1:fd536ebc7eaf | 77 | #define MLX_BRNOUTFLAG 0x0400 //brownout flag, 0 = brownout occured |
loopsva | 1:fd536ebc7eaf | 78 | #define MLX_IRMEASFLAG 0x0200 //IR measurement, 1 = measurement in progress |
loopsva | 1:fd536ebc7eaf | 79 | #define MLX_TAMEASFLAG 0x0100 //TA measurement, 1 = measurement in progress |
loopsva | 1:fd536ebc7eaf | 80 | |
loopsva | 1:fd536ebc7eaf | 81 | #define MLX621_EEP_ENA 0x1000 //mlx621 enable EEPROM access |
loopsva | 1:fd536ebc7eaf | 82 | #define MLX621_RESOLUTION 0x0030 //mlx621 resolution bits 5 & 4 |
loopsva | 1:fd536ebc7eaf | 83 | |
loopsva | 1:fd536ebc7eaf | 84 | //config register equates |
loopsva | 1:fd536ebc7eaf | 85 | #define MLX621_CONF_LO_REF_ENA 0x4000 //default |
loopsva | 1:fd536ebc7eaf | 86 | #define MLX621_CONF_HI_REF_ENA 0x0000 |
loopsva | 1:fd536ebc7eaf | 87 | #define MLX621_CONF_EEP_DIS 0x1000 |
loopsva | 1:fd536ebc7eaf | 88 | #define MLX621_CONF_EEP_ENA 0x0000 //seems like default |
loopsva | 1:fd536ebc7eaf | 89 | |
loopsva | 1:fd536ebc7eaf | 90 | #define MLX621_CONF_I2C_1MB 0x0000 //default |
loopsva | 1:fd536ebc7eaf | 91 | #define MLX621_CONF_I2C_400K 0x0800 |
loopsva | 1:fd536ebc7eaf | 92 | #define MLX621_CONF_MD_1 0x0400 //default MD must write a "1" when uploading Config Reg |
loopsva | 1:fd536ebc7eaf | 93 | #define MLX621_CONF_POR 0x0000 //POR or Brownout occured |
loopsva | 1:fd536ebc7eaf | 94 | #define MLX621_CONF_IR_BUSY 0x0200 //IR measurement running |
loopsva | 1:fd536ebc7eaf | 95 | #define MLX621_CONF_IR_IDLE 0x0000 //IR measurement -not- running |
loopsva | 0:8c2ddd9801ca | 96 | |
loopsva | 1:fd536ebc7eaf | 97 | #define MLX621_CONF_MODE_SLEEP 0x0080 //sleep mode |
loopsva | 1:fd536ebc7eaf | 98 | #define MLX621_CONF_MODE_NORM 0x0000 //default, normal mode |
loopsva | 1:fd536ebc7eaf | 99 | #define MLX621_CONF_MODE_STEP 0x0040 //step mode |
loopsva | 1:fd536ebc7eaf | 100 | #define MLX621_CONF_MODE_CONT 0x0000 //default, continious mode |
loopsva | 1:fd536ebc7eaf | 101 | #define MLX621_CONF_ADC_MASK 0x0030 //ADC mask bits |
loopsva | 1:fd536ebc7eaf | 102 | #define MLX621_CONF_ADC18 0x0030 //default, ADC in 18 bit mode |
loopsva | 1:fd536ebc7eaf | 103 | #define MLX621_CONF_ADC17 0x0020 //ADC in 17 bit mode |
loopsva | 1:fd536ebc7eaf | 104 | #define MLX621_CONF_ADC16 0x0010 //ADC in 16 bit mode |
loopsva | 1:fd536ebc7eaf | 105 | #define MLX621_CONF_ADC15 0x0000 //ADC in 15 bit mode |
loopsva | 1:fd536ebc7eaf | 106 | |
loopsva | 1:fd536ebc7eaf | 107 | #define MLX621_CONF_REF_MASK 0x000f //refresh mask bits |
loopsva | 1:fd536ebc7eaf | 108 | #define MLX621_CONF_REF_HALF 0x000f //refresh rate 0.5Hz |
loopsva | 1:fd536ebc7eaf | 109 | #define MLX621_CONF_REF_1 0x000e //default, refresh rate 1Hz |
loopsva | 1:fd536ebc7eaf | 110 | #define MLX621_CONF_REF_2 0x000d //refresh rate 2Hz |
loopsva | 1:fd536ebc7eaf | 111 | #define MLX621_CONF_REF_4 0x000c //refresh rate 4Hz |
loopsva | 1:fd536ebc7eaf | 112 | #define MLX621_CONF_REF_8 0x000b //refresh rate 8Hz |
loopsva | 1:fd536ebc7eaf | 113 | #define MLX621_CONF_REF_16 0x000a //refresh rate 16Hz |
loopsva | 1:fd536ebc7eaf | 114 | #define MLX621_CONF_REF_32 0x0009 //refresh rate 32Hz |
loopsva | 1:fd536ebc7eaf | 115 | #define MLX621_CONF_REF_64 0x0008 //refresh rate 64Hz |
loopsva | 1:fd536ebc7eaf | 116 | #define MLX621_CONF_REF_128 0x0007 //refresh rate 128Hz |
loopsva | 1:fd536ebc7eaf | 117 | #define MLX621_CONF_REF_256 0x0006 //refresh rate 256Hz |
loopsva | 1:fd536ebc7eaf | 118 | #define MLX621_CONF_REF_512 0x0005 //refresh rate 512Hz |
loopsva | 1:fd536ebc7eaf | 119 | #define MLX621_CONF_REF_512a 0x0004 //refresh rate 512Hz |
loopsva | 1:fd536ebc7eaf | 120 | #define MLX621_CONF_REF_512b 0x0003 //refresh rate 512Hz |
loopsva | 1:fd536ebc7eaf | 121 | #define MLX621_CONF_REF_512c 0x0002 //refresh rate 512Hz |
loopsva | 1:fd536ebc7eaf | 122 | #define MLX621_CONF_REF_512d 0x0001 //refresh rate 512Hz |
loopsva | 1:fd536ebc7eaf | 123 | #define MLX621_CONF_REF_512e 0x0000 //refresh rate 512Hz |
loopsva | 1:fd536ebc7eaf | 124 | |
loopsva | 1:fd536ebc7eaf | 125 | /** Software routines to access the Melexis MLX90620 and MLX90621 64 pixel (4 X 16) infrared sensor array |
loopsva | 1:fd536ebc7eaf | 126 | * The MLX9062x's internal RAM has different i2c behavior than it's internal EEPROM |
loopsva | 1:fd536ebc7eaf | 127 | * As a result, the MLX9062x's RAM uses more primitive mbed i2c commands than does the EEPROM. |
loopsva | 0:8c2ddd9801ca | 128 | * |
loopsva | 0:8c2ddd9801ca | 129 | */ |
loopsva | 1:fd536ebc7eaf | 130 | /* MLX9062x controller class |
loopsva | 0:8c2ddd9801ca | 131 | */ |
loopsva | 1:fd536ebc7eaf | 132 | class MLX9062x { |
loopsva | 0:8c2ddd9801ca | 133 | |
loopsva | 0:8c2ddd9801ca | 134 | public: |
loopsva | 0:8c2ddd9801ca | 135 | |
loopsva | 0:8c2ddd9801ca | 136 | /** |
loopsva | 1:fd536ebc7eaf | 137 | * Select device MLX90620 or MLX90621 |
loopsva | 1:fd536ebc7eaf | 138 | * |
loopsva | 1:fd536ebc7eaf | 139 | **/ |
loopsva | 1:fd536ebc7eaf | 140 | enum MLXdevice { |
loopsva | 1:fd536ebc7eaf | 141 | mlx90620, //device is an MLX90620 |
loopsva | 1:fd536ebc7eaf | 142 | mlx90621, //device is an MLX90620 |
loopsva | 1:fd536ebc7eaf | 143 | }; |
loopsva | 1:fd536ebc7eaf | 144 | |
loopsva | 1:fd536ebc7eaf | 145 | /** |
loopsva | 1:fd536ebc7eaf | 146 | * Public data structure for MLX9062x data values. |
loopsva | 0:8c2ddd9801ca | 147 | * |
loopsva | 0:8c2ddd9801ca | 148 | **/ |
loopsva | 0:8c2ddd9801ca | 149 | typedef struct { |
loopsva | 1:fd536ebc7eaf | 150 | uint16_t Config; /*!< MLX9062x configuration register*/ |
loopsva | 1:fd536ebc7eaf | 151 | uint16_t OscTrim; /*!< MLX9062x oscillator trim register*/ |
loopsva | 1:fd536ebc7eaf | 152 | uint16_t PtatD; /*!< MLX9062x PTAT data register*/ |
loopsva | 1:fd536ebc7eaf | 153 | int16_t VCP; /*!< MLX90621 VCP data register*/ |
loopsva | 1:fd536ebc7eaf | 154 | int mlxDevice; /*!< MLX90620 or MLX90621 device type flag*/ |
loopsva | 1:fd536ebc7eaf | 155 | uint32_t mlx621IDhi; /*!< MLX90621 only, device ID hi 32 bits*/ |
loopsva | 1:fd536ebc7eaf | 156 | uint32_t mlx621IDlo; /*!< MLX90621 only, device ID lo 32 bits*/ |
loopsva | 1:fd536ebc7eaf | 157 | char MLXEEbuf[256]; /*!< MLX9062x EEPROM data buffer, 0x00 - 0xff*/ |
loopsva | 1:fd536ebc7eaf | 158 | char MLXRamBuf[128]; /*!< MLX9062x RAM data buffer, 0x00 - 0x7f*/ |
loopsva | 1:fd536ebc7eaf | 159 | char MLXRamCmmd[8]; /*!< MLX9062x i2c command i/o buffer*/ |
loopsva | 1:fd536ebc7eaf | 160 | double DieTemp; /*!< MLX9062x die temperature*/ |
loopsva | 0:8c2ddd9801ca | 161 | } mlx_struct; |
loopsva | 0:8c2ddd9801ca | 162 | |
loopsva | 0:8c2ddd9801ca | 163 | |
loopsva | 0:8c2ddd9801ca | 164 | /** Create a MLX90620 object using the specified I2C object |
loopsva | 1:fd536ebc7eaf | 165 | * |
loopsva | 1:fd536ebc7eaf | 166 | * Original Constructor |
loopsva | 0:8c2ddd9801ca | 167 | * |
loopsva | 1:fd536ebc7eaf | 168 | * @param sda pin for I2C object |
loopsva | 1:fd536ebc7eaf | 169 | * @param scl pin for I2C object |
loopsva | 0:8c2ddd9801ca | 170 | * @param name of MLX90620 object |
loopsva | 0:8c2ddd9801ca | 171 | */ |
loopsva | 1:fd536ebc7eaf | 172 | MLX9062x(PinName sda, PinName scl, const char* name); |
loopsva | 1:fd536ebc7eaf | 173 | |
loopsva | 1:fd536ebc7eaf | 174 | |
loopsva | 1:fd536ebc7eaf | 175 | /** Create a MLX9062x object using the specified I2C object |
loopsva | 1:fd536ebc7eaf | 176 | * |
loopsva | 1:fd536ebc7eaf | 177 | * New Constructor with ability to select between a MLX90620 and MLX90621 |
loopsva | 1:fd536ebc7eaf | 178 | * |
loopsva | 1:fd536ebc7eaf | 179 | * @param sda pin for I2C object |
loopsva | 1:fd536ebc7eaf | 180 | * @param scl pin for I2C object |
loopsva | 1:fd536ebc7eaf | 181 | * @param MLXdevice select between mlx90620 and mlx90621 device |
loopsva | 1:fd536ebc7eaf | 182 | * @param name of MLX9062x object |
loopsva | 1:fd536ebc7eaf | 183 | */ |
loopsva | 1:fd536ebc7eaf | 184 | MLX9062x(PinName sda, PinName scl, MLXdevice MLXtype, const char* name); |
loopsva | 0:8c2ddd9801ca | 185 | |
loopsva | 0:8c2ddd9801ca | 186 | |
loopsva | 1:fd536ebc7eaf | 187 | /** Copy the contents of the MLX9062x EEPROM into local buffer |
loopsva | 0:8c2ddd9801ca | 188 | * |
loopsva | 0:8c2ddd9801ca | 189 | * Loads all 256 bytes from EEPROM into local buffer inside mlx_struct |
loopsva | 0:8c2ddd9801ca | 190 | * |
loopsva | 0:8c2ddd9801ca | 191 | * Note: Only done at initialization. MUST be the first thing you do in MAIN. |
loopsva | 0:8c2ddd9801ca | 192 | * |
loopsva | 0:8c2ddd9801ca | 193 | * @param pointer to struct mlx_struct |
loopsva | 0:8c2ddd9801ca | 194 | * |
loopsva | 0:8c2ddd9801ca | 195 | * @returns '1' if i2c error, '0' if ok. |
loopsva | 0:8c2ddd9801ca | 196 | */ |
loopsva | 0:8c2ddd9801ca | 197 | int LoadEEPROM(mlx_struct& Pntr); |
loopsva | 0:8c2ddd9801ca | 198 | |
loopsva | 0:8c2ddd9801ca | 199 | |
loopsva | 1:fd536ebc7eaf | 200 | /** Initialize the MLX9062x's Oscillator Trim Register |
loopsva | 0:8c2ddd9801ca | 201 | * |
loopsva | 0:8c2ddd9801ca | 202 | * 7 lsb bits from 16 bit value, |
loopsva | 0:8c2ddd9801ca | 203 | * |
loopsva | 0:8c2ddd9801ca | 204 | * Data is derived from values received from the EEPROM |
loopsva | 0:8c2ddd9801ca | 205 | * |
loopsva | 0:8c2ddd9801ca | 206 | * Register is only set once during initialization |
loopsva | 0:8c2ddd9801ca | 207 | * |
loopsva | 0:8c2ddd9801ca | 208 | * @param pointer to struct mlx_struct |
loopsva | 0:8c2ddd9801ca | 209 | * |
loopsva | 0:8c2ddd9801ca | 210 | * @returns '1' if i2c error, '0' if ok. |
loopsva | 0:8c2ddd9801ca | 211 | */ |
loopsva | 0:8c2ddd9801ca | 212 | int SetOscTrimReg(mlx_struct& Pntr); |
loopsva | 0:8c2ddd9801ca | 213 | |
loopsva | 0:8c2ddd9801ca | 214 | |
loopsva | 1:fd536ebc7eaf | 215 | /** Get the MLX9062x's Oscillator Trim Register |
loopsva | 0:8c2ddd9801ca | 216 | * |
loopsva | 0:8c2ddd9801ca | 217 | * 7 lsb bits from 16 bit value, Read from MLX RAM |
loopsva | 0:8c2ddd9801ca | 218 | * |
loopsva | 0:8c2ddd9801ca | 219 | * @param pointer to struct mlx_struct |
loopsva | 0:8c2ddd9801ca | 220 | * |
loopsva | 0:8c2ddd9801ca | 221 | * @returns OTR - Oscillator Trim Register value |
loopsva | 0:8c2ddd9801ca | 222 | */ |
loopsva | 0:8c2ddd9801ca | 223 | uint16_t GetOscTrimReg(mlx_struct& Pntr); |
loopsva | 0:8c2ddd9801ca | 224 | |
loopsva | 0:8c2ddd9801ca | 225 | |
loopsva | 1:fd536ebc7eaf | 226 | /** Set the MLX9062x's Configuration Register |
loopsva | 0:8c2ddd9801ca | 227 | * |
loopsva | 0:8c2ddd9801ca | 228 | * 16 bit value set by code at initialization |
loopsva | 0:8c2ddd9801ca | 229 | * |
loopsva | 0:8c2ddd9801ca | 230 | * Register is set only during initialization. Inital setup: |
loopsva | 0:8c2ddd9801ca | 231 | * |
loopsva | 0:8c2ddd9801ca | 232 | * 1. ADC low reference |
loopsva | 0:8c2ddd9801ca | 233 | * |
loopsva | 0:8c2ddd9801ca | 234 | * 2. Ta Ref Rate 8Hz |
loopsva | 0:8c2ddd9801ca | 235 | * |
loopsva | 0:8c2ddd9801ca | 236 | * 3. I2C FM+ mode enabled |
loopsva | 0:8c2ddd9801ca | 237 | * |
loopsva | 0:8c2ddd9801ca | 238 | * 4. MD / Brownout bit set |
loopsva | 0:8c2ddd9801ca | 239 | * |
loopsva | 0:8c2ddd9801ca | 240 | * 5. Normal Operation (non-Sleep) mode |
loopsva | 0:8c2ddd9801ca | 241 | * |
loopsva | 0:8c2ddd9801ca | 242 | * 6. Step(Melexis reserved) mode. (removed from later datasheets, but used in this code) |
loopsva | 0:8c2ddd9801ca | 243 | * |
loopsva | 0:8c2ddd9801ca | 244 | * 7. IR refresh rate 4Hz |
loopsva | 0:8c2ddd9801ca | 245 | * |
loopsva | 0:8c2ddd9801ca | 246 | * @param pointer to struct mlx_struct |
loopsva | 0:8c2ddd9801ca | 247 | * |
loopsva | 0:8c2ddd9801ca | 248 | * @returns '1' if i2c error, '0' if ok. |
loopsva | 0:8c2ddd9801ca | 249 | */ |
loopsva | 0:8c2ddd9801ca | 250 | int SetConfigReg(mlx_struct& Pntr); |
loopsva | 0:8c2ddd9801ca | 251 | |
loopsva | 0:8c2ddd9801ca | 252 | |
loopsva | 1:fd536ebc7eaf | 253 | /** Get the MLX9062x's Configuration Register |
loopsva | 0:8c2ddd9801ca | 254 | * |
loopsva | 0:8c2ddd9801ca | 255 | * 16 bit value, Read from MLX RAM |
loopsva | 0:8c2ddd9801ca | 256 | * |
loopsva | 0:8c2ddd9801ca | 257 | * Periodic check for Ta ready, IR Array ready and brownout conditions |
loopsva | 0:8c2ddd9801ca | 258 | * |
loopsva | 0:8c2ddd9801ca | 259 | * @param pointer to struct mlx_struct |
loopsva | 0:8c2ddd9801ca | 260 | * |
loopsva | 0:8c2ddd9801ca | 261 | * @returns CR - Configuration Register value |
loopsva | 0:8c2ddd9801ca | 262 | */ |
loopsva | 0:8c2ddd9801ca | 263 | uint16_t GetConfigReg(mlx_struct& Pntr); |
loopsva | 0:8c2ddd9801ca | 264 | |
loopsva | 0:8c2ddd9801ca | 265 | |
loopsva | 1:fd536ebc7eaf | 266 | /** Get the MLX9062x's PTAT register. Register read at every Ta cycle |
loopsva | 0:8c2ddd9801ca | 267 | * |
loopsva | 0:8c2ddd9801ca | 268 | * 16 bit value, PTAT sensor, Read from MLX RAM |
loopsva | 0:8c2ddd9801ca | 269 | * |
loopsva | 0:8c2ddd9801ca | 270 | * Returns the Proportional To Ambient Temperature Register value |
loopsva | 0:8c2ddd9801ca | 271 | * |
loopsva | 0:8c2ddd9801ca | 272 | * @param pointer to struct mlx_struct |
loopsva | 0:8c2ddd9801ca | 273 | * |
loopsva | 0:8c2ddd9801ca | 274 | * @returns PTAT Register value |
loopsva | 0:8c2ddd9801ca | 275 | */ |
loopsva | 0:8c2ddd9801ca | 276 | uint16_t GetPTATReg(mlx_struct& Pntr); |
loopsva | 0:8c2ddd9801ca | 277 | |
loopsva | 0:8c2ddd9801ca | 278 | |
loopsva | 1:fd536ebc7eaf | 279 | /** Get the MLX9062x's TGC register |
loopsva | 0:8c2ddd9801ca | 280 | * |
loopsva | 0:8c2ddd9801ca | 281 | * 16 bit value, TGC, Read from MLX RAM |
loopsva | 0:8c2ddd9801ca | 282 | * |
loopsva | 0:8c2ddd9801ca | 283 | * Returns the Temperature Gradient Coefficient Register value |
loopsva | 0:8c2ddd9801ca | 284 | * |
loopsva | 0:8c2ddd9801ca | 285 | * @param pointer to struct mlx_struct |
loopsva | 0:8c2ddd9801ca | 286 | * |
loopsva | 0:8c2ddd9801ca | 287 | * @returns TGC - Temperature Gradient Coefficient Register value |
loopsva | 0:8c2ddd9801ca | 288 | */ |
loopsva | 0:8c2ddd9801ca | 289 | int16_t GetTGCReg(mlx_struct& Pntr); |
loopsva | 0:8c2ddd9801ca | 290 | |
loopsva | 0:8c2ddd9801ca | 291 | |
loopsva | 1:fd536ebc7eaf | 292 | /** Get the MLX9062x's IR pixel array and dump into local buffer |
loopsva | 0:8c2ddd9801ca | 293 | * |
loopsva | 0:8c2ddd9801ca | 294 | * Loads IR Pixel array into buffer (0x7F bytes, 0x3f Pixels), Read from MLX RAM |
loopsva | 0:8c2ddd9801ca | 295 | * |
loopsva | 0:8c2ddd9801ca | 296 | * @param pointer to struct mlx_struct |
loopsva | 0:8c2ddd9801ca | 297 | * |
loopsva | 0:8c2ddd9801ca | 298 | * @returns NONE |
loopsva | 0:8c2ddd9801ca | 299 | */ |
loopsva | 0:8c2ddd9801ca | 300 | void LoadMLXRam(mlx_struct& Pntr); |
loopsva | 0:8c2ddd9801ca | 301 | |
loopsva | 0:8c2ddd9801ca | 302 | |
loopsva | 0:8c2ddd9801ca | 303 | /** Start a Ta and IR array conversion update cycle |
loopsva | 0:8c2ddd9801ca | 304 | * |
loopsva | 1:fd536ebc7eaf | 305 | * MLX9062x starts aquiring data, takes about 250mS /w 4Hz refresh rate |
loopsva | 0:8c2ddd9801ca | 306 | * |
loopsva | 0:8c2ddd9801ca | 307 | * Also calls GetPTATReg() and GetTGCReg() |
loopsva | 0:8c2ddd9801ca | 308 | * |
loopsva | 0:8c2ddd9801ca | 309 | * @param pointer to struct mlx_struct |
loopsva | 0:8c2ddd9801ca | 310 | * |
loopsva | 0:8c2ddd9801ca | 311 | * @returns '1' if i2c error, '0' if ok. |
loopsva | 0:8c2ddd9801ca | 312 | */ |
loopsva | 0:8c2ddd9801ca | 313 | int StartMeasurement(mlx_struct& Pntr); |
loopsva | 0:8c2ddd9801ca | 314 | |
loopsva | 0:8c2ddd9801ca | 315 | |
loopsva | 1:fd536ebc7eaf | 316 | /** Get the MLX9062x's die temperature in degC |
loopsva | 0:8c2ddd9801ca | 317 | * |
loopsva | 1:fd536ebc7eaf | 318 | * Returns MLX9062x die temperature |
loopsva | 0:8c2ddd9801ca | 319 | * |
loopsva | 0:8c2ddd9801ca | 320 | * Needs to be performed before every array update calculation |
loopsva | 0:8c2ddd9801ca | 321 | * |
loopsva | 0:8c2ddd9801ca | 322 | * @param pointer to struct mlx_struct |
loopsva | 0:8c2ddd9801ca | 323 | * |
loopsva | 1:fd536ebc7eaf | 324 | * @returns die temperature of MLX9062x in degC |
loopsva | 0:8c2ddd9801ca | 325 | */ |
loopsva | 1:fd536ebc7eaf | 326 | double GetDieTemp(mlx_struct& Pntr); |
loopsva | 0:8c2ddd9801ca | 327 | |
loopsva | 0:8c2ddd9801ca | 328 | |
loopsva | 1:fd536ebc7eaf | 329 | /** Calculate initial MLX9062x offsets. Performed only at initialization |
loopsva | 0:8c2ddd9801ca | 330 | * |
loopsva | 1:fd536ebc7eaf | 331 | * Sets the MLX9062x with die correcting factors at initialization |
loopsva | 0:8c2ddd9801ca | 332 | * |
loopsva | 0:8c2ddd9801ca | 333 | * @param pointer to struct mlx_struct |
loopsva | 0:8c2ddd9801ca | 334 | * |
loopsva | 0:8c2ddd9801ca | 335 | * @returns NONE |
loopsva | 0:8c2ddd9801ca | 336 | */ |
loopsva | 0:8c2ddd9801ca | 337 | void CalcTa_To(mlx_struct& Pntr); |
loopsva | 0:8c2ddd9801ca | 338 | |
loopsva | 0:8c2ddd9801ca | 339 | |
loopsva | 0:8c2ddd9801ca | 340 | /** Calculate temperature of any pixel within the array (0 - 63) |
loopsva | 0:8c2ddd9801ca | 341 | * |
loopsva | 0:8c2ddd9801ca | 342 | * After an IR array dump into local buffer |
loopsva | 0:8c2ddd9801ca | 343 | * |
loopsva | 0:8c2ddd9801ca | 344 | * @param set int(0-63) of pixel to convert, |
loopsva | 0:8c2ddd9801ca | 345 | * @param pointer to struct mlx_struct |
loopsva | 0:8c2ddd9801ca | 346 | * |
loopsva | 0:8c2ddd9801ca | 347 | * @returns pixel temperature of selected pixel in degC |
loopsva | 0:8c2ddd9801ca | 348 | */ |
loopsva | 0:8c2ddd9801ca | 349 | double CalcPixel(mlx_struct& Pntr, int Pixel); |
loopsva | 0:8c2ddd9801ca | 350 | |
loopsva | 1:fd536ebc7eaf | 351 | |
loopsva | 1:fd536ebc7eaf | 352 | |
loopsva | 1:fd536ebc7eaf | 353 | |
loopsva | 0:8c2ddd9801ca | 354 | private: |
loopsva | 1:fd536ebc7eaf | 355 | I2C _i2c; |
loopsva | 1:fd536ebc7eaf | 356 | int mlxDev; |
loopsva | 1:fd536ebc7eaf | 357 | int16_t Vth25; |
loopsva | 0:8c2ddd9801ca | 358 | int8_t AcpX; |
loopsva | 0:8c2ddd9801ca | 359 | int8_t BcpX; |
loopsva | 1:fd536ebc7eaf | 360 | double Kt1_f; |
loopsva | 1:fd536ebc7eaf | 361 | double Kt2_f; |
loopsva | 1:fd536ebc7eaf | 362 | double Ta; |
loopsva | 0:8c2ddd9801ca | 363 | int8_t TGCX; |
loopsva | 0:8c2ddd9801ca | 364 | uint8_t BiScaleX; |
loopsva | 0:8c2ddd9801ca | 365 | uint16_t theta0X; |
loopsva | 0:8c2ddd9801ca | 366 | uint8_t theta0ScaleX; |
loopsva | 0:8c2ddd9801ca | 367 | uint8_t deltaThetaScaleX; |
loopsva | 0:8c2ddd9801ca | 368 | uint16_t elipsonX; |
loopsva | 1:fd536ebc7eaf | 369 | int8_t AiPix; |
loopsva | 1:fd536ebc7eaf | 370 | int8_t BiPix; |
loopsva | 1:fd536ebc7eaf | 371 | uint8_t d_Th_Pix; |
loopsva | 1:fd536ebc7eaf | 372 | int16_t VirPix; |
loopsva | 0:8c2ddd9801ca | 373 | double TempPxlX; |
loopsva | 1:fd536ebc7eaf | 374 | int16_t ConfigReg54; |
loopsva | 1:fd536ebc7eaf | 375 | int16_t ScaleCR54; |
loopsva | 1:fd536ebc7eaf | 376 | int16_t AiScale621; |
loopsva | 1:fd536ebc7eaf | 377 | int16_t AlphaCP; |
loopsva | 1:fd536ebc7eaf | 378 | int16_t ACP_ee; |
loopsva | 1:fd536ebc7eaf | 379 | float aCP; |
loopsva | 1:fd536ebc7eaf | 380 | float bCP; |
loopsva | 1:fd536ebc7eaf | 381 | float Tgc621; |
loopsva | 1:fd536ebc7eaf | 382 | double VcpCPOffComp; |
loopsva | 1:fd536ebc7eaf | 383 | void DumpRawRegs(mlx_struct& Pntr); |
loopsva | 1:fd536ebc7eaf | 384 | void DSSetup(mlx_struct& Pntr, int Pixel); |
loopsva | 1:fd536ebc7eaf | 385 | void DumpPixRegs(mlx_struct& Pntr, int Pixel); |
loopsva | 1:fd536ebc7eaf | 386 | int16_t Kt1; |
loopsva | 1:fd536ebc7eaf | 387 | int16_t Kt2; |
loopsva | 1:fd536ebc7eaf | 388 | int16_t TGCReg; |
loopsva | 1:fd536ebc7eaf | 389 | int8_t TempTCG; |
loopsva | 1:fd536ebc7eaf | 390 | |
loopsva | 1:fd536ebc7eaf | 391 | int8_t Ks4_ee; |
loopsva | 1:fd536ebc7eaf | 392 | double Ks4; |
loopsva | 1:fd536ebc7eaf | 393 | int16_t KsTa; |
loopsva | 1:fd536ebc7eaf | 394 | double KsTaF; |
loopsva | 1:fd536ebc7eaf | 395 | double TaK4; |
loopsva | 1:fd536ebc7eaf | 396 | double ThPix; |
loopsva | 1:fd536ebc7eaf | 397 | double ThetaCP; |
loopsva | 1:fd536ebc7eaf | 398 | double ThetaCompPix; |
loopsva | 1:fd536ebc7eaf | 399 | double VirComp; |
loopsva | 1:fd536ebc7eaf | 400 | int16_t Th_0; |
loopsva | 1:fd536ebc7eaf | 401 | int8_t Th_0_sc; |
loopsva | 1:fd536ebc7eaf | 402 | int8_t d_Th_sc; |
loopsva | 1:fd536ebc7eaf | 403 | |
loopsva | 1:fd536ebc7eaf | 404 | int16_t Acommon; |
loopsva | 1:fd536ebc7eaf | 405 | int16_t Emiss; |
loopsva | 1:fd536ebc7eaf | 406 | uint16_t deltaAi621; |
loopsva | 1:fd536ebc7eaf | 407 | uint16_t deltaAiScale621; |
loopsva | 1:fd536ebc7eaf | 408 | int16_t BiScale621; |
loopsva | 1:fd536ebc7eaf | 409 | float Ai_ij; |
loopsva | 1:fd536ebc7eaf | 410 | int16_t Bi_ijEEP; |
loopsva | 1:fd536ebc7eaf | 411 | float Bi_ij; |
loopsva | 1:fd536ebc7eaf | 412 | |
loopsva | 1:fd536ebc7eaf | 413 | float VirOffComp; |
loopsva | 1:fd536ebc7eaf | 414 | float VircpTgcComp; |
loopsva | 1:fd536ebc7eaf | 415 | float VirTGCComp; |
loopsva | 1:fd536ebc7eaf | 416 | float VirPix_tgc_comp; |
loopsva | 1:fd536ebc7eaf | 417 | double SxGuts; |
loopsva | 1:fd536ebc7eaf | 418 | double Sx; |
loopsva | 1:fd536ebc7eaf | 419 | double TempPxl; |
loopsva | 0:8c2ddd9801ca | 420 | |
loopsva | 0:8c2ddd9801ca | 421 | }; |
loopsva | 0:8c2ddd9801ca | 422 | |
loopsva | 0:8c2ddd9801ca | 423 | #endif |