improved MAX31855 Library with errorchecking
Fork of MAX31855 by
max31855.cpp@3:e2731f1e595b, 2016-01-07 (annotated)
- 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?
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 | 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 | } |