Library to interface with the MAX31723 PMON

Dependencies:   mbed

Fork of MAX31855 by Joe Staton

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?

UserRevisionLine numberNew 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 }