AA

Fork of max31865 by lzbp li

Committer:
lzbpli
Date:
Sun Aug 14 05:09:52 2016 +0000
Revision:
0:ae18c7b91185
max31865 driver

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lzbpli 0:ae18c7b91185 1 /**************************************************************************
lzbpli 0:ae18c7b91185 2 * Arduino driver library for the MAX31865.
lzbpli 0:ae18c7b91185 3 *
lzbpli 0:ae18c7b91185 4 * Copyright (C) 2015 Ole Wolf <wolf@blazingangles.com>
lzbpli 0:ae18c7b91185 5 *
lzbpli 0:ae18c7b91185 6 *
lzbpli 0:ae18c7b91185 7 * Wire the circuit as follows, assuming that level converters have been
lzbpli 0:ae18c7b91185 8 * added for the 3.3V signals:
lzbpli 0:ae18c7b91185 9 *
lzbpli 0:ae18c7b91185 10 * Arduino Uno --> MAX31865
lzbpli 0:ae18c7b91185 11 * ------------------------------------
lzbpli 0:ae18c7b91185 12 * CS: any available pin --> CS
lzbpli 0:ae18c7b91185 13 * MOSI: pin 11 --> SDI (mandatory for hardware SPI)
lzbpli 0:ae18c7b91185 14 * MISO: pin 12 --> SDO (mandatory for hardware SPI)
lzbpli 0:ae18c7b91185 15 * SCK: pin 13 --> SCLK (mandatory for hardware SPI)
lzbpli 0:ae18c7b91185 16 *
lzbpli 0:ae18c7b91185 17 *
lzbpli 0:ae18c7b91185 18 * This program is free software: you can redistribute it and/or modify
lzbpli 0:ae18c7b91185 19 * it under the terms of the GNU General Public License as published by
lzbpli 0:ae18c7b91185 20 * the Free Software Foundation, either version 3 of the License, or
lzbpli 0:ae18c7b91185 21 * (at your option) any later version.
lzbpli 0:ae18c7b91185 22 *
lzbpli 0:ae18c7b91185 23 * This program is distributed in the hope that it will be useful,
lzbpli 0:ae18c7b91185 24 * but WITHOUT ANY WARRANTY; without even the implied warranty of
lzbpli 0:ae18c7b91185 25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
lzbpli 0:ae18c7b91185 26 * GNU General Public License for more details.
lzbpli 0:ae18c7b91185 27 *
lzbpli 0:ae18c7b91185 28 * You should have received a copy of the GNU General Public License
lzbpli 0:ae18c7b91185 29 * along with this program. If not, see <http://www.gnu.org/licenses/>.
lzbpli 0:ae18c7b91185 30 **************************************************************************/
lzbpli 0:ae18c7b91185 31
lzbpli 0:ae18c7b91185 32
lzbpli 0:ae18c7b91185 33 #ifndef _MAX31865_H
lzbpli 0:ae18c7b91185 34 #define _MAX31865_H
lzbpli 0:ae18c7b91185 35
lzbpli 0:ae18c7b91185 36 #include <stdint.h>
lzbpli 0:ae18c7b91185 37 #include "mbed.h"
lzbpli 0:ae18c7b91185 38
lzbpli 0:ae18c7b91185 39 #define MAX31865_FAULT_HIGH_THRESHOLD ( 1 << 7 )
lzbpli 0:ae18c7b91185 40 #define MAX31865_FAULT_LOW_THRESHOLD ( 1 << 6 )
lzbpli 0:ae18c7b91185 41 #define MAX31865_FAULT_REFIN ( 1 << 5 )
lzbpli 0:ae18c7b91185 42 #define MAX31865_FAULT_REFIN_FORCE ( 1 << 4 )
lzbpli 0:ae18c7b91185 43 #define MAX31865_FAULT_RTDIN_FORCE ( 1 << 3 )
lzbpli 0:ae18c7b91185 44 #define MAX31865_FAULT_VOLTAGE ( 1 << 2 )
lzbpli 0:ae18c7b91185 45
lzbpli 0:ae18c7b91185 46 #define MAX31865_FAULT_DETECTION_NONE ( 0x00 << 2 )
lzbpli 0:ae18c7b91185 47 #define MAX31865_FAULT_DETECTION_AUTO ( 0x01 << 2 )
lzbpli 0:ae18c7b91185 48 #define MAX31865_FAULT_DETECTION_MANUAL_1 ( 0x02 << 2 )
lzbpli 0:ae18c7b91185 49 #define MAX31865_FAULT_DETECTION_MANUAL_2 ( 0x03 << 2 )
lzbpli 0:ae18c7b91185 50
lzbpli 0:ae18c7b91185 51
lzbpli 0:ae18c7b91185 52
lzbpli 0:ae18c7b91185 53 /* RTD data, RTD current, and measurement reference
lzbpli 0:ae18c7b91185 54 voltage. The ITS-90 standard is used; other RTDs
lzbpli 0:ae18c7b91185 55 may have coefficients defined by the DIN 43760 or
lzbpli 0:ae18c7b91185 56 the U.S. Industrial (American) standard. */
lzbpli 0:ae18c7b91185 57 #define RTD_A_ITS90 3.9080e-3
lzbpli 0:ae18c7b91185 58 #define RTD_A_USINDUSTRIAL 3.9692e-3
lzbpli 0:ae18c7b91185 59 #define RTD_A_DIN43760 3.9848e-3
lzbpli 0:ae18c7b91185 60 #define RTD_B_ITS90 -5.870e-7
lzbpli 0:ae18c7b91185 61 #define RTD_B_USINDUSTRIAL -5.8495e-7
lzbpli 0:ae18c7b91185 62 #define RTD_B_DIN43760 -5.8019e-7
lzbpli 0:ae18c7b91185 63 /* RTD coefficient C is required only for temperatures
lzbpli 0:ae18c7b91185 64 below 0 deg. C. The selected RTD coefficient set
lzbpli 0:ae18c7b91185 65 is specified below. */
lzbpli 0:ae18c7b91185 66 #define SELECT_RTD_HELPER(x) x
lzbpli 0:ae18c7b91185 67 #define SELECT_RTD(x) SELECT_RTD_HELPER(x)
lzbpli 0:ae18c7b91185 68 #define RTD_A SELECT_RTD(RTD_A_ITS90)
lzbpli 0:ae18c7b91185 69 #define RTD_B SELECT_RTD(RTD_B_ITS90)
lzbpli 0:ae18c7b91185 70 /*
lzbpli 0:ae18c7b91185 71 * The reference resistor on the hardware; see the MAX31865 datasheet
lzbpli 0:ae18c7b91185 72 * for details. The values 400 and 4000 Ohm are recommended values for
lzbpli 0:ae18c7b91185 73 * the PT100 and PT1000.
lzbpli 0:ae18c7b91185 74 */
lzbpli 0:ae18c7b91185 75 #define RTD_RREF_PT100 400 /* Ohm */
lzbpli 0:ae18c7b91185 76 #define RTD_RREF_PT1000 4000 /* Ohm */
lzbpli 0:ae18c7b91185 77 /*
lzbpli 0:ae18c7b91185 78 * The RTD resistance at 0 degrees Celcius. For the PT100, this is 100 Ohm;
lzbpli 0:ae18c7b91185 79 * for the PT1000, it is 1000 Ohm.
lzbpli 0:ae18c7b91185 80 */
lzbpli 0:ae18c7b91185 81 #define RTD_RESISTANCE_PT100 100 /* Ohm */
lzbpli 0:ae18c7b91185 82 #define RTD_RESISTANCE_PT1000 1000 /* Ohm */
lzbpli 0:ae18c7b91185 83
lzbpli 0:ae18c7b91185 84 #define RTD_ADC_RESOLUTION ( 1u << 15 ) /* 15 bits */
lzbpli 0:ae18c7b91185 85
lzbpli 0:ae18c7b91185 86
lzbpli 0:ae18c7b91185 87 /* See the main (MAX31865.cpp) file for documentation of the class methods. */
lzbpli 0:ae18c7b91185 88 class MAX31865_RTD
lzbpli 0:ae18c7b91185 89 {
lzbpli 0:ae18c7b91185 90 public:
lzbpli 0:ae18c7b91185 91 enum ptd_type { RTD_PT100, RTD_PT1000 };
lzbpli 0:ae18c7b91185 92
lzbpli 0:ae18c7b91185 93 MAX31865_RTD( ptd_type type,PinName mosi, PinName miso, PinName sclk, PinName nss);
lzbpli 0:ae18c7b91185 94 void configure( bool v_bias, bool conversion_mode, bool one_shot, bool three_wire,
lzbpli 0:ae18c7b91185 95 uint8_t fault_cycle, bool fault_clear, bool filter_50hz,
lzbpli 0:ae18c7b91185 96 uint16_t low_threshold, uint16_t high_threshold );
lzbpli 0:ae18c7b91185 97 uint8_t read_all( );
lzbpli 0:ae18c7b91185 98 double temperature( ) const;
lzbpli 0:ae18c7b91185 99 uint8_t configuration( ) const { return( (measured_configuration == configuration_control_bits)? configuration_control_bits:measured_configuration); }
lzbpli 0:ae18c7b91185 100 uint8_t status( ) const { return( measured_status ); }
lzbpli 0:ae18c7b91185 101 uint16_t low_threshold( ) const { return( measured_low_threshold ); }
lzbpli 0:ae18c7b91185 102 uint16_t high_threshold( ) const { return( measured_high_threshold ); }
lzbpli 0:ae18c7b91185 103 uint16_t raw_resistance( ) const { return( measured_resistance ); }
lzbpli 0:ae18c7b91185 104 double resistance( ) const
lzbpli 0:ae18c7b91185 105 {
lzbpli 0:ae18c7b91185 106 const double rtd_rref =
lzbpli 0:ae18c7b91185 107 ( this->type == RTD_PT100 ) ? (double)RTD_RREF_PT100 : (double)RTD_RREF_PT1000;
lzbpli 0:ae18c7b91185 108 return( (double)raw_resistance( ) * rtd_rref / (double)RTD_ADC_RESOLUTION );
lzbpli 0:ae18c7b91185 109 }
lzbpli 0:ae18c7b91185 110
lzbpli 0:ae18c7b91185 111 private:
lzbpli 0:ae18c7b91185 112
lzbpli 0:ae18c7b91185 113 /*!
lzbpli 0:ae18c7b91185 114 * SPI Interface
lzbpli 0:ae18c7b91185 115 */
lzbpli 0:ae18c7b91185 116 SPI spi; // mosi, miso, sclk
lzbpli 0:ae18c7b91185 117 DigitalOut nss;
lzbpli 0:ae18c7b91185 118 /* Our configuration. */
lzbpli 0:ae18c7b91185 119 // uint8_t cs_pin;
lzbpli 0:ae18c7b91185 120 ptd_type type;
lzbpli 0:ae18c7b91185 121 uint8_t configuration_control_bits;
lzbpli 0:ae18c7b91185 122 uint16_t configuration_low_threshold;
lzbpli 0:ae18c7b91185 123 uint16_t configuration_high_threshold;
lzbpli 0:ae18c7b91185 124 void reconfigure( );
lzbpli 0:ae18c7b91185 125
lzbpli 0:ae18c7b91185 126 /* Values read from the device. */
lzbpli 0:ae18c7b91185 127 uint8_t measured_configuration;
lzbpli 0:ae18c7b91185 128 uint16_t measured_resistance;
lzbpli 0:ae18c7b91185 129 uint16_t measured_high_threshold;
lzbpli 0:ae18c7b91185 130 uint16_t measured_low_threshold;
lzbpli 0:ae18c7b91185 131 uint8_t measured_status;
lzbpli 0:ae18c7b91185 132 };
lzbpli 0:ae18c7b91185 133
lzbpli 0:ae18c7b91185 134 #endif /* _MAX31865_H */
lzbpli 0:ae18c7b91185 135