Maxim Integrated / Mbed 2 deprecated MAX31856_example_program

Dependencies:   MAX31856 mbed

Fork of MAX31856_example_program by Central Applications - Mbed Code repo

Committer:
DevinAlexander
Date:
Wed Jul 26 18:46:23 2017 +0000
Revision:
2:296485923589
Parent:
1:b58719a76fc3
Child:
3:a99a4367c909
before fixing the LOGs

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DevinAlexander 0:456e9e702d57 1 #ifndef MAX31856_h
DevinAlexander 0:456e9e702d57 2 #define MAX31856_h
DevinAlexander 0:456e9e702d57 3
DevinAlexander 0:456e9e702d57 4 #include "mbed.h"
DevinAlexander 1:b58719a76fc3 5 /** Please see pages 18-26 in the MAX31856 data sheet to see what register bit masks are needed to be set
DevinAlexander 1:b58719a76fc3 6 to achieve functionality desired. The data sheet can be found at
DevinAlexander 1:b58719a76fc3 7
DevinAlexander 1:b58719a76fc3 8 *** https://datasheets.maximintegrated.com/en/ds/MAX31856.pdf ***
DevinAlexander 1:b58719a76fc3 9 */
DevinAlexander 0:456e9e702d57 10
DevinAlexander 1:b58719a76fc3 11 //Parameters that are used throughout the library
DevinAlexander 1:b58719a76fc3 12 #define TC_MAX_VAL_FAULT 1800
DevinAlexander 1:b58719a76fc3 13 #define TC_MIN_VAL_FAULT -210
DevinAlexander 1:b58719a76fc3 14 #define CJ_MAX_VAL_FAULT 125
DevinAlexander 1:b58719a76fc3 15 #define CJ_MIN_VAL_FAULT -55
DevinAlexander 1:b58719a76fc3 16
DevinAlexander 1:b58719a76fc3 17
DevinAlexander 1:b58719a76fc3 18
DevinAlexander 1:b58719a76fc3 19
DevinAlexander 1:b58719a76fc3 20 ///Define all the addresses of the registers in the MAX31856
DevinAlexander 1:b58719a76fc3 21 #define ADDRESS_CR0_READ ((uint8_t)(0x00UL)) //Factory Default 00h
DevinAlexander 1:b58719a76fc3 22 #define ADDRESS_CR0_WRITE ((uint8_t)(0x80UL))
DevinAlexander 1:b58719a76fc3 23 #define ADDRESS_CR1_READ ((uint8_t)(0x01UL)) //Factory Default 03h
DevinAlexander 1:b58719a76fc3 24 #define ADDRESS_CR1_WRITE ((uint8_t)(0x81UL))
DevinAlexander 1:b58719a76fc3 25 #define ADDRESS_MASK_READ ((uint8_t)(0x02UL)) //Factory Default FFh
DevinAlexander 1:b58719a76fc3 26 #define ADDRESS_MASK_WRITE ((uint8_t)(0x82UL))
DevinAlexander 1:b58719a76fc3 27 #define ADDRESS_CJHF_READ ((uint8_t)(0x03UL)) //Factory Default 7Fh
DevinAlexander 1:b58719a76fc3 28 #define ADDRESS_CJHF_WRITE ((uint8_t)(0x83UL))
DevinAlexander 1:b58719a76fc3 29 #define ADDRESS_CJLF_READ ((uint8_t)(0x04UL)) //Factory Default C0h
DevinAlexander 1:b58719a76fc3 30 #define ADDRESS_CJLF_WRITE ((uint8_t)(0x84UL))
DevinAlexander 1:b58719a76fc3 31 #define ADDRESS_LTHFTH_READ ((uint8_t)(0x05UL)) //Factory Default 7Fh
DevinAlexander 1:b58719a76fc3 32 #define ADDRESS_LTHFTH_WRITE ((uint8_t)(0x85UL))
DevinAlexander 1:b58719a76fc3 33 #define ADDRESS_LTHFTL_READ ((uint8_t)(0x06UL)) //Factory Default FFh
DevinAlexander 1:b58719a76fc3 34 #define ADDRESS_LTHFTL_WRITE ((uint8_t)(0x86UL))
DevinAlexander 1:b58719a76fc3 35 #define ADDRESS_LTLFTH_READ ((uint8_t)(0x07UL)) //Factory Default 80h
DevinAlexander 1:b58719a76fc3 36 #define ADDRESS_LTLFTH_WRITE ((uint8_t)(0x87UL))
DevinAlexander 1:b58719a76fc3 37 #define ADDRESS_LTLFTL_READ ((uint8_t)(0x08UL)) //Factory Default 00h
DevinAlexander 1:b58719a76fc3 38 #define ADDRESS_LTLFTL_WRITE ((uint8_t)(0x88UL))
DevinAlexander 1:b58719a76fc3 39 #define ADDRESS_CJTO_READ ((uint8_t)(0x09UL)) //Factory Default 00h
DevinAlexander 1:b58719a76fc3 40 #define ADDRESS_CJTO_WRITE ((uint8_t)(0x89UL))
DevinAlexander 1:b58719a76fc3 41 #define ADDRESS_CJTH_READ ((uint8_t)(0x0AUL)) //Factory Default 00h
DevinAlexander 1:b58719a76fc3 42 #define ADDRESS_CJTH_WRITE ((uint8_t)(0x8AUL))
DevinAlexander 1:b58719a76fc3 43 #define ADDRESS_CJTL_READ ((uint8_t)(0x0BUL)) //Factory Default 00h
DevinAlexander 1:b58719a76fc3 44 #define ADDRESS_CJTL_WRITE ((uint8_t)(0x8BUL))
DevinAlexander 2:296485923589 45 #define ADDRESS_LTCBH_READ ((uint8_t)(0x0CUL))
DevinAlexander 2:296485923589 46 #define ADDRESS_LTCBM_READ ((uint8_t)(0x0DUL))
DevinAlexander 2:296485923589 47 #define ADDRESS_LTCBL_READ ((uint8_t)(0x0EUL))
DevinAlexander 2:296485923589 48 #define ADDRESS_SR_READ ((uint8_t)(0x0FUL))
DevinAlexander 0:456e9e702d57 49
DevinAlexander 0:456e9e702d57 50
DevinAlexander 0:456e9e702d57 51 ///Define parameters for control register zero (CR0)
DevinAlexander 1:b58719a76fc3 52
DevinAlexander 1:b58719a76fc3 53 #define CR0_CONV_MODE_NORMALLY_OFF ((uint8_t)(0x00UL << 7)) //Power On Default value
DevinAlexander 1:b58719a76fc3 54 #define CR0_CONV_MODE_NORMALLY_ON ((uint8_t)(0x01UL << 7))
DevinAlexander 0:456e9e702d57 55
DevinAlexander 2:296485923589 56 #define CR0_1_SHOT_MODE_NO_CONVERSION ((uint8_t)(0x00UL << 6)) //defaults to this value
DevinAlexander 1:b58719a76fc3 57 #define CR0_1_SHOT_MODE_ONE_CONVERSION ((uint8_t)(0x01UL << 6)) //^
DevinAlexander 0:456e9e702d57 58
DevinAlexander 1:b58719a76fc3 59 #define CR0_OC_DETECT_DISABLED ((uint8_t)(0x00UL << 4)) //
DevinAlexander 1:b58719a76fc3 60 #define CR0_OC_DETECT_ENABLED_R_LESS_5k ((uint8_t)(0x01UL << 4))
DevinAlexander 1:b58719a76fc3 61 #define CR0_OC_DETECT_ENABLED_TC_LESS_2ms ((uint8_t)(0x02UL << 4))
DevinAlexander 1:b58719a76fc3 62 #define CR0_OC_DETECT_ENABLED_TC_MORE_2ms ((uint8_t)(0x03UL << 4))
DevinAlexander 0:456e9e702d57 63
DevinAlexander 1:b58719a76fc3 64 #define CR0_COLD_JUNC_ENABLE ((uint8_t)(0x00UL << 3)) //Power On Default value
DevinAlexander 1:b58719a76fc3 65 #define CR0_COLD_JUNC_DISABLE ((uint8_t)(0x01UL << 3)) //speed of conversion is sped up by 25ms when this optionis selected (Disable the cold junc)
DevinAlexander 0:456e9e702d57 66
DevinAlexander 1:b58719a76fc3 67 #define CR0_FAULT_MODE_COMPARATOR ((uint8_t)(0x00UL << 2)) //Power On Default value
DevinAlexander 1:b58719a76fc3 68 #define CR0_FAULT_MODE_INTERUPT ((uint8_t)(0x01UL << 2))
DevinAlexander 0:456e9e702d57 69
DevinAlexander 1:b58719a76fc3 70 #define CR0_FAULTCLR_DEFAULT_VAL ((uint8_t)(0x00UL << 1)) //defaults to this value
DevinAlexander 1:b58719a76fc3 71 #define CR0_FAULTCLR_RETURN_FAULTS_TO_ZERO ((uint8_t)(0x01UL << 1)) //^
DevinAlexander 0:456e9e702d57 72
DevinAlexander 1:b58719a76fc3 73 #define CR0_FILTER_OUT_60Hz ((uint8_t)(0x00UL)) //Preset value
DevinAlexander 1:b58719a76fc3 74 #define CR0_FILTER_OUT_50Hz ((uint8_t)(0x01UL)) //^
DevinAlexander 0:456e9e702d57 75
DevinAlexander 0:456e9e702d57 76
DevinAlexander 0:456e9e702d57 77
DevinAlexander 0:456e9e702d57 78 ///Define parameters for control register one (CR1)
DevinAlexander 0:456e9e702d57 79 /** Adding Samples increases the conversion time and reduces noise.
DevinAlexander 0:456e9e702d57 80 Typical conversion times:
DevinAlexander 0:456e9e702d57 81 1-shot or first conversion in Auto mode:
DevinAlexander 0:456e9e702d57 82 = t_Conversion + (samples-1)*33.33mS (60Hz rejection)
DevinAlexander 0:456e9e702d57 83 = t_Conversion + (samples-1)*40.00mS (50Hz rejection)
DevinAlexander 0:456e9e702d57 84 2 thru n conversions in Auto mode:
DevinAlexander 0:456e9e702d57 85 = t_Conversion + (samples-1)*16.67mS (60Hz rejection)
DevinAlexander 0:456e9e702d57 86 = t_Conversion + (samples-1)*20.00mS (50Hz rejection)
DevinAlexander 0:456e9e702d57 87 */
DevinAlexander 1:b58719a76fc3 88 #define CR1_AVG_TC_SAMPLES_1 ((uint8_t)(0x00UL << 4)) //Power on default value
DevinAlexander 1:b58719a76fc3 89 #define CR1_AVG_TC_SAMPLES_2 ((uint8_t)(0x01UL << 4))
DevinAlexander 1:b58719a76fc3 90 #define CR1_AVG_TC_SAMPLES_4 ((uint8_t)(0x02UL << 4))
DevinAlexander 1:b58719a76fc3 91 #define CR1_AVG_TC_SAMPLES_8 ((uint8_t)(0x03UL << 4))
DevinAlexander 1:b58719a76fc3 92 #define CR1_AVG_TC_SAMPLES_16 ((uint8_t)(0x04UL << 4))
DevinAlexander 0:456e9e702d57 93
DevinAlexander 0:456e9e702d57 94 /** Define which type of thermocouple the MAX31856 is using. This is for lineariztion purposes*/
DevinAlexander 1:b58719a76fc3 95 #define CR1_TC_TYPE_B ((uint8_t)(0x00UL))
DevinAlexander 1:b58719a76fc3 96 #define CR1_TC_TYPE_E ((uint8_t)(0x01UL))
DevinAlexander 1:b58719a76fc3 97 #define CR1_TC_TYPE_J ((uint8_t)(0x02UL))
DevinAlexander 1:b58719a76fc3 98 #define CR1_TC_TYPE_K ((uint8_t)(0x03UL)) //Power on default value
DevinAlexander 1:b58719a76fc3 99 #define CR1_TC_TYPE_N ((uint8_t)(0x04UL))
DevinAlexander 1:b58719a76fc3 100 #define CR1_TC_TYPE_R ((uint8_t)(0x05UL))
DevinAlexander 1:b58719a76fc3 101 #define CR1_TC_TYPE_S ((uint8_t)(0x06UL))
DevinAlexander 1:b58719a76fc3 102 #define CR1_TC_TYPE_T ((uint8_t)(0x07UL))
DevinAlexander 1:b58719a76fc3 103 #define CR1_TC_TYPE_VOLT_MODE_GAIN_8 ((uint8_t)(0x08UL))
DevinAlexander 1:b58719a76fc3 104 #define CR1_TC_TYPE_VOLT_MODE_GAIN_32 ((uint8_t)(0x0CUL))
DevinAlexander 1:b58719a76fc3 105
DevinAlexander 1:b58719a76fc3 106 ///Define parameters for the mask register (MASK)
DevinAlexander 1:b58719a76fc3 107 #define MASK_CJ_FAULT_THRESHOLD_HIGH ((uint8_t)(0x01UL << 5))
DevinAlexander 1:b58719a76fc3 108 #define MASK_CJ_FAULT_THRESHOLD_LOW ((uint8_t)(0x01UL << 4))
DevinAlexander 1:b58719a76fc3 109 #define MASK_TC_FAULT_THRESHOLD_HIGH ((uint8_t)(0x01UL << 3))
DevinAlexander 1:b58719a76fc3 110 #define MASK_TC_FAULT_THRESHOLD_LOW ((uint8_t)(0x01UL << 2))
DevinAlexander 1:b58719a76fc3 111 #define MASK_OVER_UNDER_VOLT_FAULT ((uint8_t)(0x01UL << 1))
DevinAlexander 1:b58719a76fc3 112 #define MASK_OPEN_CIRCUIT_FAULT ((uint8_t)(0x01UL))
DevinAlexander 1:b58719a76fc3 113
DevinAlexander 0:456e9e702d57 114
DevinAlexander 1:b58719a76fc3 115 ///If these defined values are &= (ANDed) with the contents of a register, it will reset the bits pertaing to the naming convention to zero
DevinAlexander 1:b58719a76fc3 116 #define CR0_CLEAR_BITS_7 ~((uint8_t)(0x01UL << 7))
DevinAlexander 1:b58719a76fc3 117 #define CR0_CLEAR_BITS_6 ~((uint8_t)(0x01UL << 6))
DevinAlexander 1:b58719a76fc3 118 #define CR0_CLEAR_BITS_5_4 ~((uint8_t)(0x03UL << 4))
DevinAlexander 1:b58719a76fc3 119 #define CR0_CLEAR_BITS_3 ~((uint8_t)(0x01UL << 3))
DevinAlexander 1:b58719a76fc3 120 #define CR0_CLEAR_BITS_2 ~((uint8_t)(0x01UL << 2))
DevinAlexander 1:b58719a76fc3 121 #define CR0_CLEAR_BITS_1 ~((uint8_t)(0x01UL << 1))
DevinAlexander 1:b58719a76fc3 122 #define CR0_CLEAR_BITS_0 ~((uint8_t)(0x01UL))
DevinAlexander 1:b58719a76fc3 123
DevinAlexander 1:b58719a76fc3 124 #define CR1_CLEAR_BITS_6_4 ~((uint8_t)(0x07UL << 4))
DevinAlexander 1:b58719a76fc3 125 #define CR1_CLEAR_BITS_3_0 ~((uint8_t)(0x0FUL))
DevinAlexander 1:b58719a76fc3 126
DevinAlexander 1:b58719a76fc3 127
DevinAlexander 1:b58719a76fc3 128 #define MASK_CLEAR_BITS_5 ~((uint8_t)(0x01UL << 5))
DevinAlexander 1:b58719a76fc3 129 #define MASK_CLEAR_BITS_4 ~((uint8_t)(0x01UL << 4))
DevinAlexander 1:b58719a76fc3 130 #define MASK_CLEAR_BITS_3 ~((uint8_t)(0x01UL << 3))
DevinAlexander 1:b58719a76fc3 131 #define MASK_CLEAR_BITS_2 ~((uint8_t)(0x01UL << 2))
DevinAlexander 1:b58719a76fc3 132 #define MASK_CLEAR_BITS_1 ~((uint8_t)(0x01UL << 1))
DevinAlexander 1:b58719a76fc3 133 #define MASK_CLEAR_BITS_0 ~((uint8_t)(0x01UL))
DevinAlexander 0:456e9e702d57 134 //The following are predefined times that the MAX31856 needs to wait in between
DevinAlexander 1:b58719a76fc3 135 #define MIN_TIME_BETWEEN_READINGS
DevinAlexander 0:456e9e702d57 136
DevinAlexander 0:456e9e702d57 137
DevinAlexander 0:456e9e702d57 138
DevinAlexander 0:456e9e702d57 139 class MAX31856
DevinAlexander 0:456e9e702d57 140 {
DevinAlexander 0:456e9e702d57 141 // public:
DevinAlexander 1:b58719a76fc3 142 // struct time_adjusting_factors {
DevinAlexander 1:b58719a76fc3 143 // int samples; // 1, 2, 4, 8, or 16 samples are the possible values
DevinAlexander 1:b58719a76fc3 144 // bool filter; // 0=60Hz, 1=50Hz
DevinAlexander 1:b58719a76fc3 145 //
DevinAlexander 1:b58719a76fc3 146 // } conversion_time;
DevinAlexander 1:b58719a76fc3 147
DevinAlexander 0:456e9e702d57 148 public:
DevinAlexander 1:b58719a76fc3 149 MAX31856(SPI& _spi, PinName _ncs, uint8_t _type=CR1_TC_TYPE_K, uint8_t _fltr=CR0_FILTER_OUT_60Hz, uint8_t _samples=CR1_AVG_TC_SAMPLES_1, uint8_t _conversion_mode=CR0_CONV_MODE_NORMALLY_OFF);
DevinAlexander 0:456e9e702d57 150 // float read(temperature_type_t type = THERMOCOUPLE_T);
DevinAlexander 0:456e9e702d57 151
DevinAlexander 0:456e9e702d57 152 void spiEnable();
DevinAlexander 0:456e9e702d57 153 void spiDisable();
DevinAlexander 0:456e9e702d57 154 float readTC();
DevinAlexander 0:456e9e702d57 155 float readCJ();
DevinAlexander 1:b58719a76fc3 156
DevinAlexander 1:b58719a76fc3 157 //Functions for register CR0
DevinAlexander 1:b58719a76fc3 158 bool setConversionMode(uint8_t val);
DevinAlexander 1:b58719a76fc3 159 bool setOneShotMode(uint8_t val);
DevinAlexander 1:b58719a76fc3 160 bool setOpenCircuitFaultDetection(uint8_t val);
DevinAlexander 1:b58719a76fc3 161 bool setColdJunctionDisable(uint8_t val);
DevinAlexander 1:b58719a76fc3 162 bool setFaultMode(uint8_t val);
DevinAlexander 1:b58719a76fc3 163 bool setFaultStatusClear(uint8_t val);
DevinAlexander 1:b58719a76fc3 164 bool setEmiFilterFreq(uint8_t val);
DevinAlexander 1:b58719a76fc3 165
DevinAlexander 1:b58719a76fc3 166 //Functions for register CR1
DevinAlexander 1:b58719a76fc3 167 bool setNumSamplesAvg(uint8_t val);
DevinAlexander 1:b58719a76fc3 168 bool setThermocoupleType(uint8_t val);
DevinAlexander 1:b58719a76fc3 169
DevinAlexander 1:b58719a76fc3 170 //Functions for register MASK
DevinAlexander 1:b58719a76fc3 171 bool setFaultMasks(uint8_t val, bool enable);
DevinAlexander 1:b58719a76fc3 172 float setFaultThresholds(uint8_t val, bool enable_mask, float temperature);
DevinAlexander 1:b58719a76fc3 173
DevinAlexander 1:b58719a76fc3 174 //General Functions
DevinAlexander 1:b58719a76fc3 175 bool registerReadWriteByte(uint8_t read_address, uint8_t write_address, uint8_t clear_bits, uint8_t val);
DevinAlexander 1:b58719a76fc3 176 bool registerWriteByte(uint8_t write_address, uint8_t val);
DevinAlexander 1:b58719a76fc3 177 int8_t twosComplimentToSigned8(int8_t temp);
DevinAlexander 1:b58719a76fc3 178 int16_t twosComplimentToSigned16(int16_t temp);
DevinAlexander 2:296485923589 179 // void printSetting(string register_bits, string register_info);
DevinAlexander 2:296485923589 180
DevinAlexander 2:296485923589 181 //Define a return val for all boolean functions
DevinAlexander 2:296485923589 182 bool return_val;
DevinAlexander 1:b58719a76fc3 183
DevinAlexander 0:456e9e702d57 184 private:
DevinAlexander 0:456e9e702d57 185 SPI& spi;
DevinAlexander 0:456e9e702d57 186 DigitalOut ncs;
DevinAlexander 1:b58719a76fc3 187 uint8_t samples;
DevinAlexander 1:b58719a76fc3 188 bool voltage_mode; // used to determine what kind of read of the thermalcouple temperature will take place
DevinAlexander 1:b58719a76fc3 189 bool filter_mode; // 0=60Hz and 1=50Hz
DevinAlexander 1:b58719a76fc3 190 bool conversion_mode;
DevinAlexander 1:b58719a76fc3 191 bool cold_junction_enabled;
DevinAlexander 1:b58719a76fc3 192
DevinAlexander 1:b58719a76fc3 193
DevinAlexander 0:456e9e702d57 194 float thermocoupleT;
DevinAlexander 0:456e9e702d57 195 float internalT;
DevinAlexander 0:456e9e702d57 196 uint32_t lastReadTime;
DevinAlexander 0:456e9e702d57 197 };
DevinAlexander 0:456e9e702d57 198
DevinAlexander 1:b58719a76fc3 199 #endif // __MAX31855_H__\