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
ntc.h@7:1de44d8867a3, 2017-04-27 (annotated)
- Committer:
- loopsva
- Date:
- Thu Apr 27 16:37:05 2017 +0000
- Revision:
- 7:1de44d8867a3
- Parent:
- 6:8e6bd0f9877b
Changed NULL to 0 for CLI compiler
Who changed what in which revision?
User | Revision | Line number | New 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 | 7:1de44d8867a3 | 195 | float get_ntc_res_viaAD(uint16_t din = 0); |
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 | 7:1de44d8867a3 | 205 | float get_ntc_temp(int curve, uint16_t din = 0); |
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 |