Quick & dirty port of the Adafruit library for their MAX31865 temperature sensor board. It is designed to be used with the swspi library which in turn is designed to be used on the MAX32630FTHR board.

Dependents:   Rocket

Committer:
danjulio
Date:
Sun Jun 11 04:00:56 2017 +0000
Revision:
0:9294dd756a0c
Initial commit of max31865 ported to mbed with swspi

Who changed what in which revision?

UserRevisionLine numberNew contents of line
danjulio 0:9294dd756a0c 1 /***************************************************
danjulio 0:9294dd756a0c 2 This is a library for the Adafruit PT100/P1000 RTD Sensor w/MAX31865
danjulio 0:9294dd756a0c 3
danjulio 0:9294dd756a0c 4 Designed specifically to work with the Adafruit RTD Sensor
danjulio 0:9294dd756a0c 5 ----> https://www.adafruit.com/products/3328
danjulio 0:9294dd756a0c 6
danjulio 0:9294dd756a0c 7 This sensor uses SPI to communicate, 4 pins are required to
danjulio 0:9294dd756a0c 8 interface
danjulio 0:9294dd756a0c 9 Adafruit invests time and resources providing this open source code,
danjulio 0:9294dd756a0c 10 please support Adafruit and open-source hardware by purchasing
danjulio 0:9294dd756a0c 11 products from Adafruit!
danjulio 0:9294dd756a0c 12
danjulio 0:9294dd756a0c 13 Written by Limor Fried/Ladyada for Adafruit Industries.
danjulio 0:9294dd756a0c 14 BSD license, all text above must be included in any redistribution
danjulio 0:9294dd756a0c 15
danjulio 0:9294dd756a0c 16 Modified for mbed project - Dan Julio - 5/2017
danjulio 0:9294dd756a0c 17 ****************************************************/
danjulio 0:9294dd756a0c 18 #include "Adafruit_MAX31865.h"
danjulio 0:9294dd756a0c 19
danjulio 0:9294dd756a0c 20 Adafruit_MAX31865::Adafruit_MAX31865(swspi& spiO, int ssNum, PinName rdyPin)
danjulio 0:9294dd756a0c 21 :
danjulio 0:9294dd756a0c 22 ssN(ssNum),
danjulio 0:9294dd756a0c 23 spi(spiO)
danjulio 0:9294dd756a0c 24 {
danjulio 0:9294dd756a0c 25 debug = false;
danjulio 0:9294dd756a0c 26 rdyP = new DigitalIn(rdyPin);
danjulio 0:9294dd756a0c 27 }
danjulio 0:9294dd756a0c 28
danjulio 0:9294dd756a0c 29 bool Adafruit_MAX31865::begin(max31865_numwires_t wires) {
danjulio 0:9294dd756a0c 30
danjulio 0:9294dd756a0c 31 /*
danjulio 0:9294dd756a0c 32 for (uint8_t i=0; i<8; i++) {
danjulio 0:9294dd756a0c 33 readRegister8(i);
danjulio 0:9294dd756a0c 34 }
danjulio 0:9294dd756a0c 35 */
danjulio 0:9294dd756a0c 36
danjulio 0:9294dd756a0c 37 setWires(wires);
danjulio 0:9294dd756a0c 38 enableBias(false);
danjulio 0:9294dd756a0c 39 autoConvert(false);
danjulio 0:9294dd756a0c 40 clearFault();
danjulio 0:9294dd756a0c 41
danjulio 0:9294dd756a0c 42 if (debug) {
danjulio 0:9294dd756a0c 43 printf("config: 0x%2x\r\n", readRegister8(MAX31865_CONFIG_REG));
danjulio 0:9294dd756a0c 44 }
danjulio 0:9294dd756a0c 45 return true;
danjulio 0:9294dd756a0c 46 }
danjulio 0:9294dd756a0c 47
danjulio 0:9294dd756a0c 48
danjulio 0:9294dd756a0c 49 uint8_t Adafruit_MAX31865::readFault(void) {
danjulio 0:9294dd756a0c 50 return readRegister8(MAX31865_FAULTSTAT_REG);
danjulio 0:9294dd756a0c 51 }
danjulio 0:9294dd756a0c 52
danjulio 0:9294dd756a0c 53 void Adafruit_MAX31865::clearFault(void) {
danjulio 0:9294dd756a0c 54 uint8_t t = readRegister8(MAX31865_CONFIG_REG);
danjulio 0:9294dd756a0c 55 t &= ~0x2C;
danjulio 0:9294dd756a0c 56 t |= MAX31865_CONFIG_FAULTSTAT;
danjulio 0:9294dd756a0c 57 writeRegister8(MAX31865_CONFIG_REG, t);
danjulio 0:9294dd756a0c 58 }
danjulio 0:9294dd756a0c 59
danjulio 0:9294dd756a0c 60 void Adafruit_MAX31865::enableBias(bool b) {
danjulio 0:9294dd756a0c 61 uint8_t t = readRegister8(MAX31865_CONFIG_REG);
danjulio 0:9294dd756a0c 62 if (b) {
danjulio 0:9294dd756a0c 63 t |= MAX31865_CONFIG_BIAS; // enable bias
danjulio 0:9294dd756a0c 64 } else {
danjulio 0:9294dd756a0c 65 t &= ~MAX31865_CONFIG_BIAS; // disable bias
danjulio 0:9294dd756a0c 66 }
danjulio 0:9294dd756a0c 67 writeRegister8(MAX31865_CONFIG_REG, t);
danjulio 0:9294dd756a0c 68 }
danjulio 0:9294dd756a0c 69
danjulio 0:9294dd756a0c 70 void Adafruit_MAX31865::autoConvert(bool b) {
danjulio 0:9294dd756a0c 71 uint8_t t = readRegister8(MAX31865_CONFIG_REG);
danjulio 0:9294dd756a0c 72 if (b) {
danjulio 0:9294dd756a0c 73 t |= MAX31865_CONFIG_MODEAUTO; // enable autoconvert
danjulio 0:9294dd756a0c 74 } else {
danjulio 0:9294dd756a0c 75 t &= ~MAX31865_CONFIG_MODEAUTO; // disable autoconvert
danjulio 0:9294dd756a0c 76 }
danjulio 0:9294dd756a0c 77 writeRegister8(MAX31865_CONFIG_REG, t);
danjulio 0:9294dd756a0c 78 }
danjulio 0:9294dd756a0c 79
danjulio 0:9294dd756a0c 80 void Adafruit_MAX31865::setWires(max31865_numwires_t wires ) {
danjulio 0:9294dd756a0c 81 uint8_t t = readRegister8(MAX31865_CONFIG_REG);
danjulio 0:9294dd756a0c 82 if (wires == MAX31865_3WIRE) {
danjulio 0:9294dd756a0c 83 t |= MAX31865_CONFIG_3WIRE;
danjulio 0:9294dd756a0c 84 } else {
danjulio 0:9294dd756a0c 85 // 2 or 4 wire
danjulio 0:9294dd756a0c 86 t &= ~MAX31865_CONFIG_3WIRE;
danjulio 0:9294dd756a0c 87 }
danjulio 0:9294dd756a0c 88 writeRegister8(MAX31865_CONFIG_REG, t);
danjulio 0:9294dd756a0c 89 }
danjulio 0:9294dd756a0c 90
danjulio 0:9294dd756a0c 91 float Adafruit_MAX31865::temperature(float RTDnominal, float refResistor, uint16_t rtdVal) {
danjulio 0:9294dd756a0c 92 // http://www.analog.com/media/en/technical-documentation/application-notes/AN709_0.pdf
danjulio 0:9294dd756a0c 93
danjulio 0:9294dd756a0c 94 float Z1, Z2, Z3, Z4, Rt, temp;
danjulio 0:9294dd756a0c 95
danjulio 0:9294dd756a0c 96 if (rtdVal == 0) {
danjulio 0:9294dd756a0c 97 Rt = readRTD();
danjulio 0:9294dd756a0c 98 } else {
danjulio 0:9294dd756a0c 99 Rt = rtdVal;
danjulio 0:9294dd756a0c 100 }
danjulio 0:9294dd756a0c 101 Rt /= 32768;
danjulio 0:9294dd756a0c 102 Rt *= refResistor;
danjulio 0:9294dd756a0c 103
danjulio 0:9294dd756a0c 104 if (debug) {
danjulio 0:9294dd756a0c 105 printf("Resistance: %1.4f\r\n", Rt);
danjulio 0:9294dd756a0c 106 }
danjulio 0:9294dd756a0c 107
danjulio 0:9294dd756a0c 108 Z1 = -RTD_A;
danjulio 0:9294dd756a0c 109 Z2 = RTD_A * RTD_A - (4 * RTD_B);
danjulio 0:9294dd756a0c 110 Z3 = (4 * RTD_B) / RTDnominal;
danjulio 0:9294dd756a0c 111 Z4 = 2 * RTD_B;
danjulio 0:9294dd756a0c 112
danjulio 0:9294dd756a0c 113 temp = Z2 + (Z3 * Rt);
danjulio 0:9294dd756a0c 114 temp = (sqrt(temp) + Z1) / Z4;
danjulio 0:9294dd756a0c 115
danjulio 0:9294dd756a0c 116 if (temp >= 0) return temp;
danjulio 0:9294dd756a0c 117
danjulio 0:9294dd756a0c 118 // ugh.
danjulio 0:9294dd756a0c 119 float rpoly = Rt;
danjulio 0:9294dd756a0c 120
danjulio 0:9294dd756a0c 121 temp = -242.02f;
danjulio 0:9294dd756a0c 122 temp += 2.2228f * rpoly;
danjulio 0:9294dd756a0c 123 rpoly *= Rt; // square
danjulio 0:9294dd756a0c 124 temp += (float) 2.5859e-3 * rpoly;
danjulio 0:9294dd756a0c 125 rpoly *= Rt; // ^3
danjulio 0:9294dd756a0c 126 temp -= (float) 4.8260e-6 * rpoly;
danjulio 0:9294dd756a0c 127 rpoly *= Rt; // ^4
danjulio 0:9294dd756a0c 128 temp -= (float) 2.8183e-8 * rpoly;
danjulio 0:9294dd756a0c 129 rpoly *= Rt; // ^5
danjulio 0:9294dd756a0c 130 temp += (float) 1.5243e-10 * rpoly;
danjulio 0:9294dd756a0c 131
danjulio 0:9294dd756a0c 132 return temp;
danjulio 0:9294dd756a0c 133 }
danjulio 0:9294dd756a0c 134
danjulio 0:9294dd756a0c 135
danjulio 0:9294dd756a0c 136 bool Adafruit_MAX31865::isReady(uint16_t* rtdVal) {
danjulio 0:9294dd756a0c 137 if (rdyP->read() == 0) {
danjulio 0:9294dd756a0c 138 *rtdVal = readRegister16(MAX31865_RTDMSB_REG);
danjulio 0:9294dd756a0c 139
danjulio 0:9294dd756a0c 140 // remove fault
danjulio 0:9294dd756a0c 141 *rtdVal >>= 1;
danjulio 0:9294dd756a0c 142 return true;
danjulio 0:9294dd756a0c 143 } else {
danjulio 0:9294dd756a0c 144 return false;
danjulio 0:9294dd756a0c 145 }
danjulio 0:9294dd756a0c 146 }
danjulio 0:9294dd756a0c 147
danjulio 0:9294dd756a0c 148
danjulio 0:9294dd756a0c 149 uint16_t Adafruit_MAX31865::readRTD (void) {
danjulio 0:9294dd756a0c 150 clearFault();
danjulio 0:9294dd756a0c 151 enableBias(true);
danjulio 0:9294dd756a0c 152 wait_ms(10);
danjulio 0:9294dd756a0c 153 uint8_t t = readRegister8(MAX31865_CONFIG_REG);
danjulio 0:9294dd756a0c 154 t |= MAX31865_CONFIG_1SHOT;
danjulio 0:9294dd756a0c 155 writeRegister8(MAX31865_CONFIG_REG, t);
danjulio 0:9294dd756a0c 156 wait_ms(65);
danjulio 0:9294dd756a0c 157
danjulio 0:9294dd756a0c 158 uint16_t rtd = readRegister16(MAX31865_RTDMSB_REG);
danjulio 0:9294dd756a0c 159
danjulio 0:9294dd756a0c 160 // remove fault
danjulio 0:9294dd756a0c 161 rtd >>= 1;
danjulio 0:9294dd756a0c 162
danjulio 0:9294dd756a0c 163 return rtd;
danjulio 0:9294dd756a0c 164 }
danjulio 0:9294dd756a0c 165
danjulio 0:9294dd756a0c 166 /**********************************************/
danjulio 0:9294dd756a0c 167
danjulio 0:9294dd756a0c 168 uint8_t Adafruit_MAX31865::readRegister8(uint8_t addr) {
danjulio 0:9294dd756a0c 169 return spi.spiRead(addr, 1, ssN);
danjulio 0:9294dd756a0c 170 }
danjulio 0:9294dd756a0c 171
danjulio 0:9294dd756a0c 172 uint16_t Adafruit_MAX31865::readRegister16(uint8_t addr) {
danjulio 0:9294dd756a0c 173 uint8_t buffer[2];
danjulio 0:9294dd756a0c 174
danjulio 0:9294dd756a0c 175 spi.spiBurstRead(addr, buffer, 2, 1, ssN);
danjulio 0:9294dd756a0c 176
danjulio 0:9294dd756a0c 177 uint16_t ret = buffer[0];
danjulio 0:9294dd756a0c 178 ret <<= 8;
danjulio 0:9294dd756a0c 179 ret |= buffer[1];
danjulio 0:9294dd756a0c 180
danjulio 0:9294dd756a0c 181 return ret;
danjulio 0:9294dd756a0c 182 }
danjulio 0:9294dd756a0c 183
danjulio 0:9294dd756a0c 184
danjulio 0:9294dd756a0c 185 void Adafruit_MAX31865::readRegisterN(uint8_t addr, uint8_t buffer[], uint8_t n) {
danjulio 0:9294dd756a0c 186 addr &= 0x7F; // make sure top bit is not set
danjulio 0:9294dd756a0c 187
danjulio 0:9294dd756a0c 188 spi.spiBurstRead(addr, buffer, n, 1, ssN);
danjulio 0:9294dd756a0c 189
danjulio 0:9294dd756a0c 190 if (debug) {
danjulio 0:9294dd756a0c 191 printf("$0x%2x: ", addr);
danjulio 0:9294dd756a0c 192 while (n--) {
danjulio 0:9294dd756a0c 193 printf(" 0x%2x", *buffer++);
danjulio 0:9294dd756a0c 194 }
danjulio 0:9294dd756a0c 195 printf("\n");
danjulio 0:9294dd756a0c 196 }
danjulio 0:9294dd756a0c 197 }
danjulio 0:9294dd756a0c 198
danjulio 0:9294dd756a0c 199
danjulio 0:9294dd756a0c 200 void Adafruit_MAX31865::writeRegister8(uint8_t addr, uint8_t data) {
danjulio 0:9294dd756a0c 201 spi.spiWrite(addr, data, 1, ssN);
danjulio 0:9294dd756a0c 202
danjulio 0:9294dd756a0c 203 if (debug) {
danjulio 0:9294dd756a0c 204 printf("$0x%2x = 0x%2x\r\n", addr, data);
danjulio 0:9294dd756a0c 205 }
danjulio 0:9294dd756a0c 206 }
danjulio 0:9294dd756a0c 207