Library to interface with the MAX31855 Cold Junction Compensated Thermocouple-to-Digital Converter
Fork of MAX31855 by
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@1:5eeee89cb281, 2012-10-23 (annotated)
- Committer:
- Stavlin
- Date:
- Tue Oct 23 10:51:21 2012 +0000
- Revision:
- 1:5eeee89cb281
- Parent:
- 0:656c522152d4
- Child:
- 2:88ffddeb1e1d
Fixed fault reporting. Returns a value of 2000 + fault code on error.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Stavlin | 1:5eeee89cb281 | 1 | |
Stavlin | 1:5eeee89cb281 | 2 | #include <mbed.h> |
Stavlin | 1:5eeee89cb281 | 3 | #include "max31855.h" |
Stavlin | 1:5eeee89cb281 | 4 | |
Stavlin | 1:5eeee89cb281 | 5 | max31855::max31855(SPI& _spi, PinName _ncs) : spi(_spi), ncs(_ncs) { |
Stavlin | 1:5eeee89cb281 | 6 | |
Stavlin | 1:5eeee89cb281 | 7 | } |
Stavlin | 1:5eeee89cb281 | 8 | |
Stavlin | 1:5eeee89cb281 | 9 | float max31855::read_temp() { |
Stavlin | 1:5eeee89cb281 | 10 | short value = 0; |
Stavlin | 1:5eeee89cb281 | 11 | float temp = 0; |
Stavlin | 1:5eeee89cb281 | 12 | |
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 | |
Stavlin | 1:5eeee89cb281 | 17 | //Variables to hold chip temperature and device status |
Stavlin | 1:5eeee89cb281 | 18 | uint8_t tempChipHigh=0; |
Stavlin | 1:5eeee89cb281 | 19 | uint8_t tempChipLow=0; |
Stavlin | 1:5eeee89cb281 | 20 | |
Stavlin | 1:5eeee89cb281 | 21 | if (pollTimer.read_ms() > 250){ |
Stavlin | 1:5eeee89cb281 | 22 | //Set CS to initiate transfer and stop conversion |
Stavlin | 1:5eeee89cb281 | 23 | select(); |
Stavlin | 1:5eeee89cb281 | 24 | |
Stavlin | 1:5eeee89cb281 | 25 | //Read in Probe tempeature |
Stavlin | 1:5eeee89cb281 | 26 | tempProbeHigh = spi.write(0); |
Stavlin | 1:5eeee89cb281 | 27 | tempProbeLow = spi.write(0); |
Stavlin | 1:5eeee89cb281 | 28 | |
Stavlin | 1:5eeee89cb281 | 29 | //Get the chip temperature and the fault data |
Stavlin | 1:5eeee89cb281 | 30 | tempChipHigh = spi.write(0); |
Stavlin | 1:5eeee89cb281 | 31 | tempChipLow = spi.write(0); |
Stavlin | 1:5eeee89cb281 | 32 | |
Stavlin | 1:5eeee89cb281 | 33 | //Set the chip temperature |
Stavlin | 1:5eeee89cb281 | 34 | chipTemp = (tempChipHigh<<4 | tempChipLow>>4)*0.25; |
Stavlin | 1:5eeee89cb281 | 35 | |
Stavlin | 1:5eeee89cb281 | 36 | //Set CS to stop transfer and restart conversion |
Stavlin | 1:5eeee89cb281 | 37 | deselect(); |
Stavlin | 1:5eeee89cb281 | 38 | |
Stavlin | 1:5eeee89cb281 | 39 | //Check for a fault (last bit of transfer is fault bit) |
Stavlin | 1:5eeee89cb281 | 40 | if ((tempProbeLow & 1)==1){ |
Stavlin | 1:5eeee89cb281 | 41 | //Chip reports a fault, extract fault from Chip Temperature data |
Stavlin | 1:5eeee89cb281 | 42 | int faultType = (tempChipLow & 7); |
Stavlin | 1:5eeee89cb281 | 43 | |
Stavlin | 1:5eeee89cb281 | 44 | faultCode=faultType; |
Stavlin | 1:5eeee89cb281 | 45 | |
Stavlin | 1:5eeee89cb281 | 46 | return 2000+faultType; |
Stavlin | 1:5eeee89cb281 | 47 | /*if (faultType==1){ |
Stavlin | 1:5eeee89cb281 | 48 | //Open circuit (no TC) |
Stavlin | 1:5eeee89cb281 | 49 | return 2000 + faultType; |
Stavlin | 1:5eeee89cb281 | 50 | }else if (faultType==2){ |
Stavlin | 1:5eeee89cb281 | 51 | //Short to GND |
Stavlin | 1:5eeee89cb281 | 52 | return 2000 + faultType; |
Stavlin | 1:5eeee89cb281 | 53 | }else if (faultType==4){ |
Stavlin | 1:5eeee89cb281 | 54 | //Short to VCC |
Stavlin | 1:5eeee89cb281 | 55 | return 0.4; |
Stavlin | 1:5eeee89cb281 | 56 | }else{ |
Stavlin | 1:5eeee89cb281 | 57 | return 0.5; |
Stavlin | 1:5eeee89cb281 | 58 | }*/ |
Stavlin | 1:5eeee89cb281 | 59 | }else{ |
Stavlin | 1:5eeee89cb281 | 60 | //Integer value of temperature |
Stavlin | 1:5eeee89cb281 | 61 | value = (tempProbeHigh<< 6 | tempProbeLow>>2); |
Stavlin | 1:5eeee89cb281 | 62 | |
Stavlin | 1:5eeee89cb281 | 63 | //Get actual temperature (last 2 bits of integer are decimal 0.5 and 0.25) |
Stavlin | 1:5eeee89cb281 | 64 | temp = (value*0.25); // Multiply the value by 0.25 to get temp in C or |
Stavlin | 1:5eeee89cb281 | 65 | // * (9.0/5.0)) + 32.0; // Convert value to F (ensure proper floats!) |
Stavlin | 1:5eeee89cb281 | 66 | |
Stavlin | 1:5eeee89cb281 | 67 | return temp; |
Stavlin | 1:5eeee89cb281 | 68 | } |
Stavlin | 1:5eeee89cb281 | 69 | }else{ |
Stavlin | 1:5eeee89cb281 | 70 | //Chip not ready for reading |
Stavlin | 1:5eeee89cb281 | 71 | return -1; |
Stavlin | 1:5eeee89cb281 | 72 | } |
Stavlin | 1:5eeee89cb281 | 73 | } |
Stavlin | 1:5eeee89cb281 | 74 | |
Stavlin | 1:5eeee89cb281 | 75 | void max31855::select() { |
Stavlin | 1:5eeee89cb281 | 76 | //Set CS low to start transmission (interrupts conversion) |
Stavlin | 1:5eeee89cb281 | 77 | ncs = 0; |
Stavlin | 1:5eeee89cb281 | 78 | } |
Stavlin | 1:5eeee89cb281 | 79 | |
Stavlin | 1:5eeee89cb281 | 80 | void max31855::deselect() { |
Stavlin | 1:5eeee89cb281 | 81 | //Set CS high to stop transmission (restarts conversion) |
Stavlin | 1:5eeee89cb281 | 82 | ncs = 1; |
Stavlin | 1:5eeee89cb281 | 83 | //Reset conversion timer |
Stavlin | 1:5eeee89cb281 | 84 | pollTimer.reset(); |
Stavlin | 1:5eeee89cb281 | 85 | } |
Stavlin | 1:5eeee89cb281 | 86 | |
Stavlin | 1:5eeee89cb281 | 87 | void max31855::initialise(int setType) { |
Stavlin | 1:5eeee89cb281 | 88 | //Start the conversion timer |
Stavlin | 1:5eeee89cb281 | 89 | pollTimer.start(); |
Stavlin | 1:5eeee89cb281 | 90 | faultCode=0; |
Stavlin | 1:5eeee89cb281 | 91 | } |
Stavlin | 1:5eeee89cb281 | 92 | |
Stavlin | 1:5eeee89cb281 | 93 | int max31855::ready() { |
Stavlin | 1:5eeee89cb281 | 94 | //Check to see if conversion is complete |
Stavlin | 1:5eeee89cb281 | 95 | if (pollTimer.read_ms() > 250) { |
Stavlin | 1:5eeee89cb281 | 96 | //Conversion complete |
Stavlin | 1:5eeee89cb281 | 97 | return 1; |
Stavlin | 1:5eeee89cb281 | 98 | }else{ |
Stavlin | 1:5eeee89cb281 | 99 | //Conversion incomplete |
Stavlin | 1:5eeee89cb281 | 100 | return 0; |
Stavlin | 1:5eeee89cb281 | 101 | } |
Stavlin | 0:656c522152d4 | 102 | } |