improved MAX31855 Library with errorchecking

Fork of MAX31855 by Eric Patterson

Committer:
nielsvanmegen
Date:
Thu Jan 07 09:24:49 2016 +0000
Revision:
3:e2731f1e595b
Parent:
2:2613cf295ccb
Child:
4:064382cf8d8e
added interval time to init function

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Stavlin 1:5eeee89cb281 1 #include <mbed.h>
Stavlin 1:5eeee89cb281 2 #include "max31855.h"
Stavlin 1:5eeee89cb281 3
nielsvanmegen 2:2613cf295ccb 4 max31855::max31855(SPI& _spi, PinName ncs1, PinName ncs2) : _spi(_spi), _CS_1(ncs1), _CS_2(ncs2)
nielsvanmegen 2:2613cf295ccb 5 {
Stavlin 1:5eeee89cb281 6
Stavlin 1:5eeee89cb281 7 }
Stavlin 1:5eeee89cb281 8
nielsvanmegen 2:2613cf295ccb 9 float max31855::read_temp(max31855::THERMOCOUPLES thermo)
nielsvanmegen 2:2613cf295ccb 10 {
Stavlin 1:5eeee89cb281 11 short value = 0;
Stavlin 1:5eeee89cb281 12 float temp = 0;
Stavlin 1:5eeee89cb281 13 //Variables to hold probe temperature
Stavlin 1:5eeee89cb281 14 uint8_t tempProbeHigh=0;
Stavlin 1:5eeee89cb281 15 uint8_t tempProbeLow=0;
Stavlin 1:5eeee89cb281 16 //Variables to hold chip temperature and device status
Stavlin 1:5eeee89cb281 17 uint8_t tempChipHigh=0;
Stavlin 1:5eeee89cb281 18 uint8_t tempChipLow=0;
nielsvanmegen 2:2613cf295ccb 19 if (_pollTimer.read_ms() > 250) {
Stavlin 1:5eeee89cb281 20 //Set CS to initiate transfer and stop conversion
nielsvanmegen 2:2613cf295ccb 21 select(thermo);
Stavlin 1:5eeee89cb281 22 //Read in Probe tempeature
nielsvanmegen 2:2613cf295ccb 23 tempProbeHigh = _spi.write(0);
nielsvanmegen 2:2613cf295ccb 24 tempProbeLow = _spi.write(0);
Stavlin 1:5eeee89cb281 25 //Get the chip temperature and the fault data
nielsvanmegen 2:2613cf295ccb 26 tempChipHigh = _spi.write(0);
nielsvanmegen 2:2613cf295ccb 27 tempChipLow = _spi.write(0);
nielsvanmegen 2:2613cf295ccb 28 //Set the chip temperature
nielsvanmegen 2:2613cf295ccb 29 _chipTemp = (tempChipHigh<<4 | tempChipLow>>4)*0.0625;
Stavlin 1:5eeee89cb281 30 //Set CS to stop transfer and restart conversion
nielsvanmegen 2:2613cf295ccb 31 deselect(thermo);
nielsvanmegen 2:2613cf295ccb 32 if (CHECK_BIT(tempProbeLow, 0)) {
nielsvanmegen 2:2613cf295ccb 33 //not connected error
nielsvanmegen 2:2613cf295ccb 34 if(CHECK_BIT(tempChipLow, 0))return -2;
nielsvanmegen 2:2613cf295ccb 35 //short to ground
nielsvanmegen 2:2613cf295ccb 36 else if(CHECK_BIT(tempChipLow, 1))return -3;
nielsvanmegen 2:2613cf295ccb 37 //short to VCC
nielsvanmegen 2:2613cf295ccb 38 else if(CHECK_BIT(tempChipLow, 2))return -4;
nielsvanmegen 2:2613cf295ccb 39 else return -5;
nielsvanmegen 2:2613cf295ccb 40 } else {
Stavlin 1:5eeee89cb281 41 //Integer value of temperature
Stavlin 1:5eeee89cb281 42 value = (tempProbeHigh<< 6 | tempProbeLow>>2);
Stavlin 1:5eeee89cb281 43 //Get actual temperature (last 2 bits of integer are decimal 0.5 and 0.25)
Stavlin 1:5eeee89cb281 44 temp = (value*0.25); // Multiply the value by 0.25 to get temp in C or
nielsvanmegen 2:2613cf295ccb 45 // * (9.0/5.0)) + 32.0; // Convert value to F (ensure proper floats!)
Stavlin 1:5eeee89cb281 46 return temp;
Stavlin 1:5eeee89cb281 47 }
nielsvanmegen 2:2613cf295ccb 48 } else {
nielsvanmegen 2:2613cf295ccb 49 return 8;
Stavlin 1:5eeee89cb281 50 }
Stavlin 1:5eeee89cb281 51 }
Stavlin 1:5eeee89cb281 52
nielsvanmegen 2:2613cf295ccb 53 void max31855::select(THERMOCOUPLES thermo)
nielsvanmegen 2:2613cf295ccb 54 {
Stavlin 1:5eeee89cb281 55 //Set CS low to start transmission (interrupts conversion)
nielsvanmegen 2:2613cf295ccb 56 if(thermo == THERMO_1) _CS_1 = 0;
nielsvanmegen 2:2613cf295ccb 57 else _CS_2 = 0;
Stavlin 1:5eeee89cb281 58 }
Stavlin 1:5eeee89cb281 59
nielsvanmegen 2:2613cf295ccb 60 void max31855::deselect(THERMOCOUPLES thermo)
nielsvanmegen 2:2613cf295ccb 61 {
nielsvanmegen 2:2613cf295ccb 62 //Set CS high to stop transmission (restarts conversion)
nielsvanmegen 2:2613cf295ccb 63 if(thermo == THERMO_1) _CS_1 = 1;
nielsvanmegen 2:2613cf295ccb 64 else _CS_2 = 1;
nielsvanmegen 2:2613cf295ccb 65 _pollTimer.reset();
Stavlin 1:5eeee89cb281 66 }
Stavlin 1:5eeee89cb281 67
nielsvanmegen 3:e2731f1e595b 68 void max31855::initialise(uint32_t interval)
nielsvanmegen 2:2613cf295ccb 69 {
nielsvanmegen 2:2613cf295ccb 70 //Start the conversion timer
nielsvanmegen 3:e2731f1e595b 71 _readInterval = interval;
nielsvanmegen 2:2613cf295ccb 72 _pollTimer.start();
nielsvanmegen 2:2613cf295ccb 73 _faultCode=0;
nielsvanmegen 2:2613cf295ccb 74 }
nielsvanmegen 2:2613cf295ccb 75
nielsvanmegen 2:2613cf295ccb 76 int max31855::ready()
nielsvanmegen 2:2613cf295ccb 77 {
Stavlin 1:5eeee89cb281 78 //Check to see if conversion is complete
nielsvanmegen 3:e2731f1e595b 79 if(_pollTimer.read_ms() > _readInterval ) return 1;
nielsvanmegen 2:2613cf295ccb 80 else return 0;
Stavlin 0:656c522152d4 81 }