MAX31856
Dependents: lib_MAX31856_example
Revision 3:9fb5fcf05ac3, committed 2021-07-23
- Comitter:
- YSI
- Date:
- Fri Jul 23 08:16:37 2021 +0000
- Parent:
- 2:c5e7f83a00ed
- Commit message:
- Correct bugs and make lot of changes in MAXIM origin lib
Changed in this revision
lib_MAX31856.cpp | Show annotated file Show diff for this revision Revisions of this file |
lib_MAX31856.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/lib_MAX31856.cpp Tue Oct 13 11:57:18 2020 +0000 +++ b/lib_MAX31856.cpp Fri Jul 23 08:16:37 2021 +0000 @@ -7,7 +7,7 @@ * * Started: SEPTEMBER 14th 2017 * -* Updated: +* Updated: Jully 2021 By Yannic Simon * * @brief Source file for MAX3185 class * @@ -44,58 +44,51 @@ * property whatsoever. Maxim Integrated Products, Inc. retains all * ownership rights. **********************************************************************/ - -#include <mbed.h> #include "lib_MAX31856.h" #define LOG(args...) printf(args) //***************************************************************************** -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) { +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) +{ spi.format(8,3); //configure the correct SPI mode to beable to program the registers intially correctly init_MAX31856 &= setThermocoupleType(_type); init_MAX31856 &= setEmiFilterFreq(_fltr); init_MAX31856 &= setNumSamplesAvg(_samples); init_MAX31856 &= setConversionMode(_conversion_mode); + lastReadTime = time(NULL); + wait_us(1000000); } //***************************************************************************** float MAX31856::readTC() { - if(!init_MAX31856) return NAN; //Check and see if the MAX31856 is set to conversion mode ALWAYS ON if (conversion_mode==0) { //means that the conversion mode is normally off - setOneShotMode(CR0_1_SHOT_MODE_ONE_CONVERSION); // turn on the one shot mode for singular conversion + init_MAX31856 &= setOneShotMode(CR0_1_SHOT_MODE_ONE_CONVERSION); // turn on the one shot mode for singular conversion thermocouple_conversion_count=0; //reset the conversion count back to zero to make sure minimum conversion time reflects one shot mode requirements } - + if(!init_MAX31856) return NAN; //calculate minimum wait time for conversions calculateDelayTime(); - //initialize other info for the read functionality uint32_t buf_read[3] = {0}, buf_write[3] = {ADDRESS_LTCBH_READ, ADDRESS_LTCBM_READ, ADDRESS_LTCBL_READ}; - - //bool read_thermocouple_temp = checkFaultsThermocoupleConnection(); //check and see if there are any faults that prohibit a normal read of the register - - //if(read_thermocouple_temp) { //no faults with connection are present so continue on with normal read of temperature - uint32_t time = us_ticker_read(); - uint32_t duration = time - lastReadTime; + if(checkFaultsThermocoupleConnection()) //no faults with connection are present so continue on with normal read of temperature + { + uint32_t tm = time(NULL)*1000000; + uint32_t duration = tm - lastReadTime; + lastReadTime = tm; if (duration > conversion_time) { for(int i=0; i<3; i++) buf_read[i] = registerReadByte(buf_write[i]); - //Convert the registers contents into the correct value - //int32_t temp = ((buf_read[0] & 0xFF) << 0x18) + ((buf_read[1] & 0xFF) << 0x10) + ((buf_read[2] & 0xFF) << 0x08); // LTCBH + LTCBM + LTCBL - int32_t temp = ((buf_read[0] & 0xFF) << 11) + ((buf_read[1] & 0xFF) << 3) + ((buf_read[2] & 0xFF) >> 5); // LTCBH + LTCBM + LTCBL - - //return prev_TC = (temp >> 0x0D) * 0.0078125; - return prev_TC = temp * 0.0078125; + int32_t temp = ((buf_read[0] & 0xFF) << 0x18) + ((buf_read[1] & 0xFF) << 0x10) + ((buf_read[2] & 0xFF) << 0x08); // LTCBH + LTCBM + LTCBL + return prev_TC = (temp >> 0x0D) * 0.0078125; } - //} + } thermocouple_conversion_count++; //iterate the conversion count to speed up time in between future converions in always on mode - - //checkFaultsThermocoupleThresholds(); //print any faults to the terminal + checkFaultsThermocoupleThresholds(); //print any faults to the terminal return prev_TC; } @@ -104,28 +97,10 @@ float MAX31856::readCJ() { if(!init_MAX31856) return NAN; - uint32_t buf_read[2] = {0}, buf_write[2] = {ADDRESS_CJTH_READ, ADDRESS_CJTL_READ}; - for(int i=0; i<2; i++) buf_read[i] = registerReadByte(buf_write[i]); - - //Convert the registers contents into the correct value int16_t temp = ((buf_read[0] & 0xFF) << 8) + (buf_read[1] & 0xFF); // CJTH + CJTL - - //checkFaultsColdJunctionThresholds(); //print any faults to the terminal return temp/256.0; - /*uint16_t buf_read[3]; - - spiEnable(); - for(int i=0; i<3; i++) buf_read[i] = spi.write(ADDRESS_CJTH_READ); - spiDisable(); - - //Convert the registers contents into the correct value - int16_t temp = ((buf_read[1] & 0xFF) << 8) + (buf_read[2] & 0xFF); // CJTH + CJTL - - //checkFaultsColdJunctionThresholds(); //print any faults to the terminal - printf("\r\nCJ %d", temp); - return ((temp==0)?NAN:(temp/256.0));*/ } //***************************************************************************** @@ -176,7 +151,7 @@ temp[i]=fault_byte; //Check if any of the faults for thermocouple connection are triggered - if ((fault_byte&0xB0)==0) //means no fault is detected for cold junction thresholds + if ((fault_byte&0xB0)==0) //means no fault is detected for cold junction thresholds return_int=0; else { if ((fault_byte&0x80)==0) { //check if normal operation of cold junction is true @@ -209,25 +184,7 @@ //***************************************************************************** bool MAX31856::checkFaultsThermocoupleConnection() { - uint8_t fault_byte=registerReadByte(ADDRESS_SR_READ); //Read contents of fault status register - uint8_t temp[2]; - for(int i=0; i<2; i++) - temp[i]=fault_byte; - - //Check if any of the faults for thermocouple connection are triggered - if (fault_byte==0) //means no fault is detected - return_val=1; - else{ - if (temp[0]&0x02) { - LOG("Overvotage/Undervoltage Fault triggered! Input voltage is negative or the voltage is greater than Vdd! Please check thermocouple connection!\r\n"); - return_val=0; - } - if (temp[1]&0x01) { - LOG("Open circuit fault detected! Please check thermocouple connection!\r\n"); - return_val=0; - } - } - return return_val; + return !registerReadByte(ADDRESS_SR_READ); //Read contents of fault status register } @@ -235,21 +192,17 @@ //***************************************************************************** bool MAX31856::setConversionMode(uint8_t val) { - if (val==CR0_CONV_MODE_NORMALLY_OFF) { - return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_7, val); - conversion_mode=0; - //LOG("Register containing\t\tsetConversionMode\t\twas programmed with the parameter\t\tCR0_CONV_MODE_NORMALLY_OFF\r\n"); - } - else if (val==CR0_CONV_MODE_NORMALLY_ON) { - return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_7, val); - conversion_mode=1; - //LOG("Register containing\t\tsetConversionMode\t\twas programmed with the parameter\t\tCR0_CONV_MODE_NORMALLY_ON\r\n"); + switch(val) + { + case CR0_CONV_MODE_NORMALLY_OFF: case CR0_CONV_MODE_NORMALLY_ON: + conversion_mode = (val == CR0_CONV_MODE_NORMALLY_ON)?1:0; + return registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_7, val); + break; + default: + //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"); + return false; + break; } - else { - 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"); - return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call - } - return return_val; } @@ -257,15 +210,16 @@ //***************************************************************************** bool MAX31856::setOneShotMode(uint8_t val) { - if (val==CR0_1_SHOT_MODE_NO_CONVERSION) - return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_6, val); - else if (val==CR0_1_SHOT_MODE_ONE_CONVERSION) - return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_6, val); - else { - 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"); - return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call + switch(val) + { + case CR0_1_SHOT_MODE_NO_CONVERSION: case CR0_1_SHOT_MODE_ONE_CONVERSION: + return registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_6, val); + break; + default: + //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"); + return false; + break; } - return return_val; } @@ -273,27 +227,16 @@ //***************************************************************************** bool MAX31856::setOpenCircuitFaultDetection(uint8_t val) { - if (val==CR0_OC_DETECT_DISABLED) { - return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_5_4, val); - LOG("Register containing\t\tsetOpenCircuitFaultDetection\t\twas programmed with the parameter\t\tCR0_OC_DETECT_DISABLED\r\n"); - } - else if (val==CR0_OC_DETECT_ENABLED_R_LESS_5k) { - return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_5_4, val); - LOG("Register containing\t\tsetOpenCircuitFaultDetection\t\twas programmed with the parameter\t\tCR0_OC_DETECT_ENABLED_R_LESS_5k\r\n"); + switch(val) + { + case CR0_OC_DETECT_DISABLED: case CR0_OC_DETECT_ENABLED_R_LESS_5k: case CR0_OC_DETECT_ENABLED_TC_LESS_2ms: case CR0_OC_DETECT_ENABLED_TC_MORE_2ms: + return registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_5_4, val); + break; + default: + //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"); + return false; + break; } - else if (val==CR0_OC_DETECT_ENABLED_TC_LESS_2ms) { - return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_5_4, val); - LOG("Register containing\t\tsetOpenCircuitFaultDetection\t\twas programmed with the parameter\t\tCR0_OC_DETECT_ENABLED_TC_LESS_2ms\r\n"); - } - else if (val==CR0_OC_DETECT_ENABLED_TC_MORE_2ms) { - return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_5_4, val); - LOG("Register containing\t\tsetOpenCircuitFaultDetection\t\twas programmed with the parameter\t\tCR0_OC_DETECT_ENABLED_TC_MORE_2ms\r\n"); - } - else { - 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"); - return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call - } - return return_val; } @@ -301,21 +244,17 @@ //***************************************************************************** bool MAX31856::setColdJunctionDisable(uint8_t val) { - if (val==CR0_COLD_JUNC_ENABLE) { - return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_3, val); - cold_junction_enabled=1; - LOG("Register containing\t\tsetColdJunctionDisable\t\twas programmed with the parameter\t\tCR0_COLD_JUNC_ENABLE\r\n"); + switch(val) + { + case CR0_COLD_JUNC_ENABLE: case CR0_COLD_JUNC_DISABLE: + cold_junction_enabled = (val==CR0_COLD_JUNC_ENABLE)?1:0; + return registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_3, val); + break; + default: + //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"); + return false; + break; } - else if (val==CR0_COLD_JUNC_DISABLE) { - return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_3, val); - cold_junction_enabled=0; - LOG("Register containing\t\tsetColdJunctionDisable\t\twas programmed with the parameter\t\tCR0_COLD_JUNC_DISABLE\r\n"); - } - else { - 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"); - return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call - } - return return_val; } @@ -323,19 +262,16 @@ //***************************************************************************** bool MAX31856::setFaultMode(uint8_t val) { - if (val==CR0_FAULT_MODE_COMPARATOR) { - return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_2, val); - LOG("Register containing\t\tsetFaultMode\t\twas programmed with the parameter\t\tCR0_FAULT_MODE_COMPARATOR\r\n"); + switch(val) + { + case CR0_FAULT_MODE_COMPARATOR: case CR0_FAULT_MODE_INTERUPT: + return registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_2, val); + break; + default: + //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"); + return false; + break; } - else if (val==CR0_FAULT_MODE_INTERUPT) { - return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_2, val); - LOG("Register containing\t\tsetFaultMode\t\twas programmed with the parameter\t\tCR0_FAULT_MODE_INTERUPT\r\n"); - } - else { - 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"); - return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call - } - return return_val; } @@ -343,19 +279,16 @@ //***************************************************************************** bool MAX31856::setFaultStatusClear(uint8_t val) { - if (val==CR0_FAULTCLR_DEFAULT_VAL) { - return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_1, val); - LOG("Register containing\t\tsetFaultStatusClear\t\twas programmed with the parameter\t\tCR0_FAULTCLR_DEFAULT_VAL\r\n"); + switch(val) + { + case CR0_FAULTCLR_DEFAULT_VAL: case CR0_FAULTCLR_RETURN_FAULTS_TO_ZERO: + return registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_1, val); + break; + default: + //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"); + return false; + break; } - else if (val==CR0_FAULTCLR_RETURN_FAULTS_TO_ZERO) { - return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_1, val); - LOG("Register containing\t\tsetFaultStatusClear\t\twas programmed with the parameter\t\tCR0_FAULTCLR_RETURN_FAULTS_TO_ZERO\r\n"); - } - else { - 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"); - return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call - } - return return_val; } @@ -363,120 +296,53 @@ //***************************************************************************** bool MAX31856::setEmiFilterFreq(uint8_t val) { - if (val==CR0_FILTER_OUT_60Hz) { - return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_0, val); - filter_mode=0; - //LOG("Register containing\t\tsetEmiFilterFreq\t\twas programmed with the parameter\t\tCR0_FILTER_OUT_60Hz\r\n"); + switch(val) + { + case CR0_FILTER_OUT_60Hz: case CR0_FILTER_OUT_50Hz: + filter_mode = val; + return registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_0, val); + break; + default: + //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"); + return false; + break; } - else if (val==CR0_FILTER_OUT_50Hz) { - return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_0, val); - filter_mode=1; - //LOG("Register containing\t\tsetEmiFilterFreq\t\twas programmed with the parameter\t\tCR0_FILTER_OUT_50Hz\r\n"); - } - else { - 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"); - return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call - } - return return_val; } //Register:CR1 Bits: 6:4 //***************************************************************************** bool MAX31856::setNumSamplesAvg(uint8_t val) -{ - if (val==CR1_AVG_TC_SAMPLES_1) { - return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_6_4, val); - samples=1; - //LOG("Register containing\t\tsetNumSamplesAvg\t\twas programmed with the parameter\t\tCR1_AVG_TC_SAMPLES_1\r\n"); - } - else if (val==CR1_AVG_TC_SAMPLES_2) { - return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_6_4, val); - samples=2; - //LOG("Register containing\t\tsetNumSamplesAvg\t\twas programmed with the parameter\t\tCR1_AVG_TC_SAMPLES_2\r\n"); - } - else if (val==CR1_AVG_TC_SAMPLES_4) { - return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_6_4, val); - samples=4; - //LOG("Register containing\t\tsetNumSamplesAvg\t\twas programmed with the parameter\t\tCR1_AVG_TC_SAMPLES_4\r\n"); +{ + switch(val) + { + case CR1_AVG_TC_SAMPLES_1: case CR1_AVG_TC_SAMPLES_2: case CR1_AVG_TC_SAMPLES_4: case CR1_AVG_TC_SAMPLES_8: case CR1_AVG_TC_SAMPLES_16: + samples = 1 << (val >> 4); + return registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_6_4, val); + break; + default: + //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"); + return false; + break; } - else if (val==CR1_AVG_TC_SAMPLES_8) { - return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_6_4, val); - samples=8; - //LOG("Register containing\t\tsetNumSamplesAvg\t\twas programmed with the parameter\t\tCR1_AVG_TC_SAMPLES_8\r\n"); - } - else if (val==CR1_AVG_TC_SAMPLES_16) { - return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_6_4, val); - samples=16; - //LOG("Register containing\t\tsetNumSamplesAvg\t\twas programmed with the parameter\t\tCR1_AVG_TC_SAMPLES_16\r\n"); - } - else { - 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"); - return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call - } - return return_val; } //Register:CR1 Bits: 3:0 //***************************************************************************** bool MAX31856::setThermocoupleType(uint8_t val) -{ - if (val==CR1_TC_TYPE_B) { - return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_3_0, val); - voltage_mode=false; - //LOG("Register containing\t\tsetThermocoupleType\t\twas programmed with the parameter\t\tCR1_TC_TYPE_B\r\n"); - } - else if (val==CR1_TC_TYPE_E) { - return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_3_0, val); - voltage_mode=false; - //LOG("Register containing\t\tsetThermocoupleType\t\twas programmed with the parameter\t\tCR1_TC_TYPE_E\r\n"); - } - else if (val==CR1_TC_TYPE_J) { - return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_3_0, val); - voltage_mode=false; - //LOG("Register containing\t\tsetThermocoupleType\t\twas programmed with the parameter\t\tCR1_TC_TYPE_J\r\n"); - } - else if (val==CR1_TC_TYPE_K) { - return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_3_0, val); - voltage_mode=false; - //LOG("Register containing\t\tsetThermocoupleType\t\twas programmed with the parameter\t\tCR1_TC_TYPE_K\r\n"); - } - else if (val==CR1_TC_TYPE_N) { - return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_3_0, val); - voltage_mode=false; - //LOG("Register containing\t\tsetThermocoupleType\t\twas programmed with the parameter\t\tCR1_TC_TYPE_N\r\n"); +{ + switch(val) + { + case CR1_TC_TYPE_B: case CR1_TC_TYPE_E: case CR1_TC_TYPE_J: case CR1_TC_TYPE_K: case CR1_TC_TYPE_N: case CR1_TC_TYPE_R: case CR1_TC_TYPE_S: case CR1_TC_TYPE_T: case CR1_TC_TYPE_VOLT_MODE_GAIN_8: case CR1_TC_TYPE_VOLT_MODE_GAIN_32: + voltage_mode = ((val == CR1_TC_TYPE_VOLT_MODE_GAIN_8) || (val == CR1_TC_TYPE_VOLT_MODE_GAIN_32)); + return registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_3_0, val); + break; + default: + //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"); + return false; + break; } - else if (val==CR1_TC_TYPE_R) { - return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_3_0, val); - voltage_mode=false; - //LOG("Register containing\t\tsetThermocoupleType\t\twas programmed with the parameter\t\tCR1_TC_TYPE_R\r\n"); - } - else if (val==CR1_TC_TYPE_S) { - return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_3_0, val); - voltage_mode=false; - //LOG("Register containing\t\tsetThermocoupleType\t\twas programmed with the parameter\t\tCR1_TC_TYPE_S\r\n"); - } - else if (val==CR1_TC_TYPE_T) { - return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_3_0, val); - voltage_mode=false; - //LOG("Register containing\t\tsetThermocoupleType\t\twas programmed with the parameter\t\tCR1_TC_TYPE_T\r\n"); - } - else if (val==CR1_TC_TYPE_VOLT_MODE_GAIN_8) { - return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_3_0, val); - voltage_mode=true; - //LOG("Register containing\t\tsetThermocoupleType\t\twas programmed with the parameter\t\tCR1_TC_TYPE_VOLT_MODE_GAIN_8\r\n"); - } - else if (val==CR1_TC_TYPE_VOLT_MODE_GAIN_32) { - return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_3_0, val); - voltage_mode=true; - //LOG("Register containing\t\tsetThermocoupleType\t\twas programmed with the parameter\t\tCR1_TC_TYPE_VOLT_MODE_GAIN_32\r\n"); - } - else { - 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"); - return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call - } - return return_val; } @@ -484,37 +350,32 @@ //***************************************************************************** bool MAX31856::setFaultMasks(uint8_t val, bool enable) { - if(enable) - val=0; - if (val==MASK_CJ_FAULT_THRESHOLD_HIGH) { //Cold Junction High Threshold Fault Mask - return_val=registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_5, val); - LOG("Register containing\t\tsetFaultMasks\t\twas programmed with the parameter\t\tMASK_CJ_FAULT_THRESHOLD_HIGH\r\n"); - } - else if (val==MASK_CJ_FAULT_THRESHOLD_LOW) { //Cold Junction Low Threshold Fault Mask - return_val=registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_4, val); - LOG("Register containing\t\tsetFaultMasks\t\twas programmed with the parameter\t\tMASK_CJ_FAULT_THRESHOLD_LOW\r\n"); - } - else if (val==MASK_TC_FAULT_THRESHOLD_HIGH) { //Thermocouple High Threshold Fault Mask - return_val=registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_3, val); - LOG("Register containing\t\tsetFaultMasks\t\twas programmed with the parameter\t\tMASK_TC_FAULT_THRESHOLD_HIGH\r\n"); + if(enable) val = 0; + switch(val) + { + case MASK_CJ_FAULT_THRESHOLD_HIGH: + return registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_5, val); + break; + case MASK_CJ_FAULT_THRESHOLD_LOW: + return registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_4, val); + break; + case MASK_TC_FAULT_THRESHOLD_HIGH: + return registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_3, val); + break; + case MASK_TC_FAULT_THRESHOLD_LOW: + return registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_2, val); + break; + case MASK_OVER_UNDER_VOLT_FAULT: + return registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_1, val); + break; + case MASK_OPEN_CIRCUIT_FAULT: + return registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_0, val); + break; + default: + //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"); + return false; + break; } - else if (val==MASK_TC_FAULT_THRESHOLD_LOW) { //Thermocouple Low Threshold Fault Mask - return_val=registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_2, val); - LOG("Register containing\t\tsetFaultMasks\t\twas programmed with the parameter\t\tMASK_TC_FAULT_THRESHOLD_LOW\r\n"); - } - else if (val==MASK_OVER_UNDER_VOLT_FAULT) { //Over-Voltage/Under-Voltage Input Fault Mask - return_val=registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_1, val); - LOG("Register containing\t\tsetFaultMasks\t\twas programmed with the parameter\t\tMASK_OVER_UNDER_VOLT_FAULT\r\n"); - } - else if (val==MASK_OPEN_CIRCUIT_FAULT) { //Thermocouple Open-Circuit Fault Mask - return_val=registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_0, val); - LOG("Register containing\t\tsetFaultMasks\t\twas programmed with the parameter\t\tMASK_OPEN_CIRCUIT_FAULT\r\n"); - } - else { - 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"); - return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call - } - return return_val; } @@ -522,49 +383,45 @@ //****************************************************************************** bool MAX31856::setFaultThresholds(uint8_t val, float temperature) { - if (val==MASK_CJ_FAULT_THRESHOLD_HIGH) { //Cold Junction High Threshold Fault Mask - int8_t temperature_byte=temperature; - return_val=registerWriteByte(ADDRESS_CJHF_WRITE, temperature_byte); - } - else if (val==MASK_CJ_FAULT_THRESHOLD_LOW) { //Cold Junction Low Threshold Fault Mask - int8_t temperature_byte=temperature; - return_val=registerWriteByte(ADDRESS_CJLF_WRITE, temperature_byte); + switch(val) + { + case MASK_CJ_FAULT_THRESHOLD_HIGH: + return registerWriteByte(ADDRESS_CJHF_WRITE, temperature); + break; + case MASK_CJ_FAULT_THRESHOLD_LOW: + return registerWriteByte(ADDRESS_CJLF_WRITE, temperature); + break; + case MASK_TC_FAULT_THRESHOLD_HIGH:{ + int8_t temperature_byte[2]; + int16_t temperature_multi_byte =temperature*4.0; + temperature_byte[0]=((uint8_t)((temperature_multi_byte)&(0xFF00) >> 8)); + temperature_byte[1]=((uint8_t)((temperature_multi_byte)&(0x00FF))); + return registerWriteByte(ADDRESS_LTHFTH_WRITE, temperature_byte[0]) && registerWriteByte(ADDRESS_LTHFTL_WRITE, temperature_byte[1]);} + break; + case MASK_TC_FAULT_THRESHOLD_LOW:{ + int8_t temperature_byte[2]; + int16_t temperature_multi_byte =temperature*4.0; + temperature_byte[0]=((uint8_t)((temperature_multi_byte)&(0xFF00) >> 8)); + temperature_byte[1]=((uint8_t)((temperature_multi_byte)&(0x00FF))); + return registerWriteByte(ADDRESS_LTLFTH_WRITE, temperature_byte[0]) && registerWriteByte(ADDRESS_LTLFTL_WRITE, temperature_byte[1]);} + break; + default: + return false; + //LOG("Please select correct threshold register to program with the correct value!\r\n"); + break; } - else if (val==MASK_TC_FAULT_THRESHOLD_HIGH) { //Thermocouple High Threshold Fault Mask - int8_t temperature_byte[2]; - int16_t temperature_multi_byte =temperature*4.0; - //now split up the 16bit int into two bytes to program the registers with - temperature_byte[0]=((uint8_t)((temperature_multi_byte)&(0xFF00) >> 8)); - temperature_byte[1]=((uint8_t)((temperature_multi_byte)&(0x00FF))); - - return_val=registerWriteByte(ADDRESS_LTHFTH_WRITE, temperature_byte[0]); - return_val=registerWriteByte(ADDRESS_LTHFTL_WRITE, temperature_byte[1]); - } - else if (val==MASK_TC_FAULT_THRESHOLD_LOW) { //Thermocouple LOW Threshold Fault Mask - int8_t temperature_byte[2]; - int16_t temperature_multi_byte =temperature*4.0; - //now split up the 16bit int into two bytes to program the registers with - temperature_byte[0]=((uint8_t)((temperature_multi_byte)&(0xFF00) >> 8)); - temperature_byte[1]=((uint8_t)((temperature_multi_byte)&(0x00FF))); - - return_val=registerWriteByte(ADDRESS_LTHFTH_WRITE, temperature_byte[0]); - return_val=registerWriteByte(ADDRESS_LTHFTL_WRITE, temperature_byte[1]); - } - else - LOG("Please select correct threshold register to program with the correct value!\r\n"); - return return_val; } //****************************************************************************** bool MAX31856::coldJunctionOffset(float temperature) { - if (temperature > 7.9375 || temperature < -8.0) { - LOG("Input value to offest the cold junction point is non valid. enter in value in range -8 to +7.9375\r\n"); - return_val = 0; + if (temperature > 7.9375 || temperature < -8.0) + { + //LOG("Input value to offest the cold junction point is non valid. enter in value in range -8 to +7.9375\r\n"); + return false; } int8_t temp_val=temperature*16.0f; //normalize the value to get rid of decimal and shorten it to size of register - return_val=registerWriteByte(ADDRESS_CJTO_WRITE, temp_val); //write the byte to cold junction offset register - return return_val; + return registerWriteByte(ADDRESS_CJTO_WRITE, temp_val); //write the byte to cold junction offset register } @@ -588,40 +445,12 @@ //****************************************************************************** bool MAX31856::registerReadWriteByte(uint8_t read_address, uint8_t write_address, int clear_bits, uint8_t val) { - /*uint8_t buf_read[2]; - //Read the current contents of a register - spiEnable(); - for(int i=0; i<2; i++) buf_read[i] = spi.write(read_address); - spiDisable(); + uint8_t buf_read = registerReadByte(read_address); //Modify contents pulled from the register - buf_read[1] &= clear_bits; //Clear the contents of bits of parameter you are trying to clear for later or equal operation - buf_read[1] |= val; //Bitwise OR the input parameter with cleaned buf_read[1] to create new byte - val = buf_read[1]; - - //Write the updated byte to the register - spiEnable(); - spi.write(write_address); - spi.write(val); - spiDisable(); - //return 1; - - // ajout YSI pour verification - spiEnable(); - for(int i=0; i<2; i++) buf_read[i] = spi.write(read_address); - spiDisable(); - return buf_read[1] == val;*/ - - // Version YSI - uint8_t buf_read; - - //Read the current contents of a register - buf_read = registerReadByte(read_address); - - //Modify contents pulled from the register - buf_read &= clear_bits; //Clear the contents of bits of parameter you are trying to clear for later or equal operation - buf_read |= val; //Bitwise OR the input parameter with cleaned buf_read[1] to create new byte + buf_read &= clear_bits; //Clear the contents of bits of parameter you are trying to clear for later or equal operation + buf_read |= val; //Bitwise OR the input parameter with cleaned buf_read[1] to create new byte val = buf_read; //Write the updated byte to the register
--- a/lib_MAX31856.h Tue Oct 13 11:57:18 2020 +0000 +++ b/lib_MAX31856.h Fri Jul 23 08:16:37 2021 +0000 @@ -7,7 +7,7 @@ * * Started: SEPTEMBER 14th 2017 * -* Updated: +* Updated: Jully 2021 By Yannic Simon * * @brief Header file for MAX31856 class * @@ -45,9 +45,9 @@ * ownership rights. **********************************************************************/ - #ifndef MAX31856_h #define MAX31856_h +#include <ctime> #include "mbed.h" //***************************************************************************** @@ -545,7 +545,7 @@ ///time in milliseconds that is needed minimum for a new conversion to take place uint32_t conversion_time; - float prev_TC; + float prev_TC = NAN; }; -#endif /* __MAX31856_H_ */ +#endif /* __MAX31856_H_ */ \ No newline at end of file