Library for the MAX31856 Precision Thermocouple to Digital Converter with Linearization

Dependents:   MAX31856_example_program

Fork of MAX31856 by Central Applications - Mbed Code repo

Committer:
DevinAlexander
Date:
Thu Sep 14 17:56:47 2017 +0000
Revision:
0:b714c6a7c969
Child:
1:a1bbb5c254f2
Initial demo of the MAX31856;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DevinAlexander 0:b714c6a7c969 1 #include <mbed.h>
DevinAlexander 0:b714c6a7c969 2 #include "MAX31856.h"
DevinAlexander 0:b714c6a7c969 3
DevinAlexander 0:b714c6a7c969 4 #define LOG(args...) printf(args)
DevinAlexander 0:b714c6a7c969 5
DevinAlexander 0:b714c6a7c969 6 //*****************************************************************************
DevinAlexander 0:b714c6a7c969 7 MAX31856::MAX31856(SPI& _spi, PinName _ncs, uint8_t _type, uint8_t _fltr, uint8_t _samples, uint8_t _conversion_mode) : spi(_spi), ncs(_ncs), samples(_samples) {
DevinAlexander 0:b714c6a7c969 8 spi.format(8,3); //configure the correct SPI mode to beable to program the registers intially correctly
DevinAlexander 0:b714c6a7c969 9 setThermocoupleType(_type);
DevinAlexander 0:b714c6a7c969 10 setEmiFilterFreq(_fltr);
DevinAlexander 0:b714c6a7c969 11 setNumSamplesAvg(_samples);
DevinAlexander 0:b714c6a7c969 12 setConversionMode(_conversion_mode);
DevinAlexander 0:b714c6a7c969 13 }
DevinAlexander 0:b714c6a7c969 14
DevinAlexander 0:b714c6a7c969 15
DevinAlexander 0:b714c6a7c969 16 //*****************************************************************************
DevinAlexander 0:b714c6a7c969 17 float MAX31856::readTC()
DevinAlexander 0:b714c6a7c969 18 {
DevinAlexander 0:b714c6a7c969 19 //Check and see if the MAX31856 is set to conversion mode ALWAYS ON
DevinAlexander 0:b714c6a7c969 20 if (conversion_mode==0) { //means that the conversion mode is normally off
DevinAlexander 0:b714c6a7c969 21 setOneShotMode(CR0_1_SHOT_MODE_ONE_CONVERSION); // turn on the one shot mode for singular conversion
DevinAlexander 0:b714c6a7c969 22 thermocouple_conversion_count=0; //reset the conversion count back to zero to make sure minimum conversion time reflects one shot mode requirements
DevinAlexander 0:b714c6a7c969 23 }
DevinAlexander 0:b714c6a7c969 24
DevinAlexander 0:b714c6a7c969 25 //calculate minimum wait time for conversions
DevinAlexander 0:b714c6a7c969 26 calculateDelayTime();
DevinAlexander 0:b714c6a7c969 27
DevinAlexander 0:b714c6a7c969 28 //initialize other info for the read functionality
DevinAlexander 0:b714c6a7c969 29 int32_t temp;
DevinAlexander 0:b714c6a7c969 30 uint8_t buf_read[3], buf_write[3]={ADDRESS_LTCBH_READ,ADDRESS_LTCBM_READ,ADDRESS_LTCBL_READ};
DevinAlexander 0:b714c6a7c969 31
DevinAlexander 0:b714c6a7c969 32 bool read_thermocouple_temp=checkFaultsThermocoupleConnection(); //check and see if there are any faults that prohibit a normal read of the register
DevinAlexander 0:b714c6a7c969 33
DevinAlexander 0:b714c6a7c969 34 if(read_thermocouple_temp){ //no faults with connection are present so continue on with normal read of temperature
DevinAlexander 0:b714c6a7c969 35 uint32_t time = us_ticker_read();
DevinAlexander 0:b714c6a7c969 36 uint32_t duration = time - lastReadTime;
DevinAlexander 0:b714c6a7c969 37 if (duration > conversion_time) { // more than current conversion time
DevinAlexander 0:b714c6a7c969 38 for(int i=0; i<3; i++) {
DevinAlexander 0:b714c6a7c969 39 spiEnable();
DevinAlexander 0:b714c6a7c969 40 buf_read[i]=spi.write(buf_write[i]);
DevinAlexander 0:b714c6a7c969 41 buf_read[i]=spi.write(buf_write[i]);
DevinAlexander 0:b714c6a7c969 42 spiDisable();
DevinAlexander 0:b714c6a7c969 43 }
DevinAlexander 0:b714c6a7c969 44
DevinAlexander 0:b714c6a7c969 45 //Convert the registers contents into the correct value
DevinAlexander 0:b714c6a7c969 46 temp =((buf_read[0] & 0xFF) << 11); //Shift Byte 2 into place
DevinAlexander 0:b714c6a7c969 47 temp|=((buf_read[1] & 0xFF) << 3); //Shift Byte 1 into place
DevinAlexander 0:b714c6a7c969 48 temp|=((buf_read[2] & 0xFF) >> 5); //Shift Byte 0 into place
DevinAlexander 0:b714c6a7c969 49 float val=(temp/128.0f); //Divide the binary string by 2 to the 7th power
DevinAlexander 0:b714c6a7c969 50 return val;
DevinAlexander 0:b714c6a7c969 51 }
DevinAlexander 0:b714c6a7c969 52 }
DevinAlexander 0:b714c6a7c969 53 thermocouple_conversion_count++; //iterate the conversion count to speed up time in between future converions in always on mode
DevinAlexander 0:b714c6a7c969 54
DevinAlexander 0:b714c6a7c969 55 checkFaultsThermocoupleThresholds(); //print any faults to the terminal
DevinAlexander 0:b714c6a7c969 56 return 0;
DevinAlexander 0:b714c6a7c969 57 }
DevinAlexander 0:b714c6a7c969 58
DevinAlexander 0:b714c6a7c969 59
DevinAlexander 0:b714c6a7c969 60 //*****************************************************************************
DevinAlexander 0:b714c6a7c969 61 float MAX31856::readCJ()
DevinAlexander 0:b714c6a7c969 62 {
DevinAlexander 0:b714c6a7c969 63 int32_t temp;
DevinAlexander 0:b714c6a7c969 64 uint8_t buf_read[3], buf_write=ADDRESS_CJTH_READ;
DevinAlexander 0:b714c6a7c969 65
DevinAlexander 0:b714c6a7c969 66 spiEnable();
DevinAlexander 0:b714c6a7c969 67 for(int i=0; i<3; i++)
DevinAlexander 0:b714c6a7c969 68 {
DevinAlexander 0:b714c6a7c969 69 buf_read[i]=spi.write(buf_write);
DevinAlexander 0:b714c6a7c969 70 }
DevinAlexander 0:b714c6a7c969 71 spiDisable();
DevinAlexander 0:b714c6a7c969 72
DevinAlexander 0:b714c6a7c969 73 //Convert the registers contents into the correct value
DevinAlexander 0:b714c6a7c969 74 temp =((int32_t)(buf_read[1] << 6)); //Shift the MSB into place
DevinAlexander 0:b714c6a7c969 75 temp|=((int32_t)(buf_read[2] >> 2)); //Shift the LSB into place
DevinAlexander 0:b714c6a7c969 76 float val=((float)(temp/64.0)); //Divide the binary string by 2 to the 6th power
DevinAlexander 0:b714c6a7c969 77
DevinAlexander 0:b714c6a7c969 78 checkFaultsColdJunctionThresholds(); //print any faults to the terminal
DevinAlexander 0:b714c6a7c969 79
DevinAlexander 0:b714c6a7c969 80 return val;
DevinAlexander 0:b714c6a7c969 81 }
DevinAlexander 0:b714c6a7c969 82
DevinAlexander 0:b714c6a7c969 83 //*****************************************************************************
DevinAlexander 0:b714c6a7c969 84 uint8_t MAX31856::checkFaultsThermocoupleThresholds()
DevinAlexander 0:b714c6a7c969 85 {
DevinAlexander 0:b714c6a7c969 86 uint8_t fault_byte=registerReadByte(ADDRESS_SR_READ); //Read contents of fault status register
DevinAlexander 0:b714c6a7c969 87 uint8_t temp[2], return_int;
DevinAlexander 0:b714c6a7c969 88 for(int i=0; i<2; i++)
DevinAlexander 0:b714c6a7c969 89 temp[i]=fault_byte;
DevinAlexander 0:b714c6a7c969 90
DevinAlexander 0:b714c6a7c969 91 //Check if any of the faults for thermocouple connection are triggered
DevinAlexander 0:b714c6a7c969 92 if ((fault_byte&0x4C)==0) //means no fault is detected for thermocouple thresholds
DevinAlexander 0:b714c6a7c969 93 return_int=0;
DevinAlexander 0:b714c6a7c969 94 else {
DevinAlexander 0:b714c6a7c969 95 if ((fault_byte&0x40)==0) { //check if normal operation of thermocouple is true
DevinAlexander 0:b714c6a7c969 96 if (temp[0]&0x08) {
DevinAlexander 0:b714c6a7c969 97 LOG("FAULT! Thermocouple temp is higher than the threshold that is set!\r\n");
DevinAlexander 0:b714c6a7c969 98 return_int=1;
DevinAlexander 0:b714c6a7c969 99 }
DevinAlexander 0:b714c6a7c969 100 else if (temp[1]&0x04) {
DevinAlexander 0:b714c6a7c969 101 LOG("FAULT! Thermocouple temp is lower than the threshold that is set!\r\n");
DevinAlexander 0:b714c6a7c969 102 return_int=2;
DevinAlexander 0:b714c6a7c969 103 }
DevinAlexander 0:b714c6a7c969 104 }
DevinAlexander 0:b714c6a7c969 105 else { //Thermocouples is operating outside of normal range
DevinAlexander 0:b714c6a7c969 106 LOG("FAULT! Thermocouple temperature is out of range for specific type of thermocouple!\r\n");
DevinAlexander 0:b714c6a7c969 107 if (temp[0]&0x08) {
DevinAlexander 0:b714c6a7c969 108 LOG("FAULT! Thermocouple temp is higher than the threshold that is set!\r\n");
DevinAlexander 0:b714c6a7c969 109 return_int=4;
DevinAlexander 0:b714c6a7c969 110 }
DevinAlexander 0:b714c6a7c969 111 else if (temp[1]&0x04) {
DevinAlexander 0:b714c6a7c969 112 LOG("FAULT! Thermocouple temp is lower than the threshold that is set!\r\n");
DevinAlexander 0:b714c6a7c969 113 return_int=5;
DevinAlexander 0:b714c6a7c969 114 }
DevinAlexander 0:b714c6a7c969 115 else //no other faults are flagged besides unnatural operation
DevinAlexander 0:b714c6a7c969 116 return_int=3;
DevinAlexander 0:b714c6a7c969 117 }
DevinAlexander 0:b714c6a7c969 118 }
DevinAlexander 0:b714c6a7c969 119 return return_int;
DevinAlexander 0:b714c6a7c969 120 }
DevinAlexander 0:b714c6a7c969 121
DevinAlexander 0:b714c6a7c969 122 //*****************************************************************************
DevinAlexander 0:b714c6a7c969 123 uint8_t MAX31856::checkFaultsColdJunctionThresholds()
DevinAlexander 0:b714c6a7c969 124 {
DevinAlexander 0:b714c6a7c969 125 uint8_t fault_byte=registerReadByte(ADDRESS_SR_READ); //Read contents of fault status register
DevinAlexander 0:b714c6a7c969 126 uint8_t temp[2], return_int;
DevinAlexander 0:b714c6a7c969 127 for(int i=0; i<2; i++)
DevinAlexander 0:b714c6a7c969 128 temp[i]=fault_byte;
DevinAlexander 0:b714c6a7c969 129
DevinAlexander 0:b714c6a7c969 130 //Check if any of the faults for thermocouple connection are triggered
DevinAlexander 0:b714c6a7c969 131 if ((fault_byte&0xB0)==0) //means no fault is detected for cold junction thresholds
DevinAlexander 0:b714c6a7c969 132 return_int=0;
DevinAlexander 0:b714c6a7c969 133 else {
DevinAlexander 0:b714c6a7c969 134 if ((fault_byte&0x80)==0) { //check if normal operation of cold junction is true
DevinAlexander 0:b714c6a7c969 135 if (temp[0]&0x20) {
DevinAlexander 0:b714c6a7c969 136 LOG("FAULT! Cold Junction temp is higher than the threshold that is set!\r\n");
DevinAlexander 0:b714c6a7c969 137 return_int=1;
DevinAlexander 0:b714c6a7c969 138 }
DevinAlexander 0:b714c6a7c969 139 else if (temp[1]&0x10) {
DevinAlexander 0:b714c6a7c969 140 LOG("FAULT! Cold Junction temp is lower than the threshold that is set!\r\n");
DevinAlexander 0:b714c6a7c969 141 return_int=2;
DevinAlexander 0:b714c6a7c969 142 }
DevinAlexander 0:b714c6a7c969 143 }
DevinAlexander 0:b714c6a7c969 144 else { //Cold Junction is operating outside of normal range
DevinAlexander 0:b714c6a7c969 145 LOG("FAULT! Cold Junction temperature is out of range for specific type of thermocouple!\r\n");
DevinAlexander 0:b714c6a7c969 146 if (temp[0]&0x20) {
DevinAlexander 0:b714c6a7c969 147 LOG("FAULT! Cold Junction temp is higher than the threshold that is set!\r\n");
DevinAlexander 0:b714c6a7c969 148 return_int=4;
DevinAlexander 0:b714c6a7c969 149 }
DevinAlexander 0:b714c6a7c969 150 else if (temp[1]&0x10) {
DevinAlexander 0:b714c6a7c969 151 LOG("FAULT! Cold Junction temp is lower than the threshold that is set!\r\n");
DevinAlexander 0:b714c6a7c969 152 return_int=5;
DevinAlexander 0:b714c6a7c969 153 }
DevinAlexander 0:b714c6a7c969 154 else //no other faults are flagged besides unnatural operation
DevinAlexander 0:b714c6a7c969 155 return_int=3;
DevinAlexander 0:b714c6a7c969 156 }
DevinAlexander 0:b714c6a7c969 157 }
DevinAlexander 0:b714c6a7c969 158 return return_int;
DevinAlexander 0:b714c6a7c969 159 }
DevinAlexander 0:b714c6a7c969 160
DevinAlexander 0:b714c6a7c969 161 //*****************************************************************************
DevinAlexander 0:b714c6a7c969 162 bool MAX31856::checkFaultsThermocoupleConnection()
DevinAlexander 0:b714c6a7c969 163 {
DevinAlexander 0:b714c6a7c969 164 uint8_t fault_byte=registerReadByte(ADDRESS_SR_READ); //Read contents of fault status register
DevinAlexander 0:b714c6a7c969 165 uint8_t temp[2];
DevinAlexander 0:b714c6a7c969 166 for(int i=0; i<2; i++)
DevinAlexander 0:b714c6a7c969 167 temp[i]=fault_byte;
DevinAlexander 0:b714c6a7c969 168
DevinAlexander 0:b714c6a7c969 169 //Check if any of the faults for thermocouple connection are triggered
DevinAlexander 0:b714c6a7c969 170 if (fault_byte==0) //means no fault is detected
DevinAlexander 0:b714c6a7c969 171 return_val=1;
DevinAlexander 0:b714c6a7c969 172 else{
DevinAlexander 0:b714c6a7c969 173 if (temp[0]&0x02) {
DevinAlexander 0:b714c6a7c969 174 LOG("Overvotage/Undervoltage Fault triggered! Input voltage is negative or the voltage is greater than Vdd! Please check thermocouple connection!\r\n");
DevinAlexander 0:b714c6a7c969 175 return_val=0;
DevinAlexander 0:b714c6a7c969 176 }
DevinAlexander 0:b714c6a7c969 177 if (temp[1]&0x01) {
DevinAlexander 0:b714c6a7c969 178 LOG("Open circuit fault detected! Please check thermocouple connection!\r\n");
DevinAlexander 0:b714c6a7c969 179 return_val=0;
DevinAlexander 0:b714c6a7c969 180 }
DevinAlexander 0:b714c6a7c969 181 }
DevinAlexander 0:b714c6a7c969 182 return return_val;
DevinAlexander 0:b714c6a7c969 183 }
DevinAlexander 0:b714c6a7c969 184
DevinAlexander 0:b714c6a7c969 185
DevinAlexander 0:b714c6a7c969 186 //Register:CR0 Bits: 7
DevinAlexander 0:b714c6a7c969 187 //*****************************************************************************
DevinAlexander 0:b714c6a7c969 188 bool MAX31856::setConversionMode(uint8_t val)
DevinAlexander 0:b714c6a7c969 189 {
DevinAlexander 0:b714c6a7c969 190 if (val==CR0_CONV_MODE_NORMALLY_OFF) {
DevinAlexander 0:b714c6a7c969 191 return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_7, val);
DevinAlexander 0:b714c6a7c969 192 conversion_mode=0;
DevinAlexander 0:b714c6a7c969 193 LOG("Register containing\t\tsetConversionMode\t\twas programmed with the parameter\t\tCR0_CONV_MODE_NORMALLY_OFF\r\n");
DevinAlexander 0:b714c6a7c969 194 }
DevinAlexander 0:b714c6a7c969 195 else if (val==CR0_CONV_MODE_NORMALLY_ON) {
DevinAlexander 0:b714c6a7c969 196 return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_7, val);
DevinAlexander 0:b714c6a7c969 197 conversion_mode=1;
DevinAlexander 0:b714c6a7c969 198 LOG("Register containing\t\tsetConversionMode\t\twas programmed with the parameter\t\tCR0_CONV_MODE_NORMALLY_ON\r\n");
DevinAlexander 0:b714c6a7c969 199 }
DevinAlexander 0:b714c6a7c969 200 else {
DevinAlexander 0:b714c6a7c969 201 LOG("Incorrect parameter selected for Control Register 0 (CR0) bit 7. Default value not changed.\r\nPlease see MAX31856.h for list of valid parameters. \r\n");
DevinAlexander 0:b714c6a7c969 202 return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call
DevinAlexander 0:b714c6a7c969 203 }
DevinAlexander 0:b714c6a7c969 204 return return_val;
DevinAlexander 0:b714c6a7c969 205 }
DevinAlexander 0:b714c6a7c969 206
DevinAlexander 0:b714c6a7c969 207
DevinAlexander 0:b714c6a7c969 208 //Register:CR0 Bits: 6
DevinAlexander 0:b714c6a7c969 209 //*****************************************************************************
DevinAlexander 0:b714c6a7c969 210 bool MAX31856::setOneShotMode(uint8_t val)
DevinAlexander 0:b714c6a7c969 211 {
DevinAlexander 0:b714c6a7c969 212 if (val==CR0_1_SHOT_MODE_NO_CONVERSION)
DevinAlexander 0:b714c6a7c969 213 return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_6, val);
DevinAlexander 0:b714c6a7c969 214 else if (val==CR0_1_SHOT_MODE_ONE_CONVERSION)
DevinAlexander 0:b714c6a7c969 215 return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_6, val);
DevinAlexander 0:b714c6a7c969 216 else {
DevinAlexander 0:b714c6a7c969 217 LOG("Incorrect parameter selected for Control Register 0 (CR0) bit 6. Default value not changed.\r\nPlease see MAX31856.h for list of valid parameters. \r\n");
DevinAlexander 0:b714c6a7c969 218 return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call
DevinAlexander 0:b714c6a7c969 219 }
DevinAlexander 0:b714c6a7c969 220 return return_val;
DevinAlexander 0:b714c6a7c969 221 }
DevinAlexander 0:b714c6a7c969 222
DevinAlexander 0:b714c6a7c969 223
DevinAlexander 0:b714c6a7c969 224 //Register:CR0 Bits: 5:4
DevinAlexander 0:b714c6a7c969 225 //*****************************************************************************
DevinAlexander 0:b714c6a7c969 226 bool MAX31856::setOpenCircuitFaultDetection(uint8_t val)
DevinAlexander 0:b714c6a7c969 227 {
DevinAlexander 0:b714c6a7c969 228 if (val==CR0_OC_DETECT_DISABLED) {
DevinAlexander 0:b714c6a7c969 229 return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_5_4, val);
DevinAlexander 0:b714c6a7c969 230 LOG("Register containing\t\tsetOpenCircuitFaultDetection\t\twas programmed with the parameter\t\tCR0_OC_DETECT_DISABLED\r\n");
DevinAlexander 0:b714c6a7c969 231 }
DevinAlexander 0:b714c6a7c969 232 else if (val==CR0_OC_DETECT_ENABLED_R_LESS_5k) {
DevinAlexander 0:b714c6a7c969 233 return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_5_4, val);
DevinAlexander 0:b714c6a7c969 234 LOG("Register containing\t\tsetOpenCircuitFaultDetection\t\twas programmed with the parameter\t\tCR0_OC_DETECT_ENABLED_R_LESS_5k\r\n");
DevinAlexander 0:b714c6a7c969 235 }
DevinAlexander 0:b714c6a7c969 236 else if (val==CR0_OC_DETECT_ENABLED_TC_LESS_2ms) {
DevinAlexander 0:b714c6a7c969 237 return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_5_4, val);
DevinAlexander 0:b714c6a7c969 238 LOG("Register containing\t\tsetOpenCircuitFaultDetection\t\twas programmed with the parameter\t\tCR0_OC_DETECT_ENABLED_TC_LESS_2ms\r\n");
DevinAlexander 0:b714c6a7c969 239 }
DevinAlexander 0:b714c6a7c969 240 else if (val==CR0_OC_DETECT_ENABLED_TC_MORE_2ms) {
DevinAlexander 0:b714c6a7c969 241 return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_5_4, val);
DevinAlexander 0:b714c6a7c969 242 LOG("Register containing\t\tsetOpenCircuitFaultDetection\t\twas programmed with the parameter\t\tCR0_OC_DETECT_ENABLED_TC_MORE_2ms\r\n");
DevinAlexander 0:b714c6a7c969 243 }
DevinAlexander 0:b714c6a7c969 244 else {
DevinAlexander 0:b714c6a7c969 245 LOG("Incorrect parameter selected for Control Register 0 (CR0) bits 5:4. Default value not changed.\r\nPlease see MAX31856.h for list of valid parameters. \r\n");
DevinAlexander 0:b714c6a7c969 246 return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call
DevinAlexander 0:b714c6a7c969 247 }
DevinAlexander 0:b714c6a7c969 248 return return_val;
DevinAlexander 0:b714c6a7c969 249 }
DevinAlexander 0:b714c6a7c969 250
DevinAlexander 0:b714c6a7c969 251
DevinAlexander 0:b714c6a7c969 252 //Register:CR0 Bits: 3
DevinAlexander 0:b714c6a7c969 253 //*****************************************************************************
DevinAlexander 0:b714c6a7c969 254 bool MAX31856::setColdJunctionDisable(uint8_t val)
DevinAlexander 0:b714c6a7c969 255 {
DevinAlexander 0:b714c6a7c969 256 if (val==CR0_COLD_JUNC_ENABLE) {
DevinAlexander 0:b714c6a7c969 257 return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_3, val);
DevinAlexander 0:b714c6a7c969 258 cold_junction_enabled=1;
DevinAlexander 0:b714c6a7c969 259 LOG("Register containing\t\tsetColdJunctionDisable\t\twas programmed with the parameter\t\tCR0_COLD_JUNC_ENABLE\r\n");
DevinAlexander 0:b714c6a7c969 260 }
DevinAlexander 0:b714c6a7c969 261 else if (val==CR0_COLD_JUNC_DISABLE) {
DevinAlexander 0:b714c6a7c969 262 return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_3, val);
DevinAlexander 0:b714c6a7c969 263 cold_junction_enabled=0;
DevinAlexander 0:b714c6a7c969 264 LOG("Register containing\t\tsetColdJunctionDisable\t\twas programmed with the parameter\t\tCR0_COLD_JUNC_DISABLE\r\n");
DevinAlexander 0:b714c6a7c969 265 }
DevinAlexander 0:b714c6a7c969 266 else {
DevinAlexander 0:b714c6a7c969 267 LOG("Incorrect parameter selected for Control Register 0 (CR0) bit 3. Default value not changed.\r\nPlease see MAX31856.h for list of valid parameters. \r\n");
DevinAlexander 0:b714c6a7c969 268 return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call
DevinAlexander 0:b714c6a7c969 269 }
DevinAlexander 0:b714c6a7c969 270 return return_val;
DevinAlexander 0:b714c6a7c969 271 }
DevinAlexander 0:b714c6a7c969 272
DevinAlexander 0:b714c6a7c969 273
DevinAlexander 0:b714c6a7c969 274 //Register:CR0 Bits: 2
DevinAlexander 0:b714c6a7c969 275 //*****************************************************************************
DevinAlexander 0:b714c6a7c969 276 bool MAX31856::setFaultMode(uint8_t val)
DevinAlexander 0:b714c6a7c969 277 {
DevinAlexander 0:b714c6a7c969 278 if (val==CR0_FAULT_MODE_COMPARATOR) {
DevinAlexander 0:b714c6a7c969 279 return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_2, val);
DevinAlexander 0:b714c6a7c969 280 LOG("Register containing\t\tsetFaultMode\t\twas programmed with the parameter\t\tCR0_FAULT_MODE_COMPARATOR\r\n");
DevinAlexander 0:b714c6a7c969 281 }
DevinAlexander 0:b714c6a7c969 282 else if (val==CR0_FAULT_MODE_INTERUPT) {
DevinAlexander 0:b714c6a7c969 283 return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_2, val);
DevinAlexander 0:b714c6a7c969 284 LOG("Register containing\t\tsetFaultMode\t\twas programmed with the parameter\t\tCR0_FAULT_MODE_INTERUPT\r\n");
DevinAlexander 0:b714c6a7c969 285 }
DevinAlexander 0:b714c6a7c969 286 else {
DevinAlexander 0:b714c6a7c969 287 LOG("Incorrect parameter selected for Control Register 0 (CR0) bit 2. Default value not changed.\r\nPlease see MAX31856.h for list of valid parameters. \r\n");
DevinAlexander 0:b714c6a7c969 288 return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call
DevinAlexander 0:b714c6a7c969 289 }
DevinAlexander 0:b714c6a7c969 290 return return_val;
DevinAlexander 0:b714c6a7c969 291 }
DevinAlexander 0:b714c6a7c969 292
DevinAlexander 0:b714c6a7c969 293
DevinAlexander 0:b714c6a7c969 294 //Register:CR0 Bits: 1
DevinAlexander 0:b714c6a7c969 295 //*****************************************************************************
DevinAlexander 0:b714c6a7c969 296 bool MAX31856::setFaultStatusClear(uint8_t val)
DevinAlexander 0:b714c6a7c969 297 {
DevinAlexander 0:b714c6a7c969 298 if (val==CR0_FAULTCLR_DEFAULT_VAL) {
DevinAlexander 0:b714c6a7c969 299 return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_1, val);
DevinAlexander 0:b714c6a7c969 300 LOG("Register containing\t\tsetFaultStatusClear\t\twas programmed with the parameter\t\tCR0_FAULTCLR_DEFAULT_VAL\r\n");
DevinAlexander 0:b714c6a7c969 301 }
DevinAlexander 0:b714c6a7c969 302 else if (val==CR0_FAULTCLR_RETURN_FAULTS_TO_ZERO) {
DevinAlexander 0:b714c6a7c969 303 return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_1, val);
DevinAlexander 0:b714c6a7c969 304 LOG("Register containing\t\tsetFaultStatusClear\t\twas programmed with the parameter\t\tCR0_FAULTCLR_RETURN_FAULTS_TO_ZERO\r\n");
DevinAlexander 0:b714c6a7c969 305 }
DevinAlexander 0:b714c6a7c969 306 else {
DevinAlexander 0:b714c6a7c969 307 LOG("Incorrect parameter selected for Control Register 0 (CR0) bit 1. Default value not changed.\r\nPlease see MAX31856.h for list of valid parameters. \r\n");
DevinAlexander 0:b714c6a7c969 308 return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call
DevinAlexander 0:b714c6a7c969 309 }
DevinAlexander 0:b714c6a7c969 310 return return_val;
DevinAlexander 0:b714c6a7c969 311 }
DevinAlexander 0:b714c6a7c969 312
DevinAlexander 0:b714c6a7c969 313
DevinAlexander 0:b714c6a7c969 314 //Register:CR0 Bits: 0
DevinAlexander 0:b714c6a7c969 315 //*****************************************************************************
DevinAlexander 0:b714c6a7c969 316 bool MAX31856::setEmiFilterFreq(uint8_t val)
DevinAlexander 0:b714c6a7c969 317 {
DevinAlexander 0:b714c6a7c969 318 if (val==CR0_FILTER_OUT_60Hz) {
DevinAlexander 0:b714c6a7c969 319 return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_0, val);
DevinAlexander 0:b714c6a7c969 320 filter_mode=0;
DevinAlexander 0:b714c6a7c969 321 LOG("Register containing\t\tsetEmiFilterFreq\t\twas programmed with the parameter\t\tCR0_FILTER_OUT_60Hz\r\n");
DevinAlexander 0:b714c6a7c969 322 }
DevinAlexander 0:b714c6a7c969 323 else if (val==CR0_FILTER_OUT_50Hz) {
DevinAlexander 0:b714c6a7c969 324 return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_0, val);
DevinAlexander 0:b714c6a7c969 325 filter_mode=1;
DevinAlexander 0:b714c6a7c969 326 LOG("Register containing\t\tsetEmiFilterFreq\t\twas programmed with the parameter\t\tCR0_FILTER_OUT_50Hz\r\n");
DevinAlexander 0:b714c6a7c969 327 }
DevinAlexander 0:b714c6a7c969 328 else {
DevinAlexander 0:b714c6a7c969 329 LOG("Incorrect parameter selected for Control Register 0 (CR0) bit 0. Default value not changed.\r\nPlease see MAX31856.h for list of valid parameters. \r\n");
DevinAlexander 0:b714c6a7c969 330 return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call
DevinAlexander 0:b714c6a7c969 331 }
DevinAlexander 0:b714c6a7c969 332 return return_val;
DevinAlexander 0:b714c6a7c969 333 }
DevinAlexander 0:b714c6a7c969 334
DevinAlexander 0:b714c6a7c969 335
DevinAlexander 0:b714c6a7c969 336 //Register:CR1 Bits: 6:4
DevinAlexander 0:b714c6a7c969 337 //*****************************************************************************
DevinAlexander 0:b714c6a7c969 338 bool MAX31856::setNumSamplesAvg(uint8_t val)
DevinAlexander 0:b714c6a7c969 339 {
DevinAlexander 0:b714c6a7c969 340 if (val==CR1_AVG_TC_SAMPLES_1) {
DevinAlexander 0:b714c6a7c969 341 return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_6_4, val);
DevinAlexander 0:b714c6a7c969 342 samples=1;
DevinAlexander 0:b714c6a7c969 343 LOG("Register containing\t\tsetNumSamplesAvg\t\twas programmed with the parameter\t\tCR1_AVG_TC_SAMPLES_1\r\n");
DevinAlexander 0:b714c6a7c969 344 }
DevinAlexander 0:b714c6a7c969 345 else if (val==CR1_AVG_TC_SAMPLES_2) {
DevinAlexander 0:b714c6a7c969 346 return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_6_4, val);
DevinAlexander 0:b714c6a7c969 347 samples=2;
DevinAlexander 0:b714c6a7c969 348 LOG("Register containing\t\tsetNumSamplesAvg\t\twas programmed with the parameter\t\tCR1_AVG_TC_SAMPLES_2\r\n");
DevinAlexander 0:b714c6a7c969 349 }
DevinAlexander 0:b714c6a7c969 350 else if (val==CR1_AVG_TC_SAMPLES_4) {
DevinAlexander 0:b714c6a7c969 351 return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_6_4, val);
DevinAlexander 0:b714c6a7c969 352 samples=4;
DevinAlexander 0:b714c6a7c969 353 LOG("Register containing\t\tsetNumSamplesAvg\t\twas programmed with the parameter\t\tCR1_AVG_TC_SAMPLES_4\r\n");
DevinAlexander 0:b714c6a7c969 354 }
DevinAlexander 0:b714c6a7c969 355 else if (val==CR1_AVG_TC_SAMPLES_8) {
DevinAlexander 0:b714c6a7c969 356 return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_6_4, val);
DevinAlexander 0:b714c6a7c969 357 samples=8;
DevinAlexander 0:b714c6a7c969 358 LOG("Register containing\t\tsetNumSamplesAvg\t\twas programmed with the parameter\t\tCR1_AVG_TC_SAMPLES_8\r\n");
DevinAlexander 0:b714c6a7c969 359 }
DevinAlexander 0:b714c6a7c969 360 else if (val==CR1_AVG_TC_SAMPLES_16) {
DevinAlexander 0:b714c6a7c969 361 return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_6_4, val);
DevinAlexander 0:b714c6a7c969 362 samples=16;
DevinAlexander 0:b714c6a7c969 363 LOG("Register containing\t\tsetNumSamplesAvg\t\twas programmed with the parameter\t\tCR1_AVG_TC_SAMPLES_16\r\n");
DevinAlexander 0:b714c6a7c969 364 }
DevinAlexander 0:b714c6a7c969 365 else {
DevinAlexander 0:b714c6a7c969 366 LOG("Incorrect parameter selected for Control Register 1 (CR1) bits 6:4. Default value not changed.\r\nPlease see MAX31856.h for list of valid parameters. \r\n");
DevinAlexander 0:b714c6a7c969 367 return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call
DevinAlexander 0:b714c6a7c969 368 }
DevinAlexander 0:b714c6a7c969 369 return return_val;
DevinAlexander 0:b714c6a7c969 370 }
DevinAlexander 0:b714c6a7c969 371
DevinAlexander 0:b714c6a7c969 372
DevinAlexander 0:b714c6a7c969 373 //Register:CR1 Bits: 3:0
DevinAlexander 0:b714c6a7c969 374 //*****************************************************************************
DevinAlexander 0:b714c6a7c969 375 bool MAX31856::setThermocoupleType(uint8_t val)
DevinAlexander 0:b714c6a7c969 376 {
DevinAlexander 0:b714c6a7c969 377 if (val==CR1_TC_TYPE_B) {
DevinAlexander 0:b714c6a7c969 378 return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_3_0, val);
DevinAlexander 0:b714c6a7c969 379 voltage_mode=false;
DevinAlexander 0:b714c6a7c969 380 LOG("Register containing\t\tsetThermocoupleType\t\twas programmed with the parameter\t\tCR1_TC_TYPE_B\r\n");
DevinAlexander 0:b714c6a7c969 381 }
DevinAlexander 0:b714c6a7c969 382 else if (val==CR1_TC_TYPE_E) {
DevinAlexander 0:b714c6a7c969 383 return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_3_0, val);
DevinAlexander 0:b714c6a7c969 384 voltage_mode=false;
DevinAlexander 0:b714c6a7c969 385 LOG("Register containing\t\tsetThermocoupleType\t\twas programmed with the parameter\t\tCR1_TC_TYPE_E\r\n");
DevinAlexander 0:b714c6a7c969 386 }
DevinAlexander 0:b714c6a7c969 387 else if (val==CR1_TC_TYPE_J) {
DevinAlexander 0:b714c6a7c969 388 return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_3_0, val);
DevinAlexander 0:b714c6a7c969 389 voltage_mode=false;
DevinAlexander 0:b714c6a7c969 390 LOG("Register containing\t\tsetThermocoupleType\t\twas programmed with the parameter\t\tCR1_TC_TYPE_J\r\n");
DevinAlexander 0:b714c6a7c969 391 }
DevinAlexander 0:b714c6a7c969 392 else if (val==CR1_TC_TYPE_K) {
DevinAlexander 0:b714c6a7c969 393 return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_3_0, val);
DevinAlexander 0:b714c6a7c969 394 voltage_mode=false;
DevinAlexander 0:b714c6a7c969 395 LOG("Register containing\t\tsetThermocoupleType\t\twas programmed with the parameter\t\tCR1_TC_TYPE_K\r\n");
DevinAlexander 0:b714c6a7c969 396 }
DevinAlexander 0:b714c6a7c969 397 else if (val==CR1_TC_TYPE_N) {
DevinAlexander 0:b714c6a7c969 398 return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_3_0, val);
DevinAlexander 0:b714c6a7c969 399 voltage_mode=false;
DevinAlexander 0:b714c6a7c969 400 LOG("Register containing\t\tsetThermocoupleType\t\twas programmed with the parameter\t\tCR1_TC_TYPE_N\r\n");
DevinAlexander 0:b714c6a7c969 401 }
DevinAlexander 0:b714c6a7c969 402 else if (val==CR1_TC_TYPE_R) {
DevinAlexander 0:b714c6a7c969 403 return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_3_0, val);
DevinAlexander 0:b714c6a7c969 404 voltage_mode=false;
DevinAlexander 0:b714c6a7c969 405 LOG("Register containing\t\tsetThermocoupleType\t\twas programmed with the parameter\t\tCR1_TC_TYPE_R\r\n");
DevinAlexander 0:b714c6a7c969 406 }
DevinAlexander 0:b714c6a7c969 407 else if (val==CR1_TC_TYPE_S) {
DevinAlexander 0:b714c6a7c969 408 return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_3_0, val);
DevinAlexander 0:b714c6a7c969 409 voltage_mode=false;
DevinAlexander 0:b714c6a7c969 410 LOG("Register containing\t\tsetThermocoupleType\t\twas programmed with the parameter\t\tCR1_TC_TYPE_S\r\n");
DevinAlexander 0:b714c6a7c969 411 }
DevinAlexander 0:b714c6a7c969 412 else if (val==CR1_TC_TYPE_T) {
DevinAlexander 0:b714c6a7c969 413 return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_3_0, val);
DevinAlexander 0:b714c6a7c969 414 voltage_mode=false;
DevinAlexander 0:b714c6a7c969 415 LOG("Register containing\t\tsetThermocoupleType\t\twas programmed with the parameter\t\tCR1_TC_TYPE_T\r\n");
DevinAlexander 0:b714c6a7c969 416 }
DevinAlexander 0:b714c6a7c969 417 else if (val==CR1_TC_TYPE_VOLT_MODE_GAIN_8) {
DevinAlexander 0:b714c6a7c969 418 return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_3_0, val);
DevinAlexander 0:b714c6a7c969 419 voltage_mode=true;
DevinAlexander 0:b714c6a7c969 420 LOG("Register containing\t\tsetThermocoupleType\t\twas programmed with the parameter\t\tCR1_TC_TYPE_VOLT_MODE_GAIN_8\r\n");
DevinAlexander 0:b714c6a7c969 421 }
DevinAlexander 0:b714c6a7c969 422 else if (val==CR1_TC_TYPE_VOLT_MODE_GAIN_32) {
DevinAlexander 0:b714c6a7c969 423 return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_3_0, val);
DevinAlexander 0:b714c6a7c969 424 voltage_mode=true;
DevinAlexander 0:b714c6a7c969 425 LOG("Register containing\t\tsetThermocoupleType\t\twas programmed with the parameter\t\tCR1_TC_TYPE_VOLT_MODE_GAIN_32\r\n");
DevinAlexander 0:b714c6a7c969 426 }
DevinAlexander 0:b714c6a7c969 427 else {
DevinAlexander 0:b714c6a7c969 428 LOG("Incorrect parameter selected for Control Register 1 (CR1) bits 3:0. Default value not changed.\r\nPlease see MAX31856.h for list of valid parameters. \r\n");
DevinAlexander 0:b714c6a7c969 429 return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call
DevinAlexander 0:b714c6a7c969 430 }
DevinAlexander 0:b714c6a7c969 431 return return_val;
DevinAlexander 0:b714c6a7c969 432 }
DevinAlexander 0:b714c6a7c969 433
DevinAlexander 0:b714c6a7c969 434
DevinAlexander 0:b714c6a7c969 435 //Register:MASK Bits: 5:0
DevinAlexander 0:b714c6a7c969 436 //*****************************************************************************
DevinAlexander 0:b714c6a7c969 437 bool MAX31856::setFaultMasks(uint8_t val, bool enable)
DevinAlexander 0:b714c6a7c969 438 {
DevinAlexander 0:b714c6a7c969 439 if(enable)
DevinAlexander 0:b714c6a7c969 440 val=0;
DevinAlexander 0:b714c6a7c969 441 if (val==MASK_CJ_FAULT_THRESHOLD_HIGH) { //Cold Junction High Threshold Fault Mask
DevinAlexander 0:b714c6a7c969 442 return_val=registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_5, val);
DevinAlexander 0:b714c6a7c969 443 LOG("Register containing\t\tsetFaultMasks\t\twas programmed with the parameter\t\tMASK_CJ_FAULT_THRESHOLD_HIGH\r\n");
DevinAlexander 0:b714c6a7c969 444 }
DevinAlexander 0:b714c6a7c969 445 else if (val==MASK_CJ_FAULT_THRESHOLD_LOW) { //Cold Junction Low Threshold Fault Mask
DevinAlexander 0:b714c6a7c969 446 return_val=registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_4, val);
DevinAlexander 0:b714c6a7c969 447 LOG("Register containing\t\tsetFaultMasks\t\twas programmed with the parameter\t\tMASK_CJ_FAULT_THRESHOLD_LOW\r\n");
DevinAlexander 0:b714c6a7c969 448 }
DevinAlexander 0:b714c6a7c969 449 else if (val==MASK_TC_FAULT_THRESHOLD_HIGH) { //Thermocouple High Threshold Fault Mask
DevinAlexander 0:b714c6a7c969 450 return_val=registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_3, val);
DevinAlexander 0:b714c6a7c969 451 LOG("Register containing\t\tsetFaultMasks\t\twas programmed with the parameter\t\tMASK_TC_FAULT_THRESHOLD_HIGH\r\n");
DevinAlexander 0:b714c6a7c969 452 }
DevinAlexander 0:b714c6a7c969 453 else if (val==MASK_TC_FAULT_THRESHOLD_LOW) { //Thermocouple Low Threshold Fault Mask
DevinAlexander 0:b714c6a7c969 454 return_val=registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_2, val);
DevinAlexander 0:b714c6a7c969 455 LOG("Register containing\t\tsetFaultMasks\t\twas programmed with the parameter\t\tMASK_TC_FAULT_THRESHOLD_LOW\r\n");
DevinAlexander 0:b714c6a7c969 456 }
DevinAlexander 0:b714c6a7c969 457 else if (val==MASK_OVER_UNDER_VOLT_FAULT) { //Over-Voltage/Under-Voltage Input Fault Mask
DevinAlexander 0:b714c6a7c969 458 return_val=registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_1, val);
DevinAlexander 0:b714c6a7c969 459 LOG("Register containing\t\tsetFaultMasks\t\twas programmed with the parameter\t\tMASK_OVER_UNDER_VOLT_FAULT\r\n");
DevinAlexander 0:b714c6a7c969 460 }
DevinAlexander 0:b714c6a7c969 461 else if (val==MASK_OPEN_CIRCUIT_FAULT) { //Thermocouple Open-Circuit Fault Mask
DevinAlexander 0:b714c6a7c969 462 return_val=registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_0, val);
DevinAlexander 0:b714c6a7c969 463 LOG("Register containing\t\tsetFaultMasks\t\twas programmed with the parameter\t\tMASK_OPEN_CIRCUIT_FAULT\r\n");
DevinAlexander 0:b714c6a7c969 464 }
DevinAlexander 0:b714c6a7c969 465 else {
DevinAlexander 0:b714c6a7c969 466 LOG("Incorrect parameter selected for Mask Register bits 5:0. Default value not changed.\r\nPlease see MAX31856.h for list of valid parameters. \r\n");
DevinAlexander 0:b714c6a7c969 467 return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call
DevinAlexander 0:b714c6a7c969 468 }
DevinAlexander 0:b714c6a7c969 469 return return_val;
DevinAlexander 0:b714c6a7c969 470 }
DevinAlexander 0:b714c6a7c969 471
DevinAlexander 0:b714c6a7c969 472
DevinAlexander 0:b714c6a7c969 473 //Register:MASK Bits: 5:0
DevinAlexander 0:b714c6a7c969 474 //******************************************************************************
DevinAlexander 0:b714c6a7c969 475 bool MAX31856::setFaultThresholds(uint8_t val, float temperature)
DevinAlexander 0:b714c6a7c969 476 {
DevinAlexander 0:b714c6a7c969 477 if (val==MASK_CJ_FAULT_THRESHOLD_HIGH) { //Cold Junction High Threshold Fault Mask
DevinAlexander 0:b714c6a7c969 478 int8_t temperature_byte=temperature;
DevinAlexander 0:b714c6a7c969 479 return_val=registerWriteByte(ADDRESS_CJHF_WRITE, temperature_byte);
DevinAlexander 0:b714c6a7c969 480 }
DevinAlexander 0:b714c6a7c969 481 else if (val==MASK_CJ_FAULT_THRESHOLD_LOW) { //Cold Junction Low Threshold Fault Mask
DevinAlexander 0:b714c6a7c969 482 int8_t temperature_byte=temperature;
DevinAlexander 0:b714c6a7c969 483 return_val=registerWriteByte(ADDRESS_CJLF_WRITE, temperature_byte);
DevinAlexander 0:b714c6a7c969 484 }
DevinAlexander 0:b714c6a7c969 485 else if (val==MASK_TC_FAULT_THRESHOLD_HIGH) { //Thermocouple High Threshold Fault Mask
DevinAlexander 0:b714c6a7c969 486 int8_t temperature_byte[2];
DevinAlexander 0:b714c6a7c969 487 int16_t temperature_multi_byte =temperature*4.0;
DevinAlexander 0:b714c6a7c969 488 //now split up the 16bit int into two bytes to program the registers with
DevinAlexander 0:b714c6a7c969 489 temperature_byte[0]=((uint8_t)((temperature_multi_byte)&(0xFF00) >> 8));
DevinAlexander 0:b714c6a7c969 490 temperature_byte[1]=((uint8_t)((temperature_multi_byte)&(0x00FF)));
DevinAlexander 0:b714c6a7c969 491
DevinAlexander 0:b714c6a7c969 492 return_val=registerWriteByte(ADDRESS_LTHFTH_WRITE, temperature_byte[0]);
DevinAlexander 0:b714c6a7c969 493 return_val=registerWriteByte(ADDRESS_LTHFTL_WRITE, temperature_byte[1]);
DevinAlexander 0:b714c6a7c969 494 }
DevinAlexander 0:b714c6a7c969 495 else if (val==MASK_TC_FAULT_THRESHOLD_LOW) { //Thermocouple LOW Threshold Fault Mask
DevinAlexander 0:b714c6a7c969 496 int8_t temperature_byte[2];
DevinAlexander 0:b714c6a7c969 497 int16_t temperature_multi_byte =temperature*4.0;
DevinAlexander 0:b714c6a7c969 498 //now split up the 16bit int into two bytes to program the registers with
DevinAlexander 0:b714c6a7c969 499 temperature_byte[0]=((uint8_t)((temperature_multi_byte)&(0xFF00) >> 8));
DevinAlexander 0:b714c6a7c969 500 temperature_byte[1]=((uint8_t)((temperature_multi_byte)&(0x00FF)));
DevinAlexander 0:b714c6a7c969 501
DevinAlexander 0:b714c6a7c969 502 return_val=registerWriteByte(ADDRESS_LTHFTH_WRITE, temperature_byte[0]);
DevinAlexander 0:b714c6a7c969 503 return_val=registerWriteByte(ADDRESS_LTHFTL_WRITE, temperature_byte[1]);
DevinAlexander 0:b714c6a7c969 504 }
DevinAlexander 0:b714c6a7c969 505 else
DevinAlexander 0:b714c6a7c969 506 LOG("Please select correct threshold register to program with the correct value!\r\n");
DevinAlexander 0:b714c6a7c969 507 return return_val;
DevinAlexander 0:b714c6a7c969 508 }
DevinAlexander 0:b714c6a7c969 509
DevinAlexander 0:b714c6a7c969 510 //******************************************************************************
DevinAlexander 0:b714c6a7c969 511 bool MAX31856::coldJunctionOffset(float temperature)
DevinAlexander 0:b714c6a7c969 512 {
DevinAlexander 0:b714c6a7c969 513 if (temperature > 7.9375 || temperature < -8.0) {
DevinAlexander 0:b714c6a7c969 514 LOG("Input value to offest the cold junction point is non valid. enter in value in range -8 to +7.9375\r\n");
DevinAlexander 0:b714c6a7c969 515 return_val = 0;
DevinAlexander 0:b714c6a7c969 516 }
DevinAlexander 0:b714c6a7c969 517 int8_t temp_val=temperature*16.0f; //normalize the value to get rid of decimal and shorten it to size of register
DevinAlexander 0:b714c6a7c969 518 return_val=registerWriteByte(ADDRESS_CJTO_WRITE, temp_val); //write the byte to cold junction offset register
DevinAlexander 0:b714c6a7c969 519 return return_val;
DevinAlexander 0:b714c6a7c969 520 }
DevinAlexander 0:b714c6a7c969 521
DevinAlexander 0:b714c6a7c969 522
DevinAlexander 0:b714c6a7c969 523 //The following functions are for internal library use only
DevinAlexander 0:b714c6a7c969 524 //******************************************************************************
DevinAlexander 0:b714c6a7c969 525 void MAX31856::spiEnable()
DevinAlexander 0:b714c6a7c969 526 {
DevinAlexander 0:b714c6a7c969 527 ncs=0; //Set CS low to start transmission (interrupts conversion)
DevinAlexander 0:b714c6a7c969 528 return;
DevinAlexander 0:b714c6a7c969 529 }
DevinAlexander 0:b714c6a7c969 530
DevinAlexander 0:b714c6a7c969 531
DevinAlexander 0:b714c6a7c969 532 //******************************************************************************
DevinAlexander 0:b714c6a7c969 533 void MAX31856::spiDisable()
DevinAlexander 0:b714c6a7c969 534 {
DevinAlexander 0:b714c6a7c969 535 ncs=1; //Set CS high to stop transmission (restarts conversion)
DevinAlexander 0:b714c6a7c969 536 return;
DevinAlexander 0:b714c6a7c969 537 }
DevinAlexander 0:b714c6a7c969 538
DevinAlexander 0:b714c6a7c969 539
DevinAlexander 0:b714c6a7c969 540 //******************************************************************************
DevinAlexander 0:b714c6a7c969 541 bool MAX31856::registerReadWriteByte(uint8_t read_address, uint8_t write_address, int clear_bits, uint8_t val)
DevinAlexander 0:b714c6a7c969 542 {
DevinAlexander 0:b714c6a7c969 543 uint8_t buf_read[2];
DevinAlexander 0:b714c6a7c969 544
DevinAlexander 0:b714c6a7c969 545 //Read the current contents of a register
DevinAlexander 0:b714c6a7c969 546 spiEnable();
DevinAlexander 0:b714c6a7c969 547 for(int i=0; i<2; i++) {
DevinAlexander 0:b714c6a7c969 548 buf_read[i]=spi.write(read_address);
DevinAlexander 0:b714c6a7c969 549 }
DevinAlexander 0:b714c6a7c969 550 spiDisable();
DevinAlexander 0:b714c6a7c969 551
DevinAlexander 0:b714c6a7c969 552 //Modify contents pulled from the register
DevinAlexander 0:b714c6a7c969 553 buf_read[1]&=clear_bits; //Clear the contents of bits of parameter you are trying to clear for later or equal operation
DevinAlexander 0:b714c6a7c969 554 buf_read[1]|=val; //Bitwise OR the input parameter with cleaned buf_read[1] to create new byte
DevinAlexander 0:b714c6a7c969 555 val=buf_read[1];
DevinAlexander 0:b714c6a7c969 556
DevinAlexander 0:b714c6a7c969 557 //Write the updated byte to the register
DevinAlexander 0:b714c6a7c969 558 spiEnable();
DevinAlexander 0:b714c6a7c969 559 buf_read[0]=spi.write(write_address);
DevinAlexander 0:b714c6a7c969 560 buf_read[1]=spi.write(val);
DevinAlexander 0:b714c6a7c969 561 spiDisable();
DevinAlexander 0:b714c6a7c969 562 return 1;
DevinAlexander 0:b714c6a7c969 563 }
DevinAlexander 0:b714c6a7c969 564
DevinAlexander 0:b714c6a7c969 565
DevinAlexander 0:b714c6a7c969 566 //******************************************************************************
DevinAlexander 0:b714c6a7c969 567 bool MAX31856::registerWriteByte(uint8_t write_address, uint8_t val)
DevinAlexander 0:b714c6a7c969 568 {
DevinAlexander 0:b714c6a7c969 569 //Write the updated byte to the register
DevinAlexander 0:b714c6a7c969 570 spiEnable();
DevinAlexander 0:b714c6a7c969 571 spi.write(write_address);
DevinAlexander 0:b714c6a7c969 572 spi.write(val);
DevinAlexander 0:b714c6a7c969 573 spiDisable();
DevinAlexander 0:b714c6a7c969 574 return true;
DevinAlexander 0:b714c6a7c969 575 }
DevinAlexander 0:b714c6a7c969 576
DevinAlexander 0:b714c6a7c969 577 //******************************************************************************
DevinAlexander 0:b714c6a7c969 578 uint8_t MAX31856::registerReadByte(uint8_t read_address)
DevinAlexander 0:b714c6a7c969 579 {
DevinAlexander 0:b714c6a7c969 580 uint8_t buf_read, buf_write=read_address;
DevinAlexander 0:b714c6a7c969 581 spiEnable();
DevinAlexander 0:b714c6a7c969 582 buf_read=spi.write(buf_write);
DevinAlexander 0:b714c6a7c969 583 buf_read=spi.write(buf_write);
DevinAlexander 0:b714c6a7c969 584 spiDisable();
DevinAlexander 0:b714c6a7c969 585 return buf_read;
DevinAlexander 0:b714c6a7c969 586 }
DevinAlexander 0:b714c6a7c969 587
DevinAlexander 0:b714c6a7c969 588 //******************************************************************************
DevinAlexander 0:b714c6a7c969 589 void MAX31856::calculateDelayTime() {
DevinAlexander 0:b714c6a7c969 590 uint32_t temp_int;
DevinAlexander 0:b714c6a7c969 591
DevinAlexander 0:b714c6a7c969 592 if (conversion_mode==0 || thermocouple_conversion_count==0) {
DevinAlexander 0:b714c6a7c969 593 if (filter_mode==0) //60Hz
DevinAlexander 0:b714c6a7c969 594 temp_int=82+(samples-1)*33.33f;
DevinAlexander 0:b714c6a7c969 595 else //50Hz
DevinAlexander 0:b714c6a7c969 596 temp_int=98+(samples-1)*40.00f;
DevinAlexander 0:b714c6a7c969 597 }
DevinAlexander 0:b714c6a7c969 598 else {
DevinAlexander 0:b714c6a7c969 599 if (filter_mode==0) //60Hz
DevinAlexander 0:b714c6a7c969 600 temp_int=82+(samples-1)*16.67f;
DevinAlexander 0:b714c6a7c969 601 else //50Hz
DevinAlexander 0:b714c6a7c969 602 temp_int=98+(samples-1)*20.00f;
DevinAlexander 0:b714c6a7c969 603 }
DevinAlexander 0:b714c6a7c969 604
DevinAlexander 0:b714c6a7c969 605 if (cold_junction_enabled==0) //cold junction is disabled enabling 25 millisecond faster conversion times
DevinAlexander 0:b714c6a7c969 606 temp_int=temp_int-25;
DevinAlexander 0:b714c6a7c969 607 conversion_time=1000*temp_int; //set private member conversion time to calculated minimum wait time in microseconds
DevinAlexander 0:b714c6a7c969 608 return;
DevinAlexander 0:b714c6a7c969 609 }
DevinAlexander 0:b714c6a7c969 610
DevinAlexander 0:b714c6a7c969 611 //*****************************************************************************
DevinAlexander 0:b714c6a7c969 612 MAX31856::~MAX31856(void)
DevinAlexander 0:b714c6a7c969 613 {
DevinAlexander 0:b714c6a7c969 614 //empty block
DevinAlexander 0:b714c6a7c969 615 }
DevinAlexander 0:b714c6a7c969 616