NTC temperature sensor going to A:D input. Topology is: (Vref or 3.3V) -> Series_resistor -> A:D_input -> NTC -> GND. Easy modification of NTC parameters w/o recompile of library

Dependents:   ntc_helloworld

Committer:
loopsva
Date:
Wed Apr 12 16:56:27 2017 +0000
Revision:
6:8e6bd0f9877b
Parent:
5:9655397ba539
Child:
7:1de44d8867a3
changed the way get_ntc_beta is done.  Now a single commanf

Who changed what in which revision?

UserRevisionLine numberNew contents of line
loopsva 0:c0bdc272d5da 1 /*
loopsva 0:c0bdc272d5da 2 * mbed library for NTC analog pin that translates an A:D input
loopsva 3:1eb4f5296281 3 * voltage to a temperature value.
loopsva 3:1eb4f5296281 4 *
loopsva 3:1eb4f5296281 5 *
loopsva 0:c0bdc272d5da 6 * topology: Vref -> SeriesRes -> A:D -> NTC -> GND
loopsva 3:1eb4f5296281 7 *
loopsva 0:c0bdc272d5da 8 */
loopsva 0:c0bdc272d5da 9
loopsva 0:c0bdc272d5da 10 #ifndef MBED_NTC
loopsva 0:c0bdc272d5da 11 #define MBED_NTC
loopsva 0:c0bdc272d5da 12
loopsva 0:c0bdc272d5da 13 /**
loopsva 0:c0bdc272d5da 14 * Private data structure for NTC data values.
loopsva 0:c0bdc272d5da 15 *
loopsva 0:c0bdc272d5da 16 **/
loopsva 0:c0bdc272d5da 17 typedef struct {
loopsva 0:c0bdc272d5da 18 float vref; /*!< Referense voltage*/
loopsva 0:c0bdc272d5da 19 float ad_resolution; /*!< A:D resolution*/
loopsva 0:c0bdc272d5da 20 int ntc_res; /*!< NTC resistance value at 25C*/
loopsva 0:c0bdc272d5da 21 int ntc_tol; /*!< NTC initial tolerance %*/
loopsva 5:9655397ba539 22 int ntc_beta_0050; /*!< NTC Beta, B0/50*/
loopsva 0:c0bdc272d5da 23 int ntc_beta_2550; /*!< NTC Beta, B25/50*/
loopsva 0:c0bdc272d5da 24 int ntc_beta_2580; /*!< NTC Beta, B25/80*/
loopsva 0:c0bdc272d5da 25 int ntc_beta_2585; /*!< NTC Beta, B25/85*/
loopsva 0:c0bdc272d5da 26 int ntc_beta_25100; /*!< NTC Beta, B25/100*/
loopsva 5:9655397ba539 27 int ntc_beta_other; /*!< NTC Beta, other value vs temp*/
loopsva 0:c0bdc272d5da 28 int ntc_beta_tol; /*!< NTC Beta tolerance %*/
loopsva 0:c0bdc272d5da 29 int sres_res; /*!< Series resistor value*/
loopsva 0:c0bdc272d5da 30 int sres_tol; /*!< Series resistor tolerance %*/
loopsva 0:c0bdc272d5da 31 int sres_ppm; /*!< Series resistor tempco in ppm*/
loopsva 0:c0bdc272d5da 32 } NTC_TypeDef;
loopsva 0:c0bdc272d5da 33
loopsva 0:c0bdc272d5da 34 /**
loopsva 0:c0bdc272d5da 35 * Default values for data structure above
loopsva 0:c0bdc272d5da 36 *
loopsva 0:c0bdc272d5da 37 **/
loopsva 0:c0bdc272d5da 38 const NTC_TypeDef ntc_std_paramtr = {
loopsva 0:c0bdc272d5da 39 // Vref
loopsva 0:c0bdc272d5da 40 3.0f, // Vref
loopsva 0:c0bdc272d5da 41 16384.0f, // A:D resolution
loopsva 0:c0bdc272d5da 42 // muRata NCP15XH103J03RC
loopsva 0:c0bdc272d5da 43 20000, // NTC resistance
loopsva 0:c0bdc272d5da 44 3, // NTC initial tolerance
loopsva 5:9655397ba539 45 0, // NTC B0/50, none
loopsva 0:c0bdc272d5da 46 3300, // NTC B25/50
loopsva 0:c0bdc272d5da 47 3322, // NTC B25/80
loopsva 0:c0bdc272d5da 48 3333, // NTC B25/85
loopsva 0:c0bdc272d5da 49 3344, // NTC B25/100
loopsva 5:9655397ba539 50 0, // NTC other Beta value
loopsva 0:c0bdc272d5da 51 2, // NTC beta tolerance
loopsva 0:c0bdc272d5da 52 // 3.32k 1% 100ppm
loopsva 0:c0bdc272d5da 53 4750, // Series resistor value
loopsva 5:9655397ba539 54 1, // Series resistor tolerance
loopsva 5:9655397ba539 55 200 // Series Resistor tempco ppm
loopsva 0:c0bdc272d5da 56 };
loopsva 0:c0bdc272d5da 57
loopsva 1:2314fd8959b2 58 /** NTC temperature A:D conversion
loopsva 0:c0bdc272d5da 59 *
loopsva 0:c0bdc272d5da 60 * @code
loopsva 2:c843c06cc651 61 * #include "mbed.h"
loopsva 2:c843c06cc651 62 * #include "ntc.h"
loopsva 2:c843c06cc651 63 *
loopsva 3:1eb4f5296281 64 * #define NTC_VREF 3.3f
loopsva 3:1eb4f5296281 65 * #define NTC_AD_RESOL 65536.0f
loopsva 3:1eb4f5296281 66 *
loopsva 3:1eb4f5296281 67 * // Connections:
loopsva 3:1eb4f5296281 68 *
loopsva 3:1eb4f5296281 69 * // 3.3V (or other Vref)
loopsva 3:1eb4f5296281 70 * // --+--
loopsva 3:1eb4f5296281 71 * // |
loopsva 3:1eb4f5296281 72 * // -+-
loopsva 3:1eb4f5296281 73 * // | |
loopsva 3:1eb4f5296281 74 * // | |
loopsva 3:1eb4f5296281 75 * // | | Series
loopsva 3:1eb4f5296281 76 * // | | Resistor
loopsva 3:1eb4f5296281 77 * // | |
loopsva 3:1eb4f5296281 78 * // -+-
loopsva 3:1eb4f5296281 79 * // |
loopsva 3:1eb4f5296281 80 * // +---> To A:D
loopsva 3:1eb4f5296281 81 * // |
loopsva 3:1eb4f5296281 82 * // -+-
loopsva 3:1eb4f5296281 83 * // | |
loopsva 3:1eb4f5296281 84 * // | |
loopsva 3:1eb4f5296281 85 * // | | NTC
loopsva 3:1eb4f5296281 86 * // | |
loopsva 3:1eb4f5296281 87 * // | |
loopsva 3:1eb4f5296281 88 * // -+-
loopsva 3:1eb4f5296281 89 * // |
loopsva 3:1eb4f5296281 90 * // --+--
loopsva 3:1eb4f5296281 91 * // --- Ground
loopsva 3:1eb4f5296281 92 * // -
loopsva 3:1eb4f5296281 93 *
loopsva 2:c843c06cc651 94 *
loopsva 2:c843c06cc651 95 * const NTC_TypeDef ntc_my_paramtr = {
loopsva 2:c843c06cc651 96 * // Vref
loopsva 3:1eb4f5296281 97 * NTC_VREF, // Vref
loopsva 4:5d0dfa665cba 98 * NTC_AD_RESOL, // A:D 16-bit resolution
loopsva 2:c843c06cc651 99 * // muRata NCP15XH103J03RC
loopsva 2:c843c06cc651 100 * 10000, // NTC resistance
loopsva 2:c843c06cc651 101 * 5, // NTC initial tolerance
loopsva 5:9655397ba539 102 * 0, // NTC B0/50 (none)
loopsva 2:c843c06cc651 103 * 3380, // NTC B25/50
loopsva 2:c843c06cc651 104 * 3428, // NTC B25/80
loopsva 2:c843c06cc651 105 * 3434, // NTC B25/85
loopsva 2:c843c06cc651 106 * 3355, // NTC B25/100
loopsva 5:9655397ba539 107 * 0, // NTC other beta (none)
loopsva 2:c843c06cc651 108 * 1, // NTC beta tolerance
loopsva 2:c843c06cc651 109 * // 3.32k 1% 100ppm
loopsva 2:c843c06cc651 110 * 3320, // Series resistor value
loopsva 2:c843c06cc651 111 * 1, // Series resistor tolerance
loopsva 2:c843c06cc651 112 * 100 // Series Resistor tempco ppm
loopsva 2:c843c06cc651 113 * };
loopsva 2:c843c06cc651 114 *
loopsva 2:c843c06cc651 115 * NTC ntc(A1, &ntc_my_paramtr); //initialize NTC temperature A:D
loopsva 2:c843c06cc651 116 *
loopsva 2:c843c06cc651 117 * main() {
loopsva 2:c843c06cc651 118 * printf("\r\n\r\n-------------------------------------------\r\n");
loopsva 5:9655397ba539 119 * printf("NTC Res: %5d B0/50: %4d B25/50: %4d B25/80: %4d B25/85: %4d B25/100: %4d B_OTHER: %4d SeriesR: %d\r\n",
loopsva 6:8e6bd0f9877b 120 * ntc.get_ntc_res(), ntc.get_ntc_beta(NTC::B0_50), ntc.get_ntc_beta(NTC::B25_50), ntc.get_ntc_beta(NTC::B25_80), ntc.get_ntc_beta(NTC::B25_85),
loopsva 6:8e6bd0f9877b 121 * ntc.get_ntc_beta(NTC::B25_100), ntc.get_ntc_beta(NTC::B_OTHER), ntc.get_series_res());
loopsva 2:c843c06cc651 122 * uint16_t ad = ntc.read_ad_reg();
loopsva 3:1eb4f5296281 123 * printf("NTC A:D Val: %5d Volt A:D: %.6f NTC-R_now: %7.1f Temp: %+.2f\r\n", ad,
loopsva 3:1eb4f5296281 124 * NTC_VREF / NTC_AD_RESOL * (float)ad, ntc.get_ntc_res_viaAD(ad), ntc.get_ntc_temp(NTC::B25_85, ad));
loopsva 2:c843c06cc651 125 *
loopsva 2:c843c06cc651 126 * while(1) {
loopsva 2:c843c06cc651 127 * printf("Temp: %+.2f\r\n", ntc.get_ntc_temp(NTC::B25_85));
loopsva 2:c843c06cc651 128 * wait(2.0);
loopsva 2:c843c06cc651 129 * }
loopsva 2:c843c06cc651 130 *
loopsva 2:c843c06cc651 131 * }
loopsva 0:c0bdc272d5da 132 * @endcode
loopsva 0:c0bdc272d5da 133 */
loopsva 0:c0bdc272d5da 134
loopsva 0:c0bdc272d5da 135 class NTC
loopsva 0:c0bdc272d5da 136 {
loopsva 0:c0bdc272d5da 137 public:
loopsva 0:c0bdc272d5da 138 /**
loopsva 0:c0bdc272d5da 139 * NTC Beta curves to choose from for Temperature calculations
loopsva 0:c0bdc272d5da 140 *
loopsva 0:c0bdc272d5da 141 **/
loopsva 0:c0bdc272d5da 142 enum ntcBetaCurve {
loopsva 5:9655397ba539 143 B0_50, /*!< use B0/50 curve */
loopsva 0:c0bdc272d5da 144 B25_50, /*!< use B25/50 curve */
loopsva 0:c0bdc272d5da 145 B25_80, /*!< use B25/80 curve */
loopsva 0:c0bdc272d5da 146 B25_85, /*!< use B25/85 curve */
loopsva 0:c0bdc272d5da 147 B25_100, /*!< use B25/100 curve */
loopsva 5:9655397ba539 148 B_OTHER, /*!< use other curve */
loopsva 0:c0bdc272d5da 149 };
loopsva 0:c0bdc272d5da 150
loopsva 0:c0bdc272d5da 151 /** Configure gpio pin
loopsva 0:c0bdc272d5da 152 * @param A:D I/O pin
loopsva 0:c0bdc272d5da 153 * @param parameters for NTC (NTC_TypeDef)
loopsva 0:c0bdc272d5da 154 */
loopsva 0:c0bdc272d5da 155 NTC(PinName p_ana, const NTC_TypeDef *ntc_parameter);
loopsva 0:c0bdc272d5da 156
loopsva 0:c0bdc272d5da 157 /** Configure gpio pin
loopsva 0:c0bdc272d5da 158 * @param A:D I/O pin
loopsva 0:c0bdc272d5da 159 * uses default parameters
loopsva 0:c0bdc272d5da 160 */
loopsva 0:c0bdc272d5da 161 NTC(PinName p_ana);
loopsva 0:c0bdc272d5da 162
loopsva 0:c0bdc272d5da 163 /** Read A:D register value
loopsva 0:c0bdc272d5da 164 * @param none
loopsva 0:c0bdc272d5da 165 * @return A:D value from 0-65535
loopsva 0:c0bdc272d5da 166 */
loopsva 0:c0bdc272d5da 167 uint16_t read_ad_reg();
loopsva 0:c0bdc272d5da 168
loopsva 0:c0bdc272d5da 169 /** Get the NTC resistance value
loopsva 0:c0bdc272d5da 170 * @param none
loopsva 0:c0bdc272d5da 171 * @return resistance of NTC at 25C
loopsva 0:c0bdc272d5da 172 */
loopsva 0:c0bdc272d5da 173 int get_ntc_res();
loopsva 0:c0bdc272d5da 174
loopsva 6:8e6bd0f9877b 175 /** Get the NTC beta value
loopsva 6:8e6bd0f9877b 176 * @param ntcBetaCurve selection
loopsva 6:8e6bd0f9877b 177 * @param B25_85 default value
loopsva 6:8e6bd0f9877b 178 * @return beta curve value
loopsva 0:c0bdc272d5da 179 */
loopsva 6:8e6bd0f9877b 180 int get_ntc_beta(int beta = B25_85);
loopsva 6:8e6bd0f9877b 181
loopsva 0:c0bdc272d5da 182 /** Get the resistance value for the series resistor
loopsva 0:c0bdc272d5da 183 * @param none
loopsva 0:c0bdc272d5da 184 * @return resistance of series resistor
loopsva 0:c0bdc272d5da 185 */
loopsva 0:c0bdc272d5da 186 int get_series_res();
loopsva 0:c0bdc272d5da 187
loopsva 0:c0bdc272d5da 188 /** calculate NTC resistance based on A:D reading
loopsva 0:c0bdc272d5da 189 * @param none
loopsva 0:c0bdc272d5da 190 * @param din optional read from read_ad_reg().
loopsva 3:1eb4f5296281 191 * @param din -> if missing or 0, read_ad_reg() value is used for calculation
loopsva 3:1eb4f5296281 192 * @param din -> if != 0, then value of din is used for calculation
loopsva 0:c0bdc272d5da 193 * @return resistance of NTC
loopsva 0:c0bdc272d5da 194 */
loopsva 0:c0bdc272d5da 195 float get_ntc_res_viaAD(uint16_t din = NULL);
loopsva 0:c0bdc272d5da 196
loopsva 0:c0bdc272d5da 197 /** calculate NTC temperaure
loopsva 0:c0bdc272d5da 198 * @param curve Beta curve to use. See ntcBetaCurve {};
loopsva 3:1eb4f5296281 199 * @param din optional read from read_ad_reg()
loopsva 3:1eb4f5296281 200 * @param din -> if missing or 0, read_ad_reg() value is used for calculation
loopsva 3:1eb4f5296281 201 * @param din -> if != 0, then value of din is used for calculation
loopsva 0:c0bdc272d5da 202 * @return temperature of NTC
loopsva 5:9655397ba539 203 * @return -100 if NTC Beta selected = 0
loopsva 0:c0bdc272d5da 204 */
loopsva 0:c0bdc272d5da 205 float get_ntc_temp(int curve, uint16_t din = NULL);
loopsva 0:c0bdc272d5da 206
loopsva 0:c0bdc272d5da 207 protected:
loopsva 0:c0bdc272d5da 208 AnalogIn _ana;
loopsva 0:c0bdc272d5da 209
loopsva 0:c0bdc272d5da 210 private:
loopsva 0:c0bdc272d5da 211 NTC_TypeDef ntc_set_data;
loopsva 0:c0bdc272d5da 212 uint16_t rawdata;
loopsva 0:c0bdc272d5da 213
loopsva 0:c0bdc272d5da 214 };
loopsva 0:c0bdc272d5da 215
loopsva 0:c0bdc272d5da 216 #endif // MBED_NTC