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