improved MAX31855 Library with errorchecking
Fork of MAX31855 by
max31855.cpp@4:064382cf8d8e, 2016-01-07 (annotated)
- 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?
User | Revision | Line number | New 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 | } |