spectro and PT100
Fork of max31865 by
MAX31865.h@0:ae18c7b91185, 2016-08-14 (annotated)
- Committer:
- lzbpli
- Date:
- Sun Aug 14 05:09:52 2016 +0000
- Revision:
- 0:ae18c7b91185
- Child:
- 1:5262db31116a
max31865 driver
Who changed what in which revision?
User | Revision | Line number | New 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 |