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.
Fork of MAX31856_example_program by
MAX31856.h@2:296485923589, 2017-07-26 (annotated)
- 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?
User | Revision | Line number | New 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__\ |