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:
Sat Apr 08 01:23:02 2017 +0000
Revision:
4:5d0dfa665cba
Parent:
3:1eb4f5296281
Child:
5:9655397ba539
fix documentation for code example

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