Library to interface with the MAX31855 Cold Junction Compensated Thermocouple-to-Digital Converter

Fork of MAX31855 by Joe Staton

The libary is from Joe Station. The conversion factor for the internal chip temperature is changed from 0.25 to 0.0625 to read out the correct chip temperature.

max31855.cpp

Committer:
Stavlin
Date:
2012-08-16
Revision:
0:656c522152d4
Child:
1:5eeee89cb281

File content as of revision 0:656c522152d4:


#include <mbed.h>
#include "max31855.h"

max31855::max31855(SPI& _spi, PinName _ncs) : spi(_spi), ncs(_ncs) {

}

float max31855::read_temp() {
    short value = 0;
    float temp = 0;
    
    //Variables to hold probe temperature
    uint8_t tempProbeHigh=0;
    uint8_t tempProbeLow=0;
    
    //Variables to hold chip temperature and device status
    uint8_t tempChipHigh=0;
    uint8_t tempChipLow=0;
    
    if (pollTimer.read_ms() > 250){
        //Set CS to initiate transfer and stop conversion
        select();
    
        //Read in Probe tempeature
        tempProbeHigh = spi.write(0);
        tempProbeLow = spi.write(0);
        
        //Get the chip temperature and the fault data
        tempChipHigh = spi.write(0);
        tempChipLow = spi.write(0);
        
        //Set the chip temperature    
        chipTemp = (tempChipHigh<<4 | tempChipLow>>4)*0.25;
        
        //Check for a fault (last bit of transfer is fault bit)
        if ((tempProbeLow & 1)==1){
            //Chip reports a fault, extract fault from Chip Temperature data
                        int faultType = (tempChipLow & 7);
            
            if (faultType==1){
                //Open circuit (no TC)
                return 0.1;
            }else if (faultType==2){
                //Short to GND
                return 0.2;
            }else if (faultType==4){
                //Short to VCC               
                return 0.4;
            }else{
                return 0.5;
            }
        }else{
            //Set CS to stop transfer and restart conversion
            deselect();    
    
            //Integer value of temperature
            value = (tempProbeHigh<< 6 | tempProbeLow>>2);
    
            //Get actual temperature (last 2 bits of integer are decimal 0.5 and 0.25)
            temp = (value*0.25); // Multiply the value by 0.25 to get temp in C or
                             //  * (9.0/5.0)) + 32.0;   // Convert value to F (ensure proper floats!)
                             
            return temp;
        }
    }else{
        //Chip not ready for reading
        return -1;
    }
}

void max31855::select() {
    //Set CS low to start transmission (interrupts conversion)
    ncs = 0;
}

void max31855::deselect() {
    //Set CS high to stop transmission (restarts conversion)
    ncs = 1;
    //Reset conversion timer
    pollTimer.reset();
}

void max31855::initialise() {
    //Start the conversion timer
    pollTimer.start();
}

int max31855::ready() {
    //Check to see if conversion is complete
    if (pollTimer.read_ms() > 250) {
        //Conversion complete
        return 1;
    }else{
        //Conversion incomplete
        return 0;
    }
}