improved MAX31855 Library with errorchecking

Fork of MAX31855 by Eric Patterson

Committer:
nielsvanmegen
Date:
Thu Jan 07 09:47:13 2016 +0000
Revision:
4:064382cf8d8e
Parent:
3:e2731f1e595b
added functionality;

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 4:064382cf8d8e 19 //Set CS to initiate transfer and stop conversion
nielsvanmegen 4:064382cf8d8e 20 select(thermo);
nielsvanmegen 4:064382cf8d8e 21 //Read in Probe tempeature
nielsvanmegen 4:064382cf8d8e 22 tempProbeHigh = _spi.write(0);
nielsvanmegen 4:064382cf8d8e 23 tempProbeLow = _spi.write(0);
nielsvanmegen 4:064382cf8d8e 24 //Get the chip temperature and the fault data
nielsvanmegen 4:064382cf8d8e 25 tempChipHigh = _spi.write(0);
nielsvanmegen 4:064382cf8d8e 26 tempChipLow = _spi.write(0);
nielsvanmegen 4:064382cf8d8e 27 //Set the chip temperature
nielsvanmegen 4:064382cf8d8e 28 _chipTemp = (tempChipHigh<<4 | tempChipLow>>4)*0.0625;
nielsvanmegen 4:064382cf8d8e 29 //Set CS to stop transfer and restart conversion
nielsvanmegen 4:064382cf8d8e 30 deselect(thermo);
nielsvanmegen 4:064382cf8d8e 31 if (CHECK_BIT(tempProbeLow, 0)) {
nielsvanmegen 4:064382cf8d8e 32 //not connected error
nielsvanmegen 4:064382cf8d8e 33 if(CHECK_BIT(tempChipLow, 0))return -2;
nielsvanmegen 4:064382cf8d8e 34 //short to ground
nielsvanmegen 4:064382cf8d8e 35 else if(CHECK_BIT(tempChipLow, 1))return -3;
nielsvanmegen 4:064382cf8d8e 36 //short to VCC
nielsvanmegen 4:064382cf8d8e 37 else if(CHECK_BIT(tempChipLow, 2))return -4;
nielsvanmegen 4:064382cf8d8e 38 else return -5;
nielsvanmegen 2:2613cf295ccb 39 } else {
nielsvanmegen 4:064382cf8d8e 40 //Integer value of temperature
nielsvanmegen 4:064382cf8d8e 41 value = (tempProbeHigh<< 6 | tempProbeLow>>2);
nielsvanmegen 4:064382cf8d8e 42 //Get actual temperature (last 2 bits of integer are decimal 0.5 and 0.25)
nielsvanmegen 4:064382cf8d8e 43 temp = (value*0.25); // Multiply the value by 0.25 to get temp in C or
nielsvanmegen 4:064382cf8d8e 44 // * (9.0/5.0)) + 32.0; // Convert value to F (ensure proper floats!)
nielsvanmegen 4:064382cf8d8e 45 return temp;
Stavlin 1:5eeee89cb281 46 }
Stavlin 1:5eeee89cb281 47 }
Stavlin 1:5eeee89cb281 48
nielsvanmegen 2:2613cf295ccb 49 void max31855::select(THERMOCOUPLES thermo)
nielsvanmegen 2:2613cf295ccb 50 {
Stavlin 1:5eeee89cb281 51 //Set CS low to start transmission (interrupts conversion)
nielsvanmegen 2:2613cf295ccb 52 if(thermo == THERMO_1) _CS_1 = 0;
nielsvanmegen 2:2613cf295ccb 53 else _CS_2 = 0;
Stavlin 1:5eeee89cb281 54 }
Stavlin 1:5eeee89cb281 55
nielsvanmegen 2:2613cf295ccb 56 void max31855::deselect(THERMOCOUPLES thermo)
nielsvanmegen 2:2613cf295ccb 57 {
nielsvanmegen 2:2613cf295ccb 58 //Set CS high to stop transmission (restarts conversion)
nielsvanmegen 2:2613cf295ccb 59 if(thermo == THERMO_1) _CS_1 = 1;
nielsvanmegen 2:2613cf295ccb 60 else _CS_2 = 1;
nielsvanmegen 2:2613cf295ccb 61 _pollTimer.reset();
Stavlin 1:5eeee89cb281 62 }
Stavlin 1:5eeee89cb281 63
nielsvanmegen 3:e2731f1e595b 64 void max31855::initialise(uint32_t interval)
nielsvanmegen 2:2613cf295ccb 65 {
nielsvanmegen 2:2613cf295ccb 66 //Start the conversion timer
nielsvanmegen 3:e2731f1e595b 67 _readInterval = interval;
nielsvanmegen 2:2613cf295ccb 68 _pollTimer.start();
nielsvanmegen 2:2613cf295ccb 69 _faultCode=0;
nielsvanmegen 2:2613cf295ccb 70 }
nielsvanmegen 2:2613cf295ccb 71
nielsvanmegen 4:064382cf8d8e 72 bool max31855::ready()
nielsvanmegen 2:2613cf295ccb 73 {
Stavlin 1:5eeee89cb281 74 //Check to see if conversion is complete
nielsvanmegen 4:064382cf8d8e 75 if(_pollTimer.read_ms() > _readInterval ) return true;
nielsvanmegen 4:064382cf8d8e 76 else return false;
Stavlin 0:656c522152d4 77 }