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

Dependents:   KL25Z_MLX90620

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?

UserRevisionLine numberNew 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