A collection of Analog Devices drivers for the mbed platform

For additional information check out the mbed page of the Analog Devices wiki: https://wiki.analog.com/resources/tools-software/mbed-drivers-all

Committer:
Adrian Suciu
Date:
Mon Nov 07 16:27:12 2016 +0200
Revision:
33:c3ec596a29c2
Added CN0391, CN0396 and CN0397 shields

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Adrian Suciu 33:c3ec596a29c2 1 #include "thermocouple.h"
Adrian Suciu 33:c3ec596a29c2 2
Adrian Suciu 33:c3ec596a29c2 3 // http://srdata.nist.gov/its90/download/allcoeff.tab
Adrian Suciu 33:c3ec596a29c2 4
Adrian Suciu 33:c3ec596a29c2 5 Thermocouple::Thermocouple() {}
Adrian Suciu 33:c3ec596a29c2 6 Thermocouple::~Thermocouple() {}
Adrian Suciu 33:c3ec596a29c2 7
Adrian Suciu 33:c3ec596a29c2 8 float Thermocouple::lookup(const int32_t *lut, float voltage, uint16_t size, int16_t offset)
Adrian Suciu 33:c3ec596a29c2 9 {
Adrian Suciu 33:c3ec596a29c2 10 uint16_t first = 0;
Adrian Suciu 33:c3ec596a29c2 11 uint16_t last = size - 1;
Adrian Suciu 33:c3ec596a29c2 12 uint16_t middle = (first + last) / 2;
Adrian Suciu 33:c3ec596a29c2 13 int32_t integer_voltage = int32_t(voltage * 1000);
Adrian Suciu 33:c3ec596a29c2 14 while (first <= last) {
Adrian Suciu 33:c3ec596a29c2 15 if (lut[middle] < integer_voltage)
Adrian Suciu 33:c3ec596a29c2 16 first = middle + 1;
Adrian Suciu 33:c3ec596a29c2 17 else if (lut[middle] == integer_voltage) {
Adrian Suciu 33:c3ec596a29c2 18 return static_cast<float>(middle + offset);
Adrian Suciu 33:c3ec596a29c2 19 } else
Adrian Suciu 33:c3ec596a29c2 20 last = middle - 1;
Adrian Suciu 33:c3ec596a29c2 21
Adrian Suciu 33:c3ec596a29c2 22 middle = (first + last) / 2;
Adrian Suciu 33:c3ec596a29c2 23 }
Adrian Suciu 33:c3ec596a29c2 24 if (first > last)
Adrian Suciu 33:c3ec596a29c2 25 return static_cast<float>(first + offset);
Adrian Suciu 33:c3ec596a29c2 26
Adrian Suciu 33:c3ec596a29c2 27 return 0; // should never get here
Adrian Suciu 33:c3ec596a29c2 28 }
Adrian Suciu 33:c3ec596a29c2 29
Adrian Suciu 33:c3ec596a29c2 30 float Thermocouple::convert(float voltage, const thermocouple_poly_subrange range[], const int n)
Adrian Suciu 33:c3ec596a29c2 31 {
Adrian Suciu 33:c3ec596a29c2 32 int range_id = 0;
Adrian Suciu 33:c3ec596a29c2 33 float temperature = 0;
Adrian Suciu 33:c3ec596a29c2 34 for(range_id = 0 ; range_id < n; range_id++) {
Adrian Suciu 33:c3ec596a29c2 35 if(voltage > range[range_id].min_voltage_range && voltage <= range[range_id].max_voltage_range)
Adrian Suciu 33:c3ec596a29c2 36 break;
Adrian Suciu 33:c3ec596a29c2 37 }
Adrian Suciu 33:c3ec596a29c2 38
Adrian Suciu 33:c3ec596a29c2 39 for (int i = 0; i < range[range_id].n; i++) {
Adrian Suciu 33:c3ec596a29c2 40 temperature += (range[range_id].coef[i] * pow(10, range[range_id].power[i])) * pow(voltage, i);
Adrian Suciu 33:c3ec596a29c2 41 }
Adrian Suciu 33:c3ec596a29c2 42 return temperature;
Adrian Suciu 33:c3ec596a29c2 43 }
Adrian Suciu 33:c3ec596a29c2 44
Adrian Suciu 33:c3ec596a29c2 45
Adrian Suciu 33:c3ec596a29c2 46
Adrian Suciu 33:c3ec596a29c2 47
Adrian Suciu 33:c3ec596a29c2 48 const int Thermocouple_Type_B::inv_poly_size = 2;
Adrian Suciu 33:c3ec596a29c2 49 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_B::inv_poly[2] = {
Adrian Suciu 33:c3ec596a29c2 50 {
Adrian Suciu 33:c3ec596a29c2 51 0.000, 630.615,// characteristic curve for temp range between 0.000, and 630.615,
Adrian Suciu 33:c3ec596a29c2 52 {0.000000000000, -0.246508183460, 0.590404211710, -0.132579316360, 0.156682919010, -0.169445292400, 0.629903470940,},
Adrian Suciu 33:c3ec596a29c2 53 { 0, -3, -5, -8, -11, -14, -18,},
Adrian Suciu 33:c3ec596a29c2 54 7
Adrian Suciu 33:c3ec596a29c2 55 },
Adrian Suciu 33:c3ec596a29c2 56 {
Adrian Suciu 33:c3ec596a29c2 57 630.615, 1820.000,// characteristic curve for temp range between 630.615, and 1820.000,
Adrian Suciu 33:c3ec596a29c2 58 { -0.389381686210, 0.285717474700, -0.848851047850, 0.157852801640, -0.168353448640, 0.111097940130, -0.445154310330, 0.989756408210, -0.937913302890,},
Adrian Suciu 33:c3ec596a29c2 59 { 1, -1, -4, -6, -9, -12, -16, -20, -24,},
Adrian Suciu 33:c3ec596a29c2 60 9
Adrian Suciu 33:c3ec596a29c2 61 }
Adrian Suciu 33:c3ec596a29c2 62 };
Adrian Suciu 33:c3ec596a29c2 63
Adrian Suciu 33:c3ec596a29c2 64 float Thermocouple_Type_B::convert_inv(float temp)
Adrian Suciu 33:c3ec596a29c2 65 {
Adrian Suciu 33:c3ec596a29c2 66 return Thermocouple::convert(temp, inv_poly, inv_poly_size);
Adrian Suciu 33:c3ec596a29c2 67 }
Adrian Suciu 33:c3ec596a29c2 68
Adrian Suciu 33:c3ec596a29c2 69 float Thermocouple_Type_B::lookup_inv(float temp)
Adrian Suciu 33:c3ec596a29c2 70 {
Adrian Suciu 33:c3ec596a29c2 71 #ifdef TYPE_B_LUT
Adrian Suciu 33:c3ec596a29c2 72 if((temp + lut_offset) > lut_size)
Adrian Suciu 33:c3ec596a29c2 73 return lut[lut_size - 1];
Adrian Suciu 33:c3ec596a29c2 74 else
Adrian Suciu 33:c3ec596a29c2 75 return lut[(uint16_t)temp + lut_offset];
Adrian Suciu 33:c3ec596a29c2 76 #else
Adrian Suciu 33:c3ec596a29c2 77 /* NOT IMPLEMENTED */
Adrian Suciu 33:c3ec596a29c2 78 return 0;
Adrian Suciu 33:c3ec596a29c2 79 #endif
Adrian Suciu 33:c3ec596a29c2 80 }
Adrian Suciu 33:c3ec596a29c2 81 const int Thermocouple_Type_B::poly_size = 2;
Adrian Suciu 33:c3ec596a29c2 82 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_B::poly[2] = {
Adrian Suciu 33:c3ec596a29c2 83 {
Adrian Suciu 33:c3ec596a29c2 84 0.291, 2.431, // characteristic curve for mV range between 0.291 and 2.431
Adrian Suciu 33:c3ec596a29c2 85 { 9.8423321, 6.9971500, -8.4765304, 1.0052644, -8.3345952, 4.5508542, -1.5523037, 2.9886750, -2.4742860,},
Adrian Suciu 33:c3ec596a29c2 86 { 1, 2, 2, 3, 2, 2, 2, 1, 0,},
Adrian Suciu 33:c3ec596a29c2 87 9
Adrian Suciu 33:c3ec596a29c2 88 },
Adrian Suciu 33:c3ec596a29c2 89 {
Adrian Suciu 33:c3ec596a29c2 90 2.431, 13.820, // characteristic curve for mV range between 2.431 and 13.820
Adrian Suciu 33:c3ec596a29c2 91 { 2.1315071, 2.8510504, -5.2742887, 9.9160804, -1.2965303, 1.1195870, -6.0625199, 1.8661696, -2.4878585,},
Adrian Suciu 33:c3ec596a29c2 92 { 2, 2, 1, 0, 0, -1, -3, -4, -6,},
Adrian Suciu 33:c3ec596a29c2 93 9
Adrian Suciu 33:c3ec596a29c2 94 }
Adrian Suciu 33:c3ec596a29c2 95 };
Adrian Suciu 33:c3ec596a29c2 96
Adrian Suciu 33:c3ec596a29c2 97 Thermocouple_Type_B::~Thermocouple_Type_B()
Adrian Suciu 33:c3ec596a29c2 98 {
Adrian Suciu 33:c3ec596a29c2 99
Adrian Suciu 33:c3ec596a29c2 100 }
Adrian Suciu 33:c3ec596a29c2 101
Adrian Suciu 33:c3ec596a29c2 102 float Thermocouple_Type_B::convert(float voltage)
Adrian Suciu 33:c3ec596a29c2 103 {
Adrian Suciu 33:c3ec596a29c2 104 return Thermocouple::convert(voltage, poly, poly_size);
Adrian Suciu 33:c3ec596a29c2 105 }
Adrian Suciu 33:c3ec596a29c2 106
Adrian Suciu 33:c3ec596a29c2 107 float Thermocouple_Type_B::lookup(float voltage)
Adrian Suciu 33:c3ec596a29c2 108 {
Adrian Suciu 33:c3ec596a29c2 109 #ifdef TYPE_B_LUT
Adrian Suciu 33:c3ec596a29c2 110 return Thermocouple::lookup(lut, voltage, lut_size, lut_offset);
Adrian Suciu 33:c3ec596a29c2 111 #else
Adrian Suciu 33:c3ec596a29c2 112 /* NOT IMPLEMENTED */
Adrian Suciu 33:c3ec596a29c2 113 return 0;
Adrian Suciu 33:c3ec596a29c2 114 #endif
Adrian Suciu 33:c3ec596a29c2 115 }
Adrian Suciu 33:c3ec596a29c2 116 const int Thermocouple_Type_E::inv_poly_size = 2;
Adrian Suciu 33:c3ec596a29c2 117 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_E::inv_poly[2] = {
Adrian Suciu 33:c3ec596a29c2 118 {
Adrian Suciu 33:c3ec596a29c2 119 -270.000, 0.000,// characteristic curve for temp range between -270.000, and 0.000,
Adrian Suciu 33:c3ec596a29c2 120 {0.000000000000, 0.586655087080, 0.454109771240, -0.779980486860, -0.258001608430, -0.594525830570, -0.932140586670, -0.102876055340, -0.803701236210, -0.439794973910, -0.164147763550, -0.396736195160, -0.558273287210, -0.346578420130,},
Adrian Suciu 33:c3ec596a29c2 121 { 0, -1, -4, -6, -7, -9, -11, -12, -15, -17, -19, -22, -25, -28,},
Adrian Suciu 33:c3ec596a29c2 122 14
Adrian Suciu 33:c3ec596a29c2 123 },
Adrian Suciu 33:c3ec596a29c2 124 {
Adrian Suciu 33:c3ec596a29c2 125 0.000, 1000.000,// characteristic curve for temp range between 0.000, and 1000.000,
Adrian Suciu 33:c3ec596a29c2 126 {0.000000000000, 0.586655087100, 0.450322755820, 0.289084072120, -0.330568966520, 0.650244032700, -0.191974955040, -0.125366004970, 0.214892175690, -0.143880417820, 0.359608994810,},
Adrian Suciu 33:c3ec596a29c2 127 { 0, -1, -4, -7, -9, -12, -15, -17, -20, -23, -27,},
Adrian Suciu 33:c3ec596a29c2 128 11
Adrian Suciu 33:c3ec596a29c2 129 }
Adrian Suciu 33:c3ec596a29c2 130 };
Adrian Suciu 33:c3ec596a29c2 131
Adrian Suciu 33:c3ec596a29c2 132 float Thermocouple_Type_E::convert_inv(float temp)
Adrian Suciu 33:c3ec596a29c2 133 {
Adrian Suciu 33:c3ec596a29c2 134 return Thermocouple::convert(temp, inv_poly, inv_poly_size);
Adrian Suciu 33:c3ec596a29c2 135 }
Adrian Suciu 33:c3ec596a29c2 136
Adrian Suciu 33:c3ec596a29c2 137 float Thermocouple_Type_E::lookup_inv(float temp)
Adrian Suciu 33:c3ec596a29c2 138 {
Adrian Suciu 33:c3ec596a29c2 139 #ifdef TYPE_E_LUT
Adrian Suciu 33:c3ec596a29c2 140 if((temp + lut_offset) > lut_size)
Adrian Suciu 33:c3ec596a29c2 141 return lut[lut_size - 1];
Adrian Suciu 33:c3ec596a29c2 142 else
Adrian Suciu 33:c3ec596a29c2 143 return lut[(uint16_t)temp + lut_offset];
Adrian Suciu 33:c3ec596a29c2 144 #else
Adrian Suciu 33:c3ec596a29c2 145 /* NOT IMPLEMENTED */
Adrian Suciu 33:c3ec596a29c2 146 return 0;
Adrian Suciu 33:c3ec596a29c2 147 #endif
Adrian Suciu 33:c3ec596a29c2 148 }
Adrian Suciu 33:c3ec596a29c2 149 const int Thermocouple_Type_E::poly_size = 2;
Adrian Suciu 33:c3ec596a29c2 150 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_E::poly[2] = {
Adrian Suciu 33:c3ec596a29c2 151 {
Adrian Suciu 33:c3ec596a29c2 152 -8.825, 0.000, // characteristic curve for mV range between -8.825 and 0.000
Adrian Suciu 33:c3ec596a29c2 153 { 0.0000000, 1.6977288, -4.3514970, -1.5859697, -9.2502871, -2.6084314, -4.1360199, -3.4034030, -1.1564890, 0.0000000,},
Adrian Suciu 33:c3ec596a29c2 154 { 0, 1, -1, -1, -2, -2, -3, -4, -5, 0,},
Adrian Suciu 33:c3ec596a29c2 155 10
Adrian Suciu 33:c3ec596a29c2 156 },
Adrian Suciu 33:c3ec596a29c2 157 {
Adrian Suciu 33:c3ec596a29c2 158 0.000, 76.373, // characteristic curve for mV range between 0.000 and 76.373
Adrian Suciu 33:c3ec596a29c2 159 { 0.0000000, 1.7057035, -2.3301759, 6.5435585, -7.3562749, -1.7896001, 8.4036165, -1.3735879, 1.0629823, -3.2447087,},
Adrian Suciu 33:c3ec596a29c2 160 { 0, 1, -1, -3, -5, -6, -8, -9, -11, -14,},
Adrian Suciu 33:c3ec596a29c2 161 10
Adrian Suciu 33:c3ec596a29c2 162 }
Adrian Suciu 33:c3ec596a29c2 163 };
Adrian Suciu 33:c3ec596a29c2 164
Adrian Suciu 33:c3ec596a29c2 165 Thermocouple_Type_E::~Thermocouple_Type_E()
Adrian Suciu 33:c3ec596a29c2 166 {
Adrian Suciu 33:c3ec596a29c2 167
Adrian Suciu 33:c3ec596a29c2 168 }
Adrian Suciu 33:c3ec596a29c2 169
Adrian Suciu 33:c3ec596a29c2 170 float Thermocouple_Type_E::convert(float voltage)
Adrian Suciu 33:c3ec596a29c2 171 {
Adrian Suciu 33:c3ec596a29c2 172 return Thermocouple::convert(voltage, poly, poly_size);
Adrian Suciu 33:c3ec596a29c2 173 }
Adrian Suciu 33:c3ec596a29c2 174
Adrian Suciu 33:c3ec596a29c2 175 float Thermocouple_Type_E::lookup(float voltage)
Adrian Suciu 33:c3ec596a29c2 176 {
Adrian Suciu 33:c3ec596a29c2 177 #ifdef TYPE_E_LUT
Adrian Suciu 33:c3ec596a29c2 178 return Thermocouple::lookup(lut, voltage, lut_size, lut_offset);
Adrian Suciu 33:c3ec596a29c2 179 #else
Adrian Suciu 33:c3ec596a29c2 180 /* NOT IMPLEMENTED */
Adrian Suciu 33:c3ec596a29c2 181 return 0;
Adrian Suciu 33:c3ec596a29c2 182 #endif
Adrian Suciu 33:c3ec596a29c2 183 }
Adrian Suciu 33:c3ec596a29c2 184 const int Thermocouple_Type_J::inv_poly_size = 2;
Adrian Suciu 33:c3ec596a29c2 185 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_J::inv_poly[2] = {
Adrian Suciu 33:c3ec596a29c2 186 {
Adrian Suciu 33:c3ec596a29c2 187 -210.000, 760.000,// characteristic curve for temp range between -210.000, and 760.000,
Adrian Suciu 33:c3ec596a29c2 188 {0.000000000000, 0.503811878150, 0.304758369300, -0.856810657200, 0.132281952950, -0.170529583370, 0.209480906970, -0.125383953360, 0.156317256970,},
Adrian Suciu 33:c3ec596a29c2 189 { 0, -1, -4, -7, -9, -12, -15, -18, -22,},
Adrian Suciu 33:c3ec596a29c2 190 9
Adrian Suciu 33:c3ec596a29c2 191 },
Adrian Suciu 33:c3ec596a29c2 192 {
Adrian Suciu 33:c3ec596a29c2 193 760.000, 1200.000,// characteristic curve for temp range between 760.000, and 1200.000,
Adrian Suciu 33:c3ec596a29c2 194 {0.296456256810, -0.149761277860, 0.317871039240, -0.318476867010, 0.157208190040, -0.306913690560,},
Adrian Suciu 33:c3ec596a29c2 195 { 3, 1, -2, -5, -8, -12,},
Adrian Suciu 33:c3ec596a29c2 196 6
Adrian Suciu 33:c3ec596a29c2 197 }
Adrian Suciu 33:c3ec596a29c2 198 };
Adrian Suciu 33:c3ec596a29c2 199
Adrian Suciu 33:c3ec596a29c2 200 float Thermocouple_Type_J::convert_inv(float temp)
Adrian Suciu 33:c3ec596a29c2 201 {
Adrian Suciu 33:c3ec596a29c2 202 return Thermocouple::convert(temp, inv_poly, inv_poly_size);
Adrian Suciu 33:c3ec596a29c2 203 }
Adrian Suciu 33:c3ec596a29c2 204
Adrian Suciu 33:c3ec596a29c2 205 float Thermocouple_Type_J::lookup_inv(float temp)
Adrian Suciu 33:c3ec596a29c2 206 {
Adrian Suciu 33:c3ec596a29c2 207 #ifdef TYPE_J_LUT
Adrian Suciu 33:c3ec596a29c2 208 if((temp + lut_offset) > lut_size)
Adrian Suciu 33:c3ec596a29c2 209 return lut[lut_size - 1];
Adrian Suciu 33:c3ec596a29c2 210 else
Adrian Suciu 33:c3ec596a29c2 211 return lut[(uint16_t)temp + lut_offset];
Adrian Suciu 33:c3ec596a29c2 212 #else
Adrian Suciu 33:c3ec596a29c2 213 /* NOT IMPLEMENTED */
Adrian Suciu 33:c3ec596a29c2 214 return 0;
Adrian Suciu 33:c3ec596a29c2 215 #endif
Adrian Suciu 33:c3ec596a29c2 216 }
Adrian Suciu 33:c3ec596a29c2 217 const int Thermocouple_Type_J::poly_size = 3;
Adrian Suciu 33:c3ec596a29c2 218 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_J::poly[3] = {
Adrian Suciu 33:c3ec596a29c2 219 {
Adrian Suciu 33:c3ec596a29c2 220 -8.095, 0.000, // characteristic curve for mV range between -8.095 and 0.000
Adrian Suciu 33:c3ec596a29c2 221 { 0.0000000, 1.9528268, -1.2286185, -1.0752178, -5.9086933, -1.7256713, -2.8131513, -2.3963370, -8.3823321,},
Adrian Suciu 33:c3ec596a29c2 222 { 0, 1, 0, 0, -1, -1, -2, -3, -5,},
Adrian Suciu 33:c3ec596a29c2 223 9
Adrian Suciu 33:c3ec596a29c2 224 },
Adrian Suciu 33:c3ec596a29c2 225 {
Adrian Suciu 33:c3ec596a29c2 226 0.000, 42.919, // characteristic curve for mV range between 0.000 and 42.919
Adrian Suciu 33:c3ec596a29c2 227 { 0.000000, 1.978425, -2.001204, 1.036969, -2.549687, 3.585153, -5.344285, 5.099890, 0.000000,},
Adrian Suciu 33:c3ec596a29c2 228 { 0, 1, -1, -2, -4, -6, -8, -10, 0,},
Adrian Suciu 33:c3ec596a29c2 229 9
Adrian Suciu 33:c3ec596a29c2 230 },
Adrian Suciu 33:c3ec596a29c2 231 {
Adrian Suciu 33:c3ec596a29c2 232 42.919, 69.553, // characteristic curve for mV range between 42.919 and 69.553
Adrian Suciu 33:c3ec596a29c2 233 { -3.11358187, 3.00543684, -9.94773230, 1.70276630, -1.43033468, 4.73886084, 0.00000000, 0.00000000, 0.00000000,},
Adrian Suciu 33:c3ec596a29c2 234 { 3, 2, 0, -1, -3, -6, 0, 0, 0,},
Adrian Suciu 33:c3ec596a29c2 235 9
Adrian Suciu 33:c3ec596a29c2 236 }
Adrian Suciu 33:c3ec596a29c2 237 };
Adrian Suciu 33:c3ec596a29c2 238
Adrian Suciu 33:c3ec596a29c2 239 Thermocouple_Type_J::~Thermocouple_Type_J()
Adrian Suciu 33:c3ec596a29c2 240 {
Adrian Suciu 33:c3ec596a29c2 241
Adrian Suciu 33:c3ec596a29c2 242 }
Adrian Suciu 33:c3ec596a29c2 243
Adrian Suciu 33:c3ec596a29c2 244 float Thermocouple_Type_J::convert(float voltage)
Adrian Suciu 33:c3ec596a29c2 245 {
Adrian Suciu 33:c3ec596a29c2 246 return Thermocouple::convert(voltage, poly, poly_size);
Adrian Suciu 33:c3ec596a29c2 247 }
Adrian Suciu 33:c3ec596a29c2 248
Adrian Suciu 33:c3ec596a29c2 249 float Thermocouple_Type_J::lookup(float voltage)
Adrian Suciu 33:c3ec596a29c2 250 {
Adrian Suciu 33:c3ec596a29c2 251 #ifdef TYPE_J_LUT
Adrian Suciu 33:c3ec596a29c2 252 return Thermocouple::lookup(lut, voltage, lut_size, lut_offset);
Adrian Suciu 33:c3ec596a29c2 253 #else
Adrian Suciu 33:c3ec596a29c2 254 /* NOT IMPLEMENTED */
Adrian Suciu 33:c3ec596a29c2 255 return 0;
Adrian Suciu 33:c3ec596a29c2 256 #endif
Adrian Suciu 33:c3ec596a29c2 257 }
Adrian Suciu 33:c3ec596a29c2 258 const int Thermocouple_Type_K::inv_poly_size = 2;
Adrian Suciu 33:c3ec596a29c2 259 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_K::inv_poly[2] = {
Adrian Suciu 33:c3ec596a29c2 260 {
Adrian Suciu 33:c3ec596a29c2 261 -270.000, 0.000,// characteristic curve for temp range between -270.000, and 0.000,
Adrian Suciu 33:c3ec596a29c2 262 {0.000000000000, 0.394501280250, 0.236223735980, -0.328589067840, -0.499048287770, -0.675090591730, -0.574103274280, -0.310888728940, -0.104516093650, -0.198892668780, -0.163226974860,},
Adrian Suciu 33:c3ec596a29c2 263 { 0, -1, -4, -6, -8, -10, -12, -14, -16, -19, -22,},
Adrian Suciu 33:c3ec596a29c2 264 11
Adrian Suciu 33:c3ec596a29c2 265 },
Adrian Suciu 33:c3ec596a29c2 266 {
Adrian Suciu 33:c3ec596a29c2 267 0.000, 1372.000,// characteristic curve for temp range between 0.000, and 1372.000,
Adrian Suciu 33:c3ec596a29c2 268 { -0.176004136860, 0.389212049750, 0.185587700320, -0.994575928740, 0.318409457190, -0.560728448890, 0.560750590590, -0.320207200030, 0.971511471520, -0.121047212750,},
Adrian Suciu 33:c3ec596a29c2 269 { -1, -1, -4, -7, -9, -12, -15, -18, -22, -25,},
Adrian Suciu 33:c3ec596a29c2 270 10
Adrian Suciu 33:c3ec596a29c2 271 }
Adrian Suciu 33:c3ec596a29c2 272 };
Adrian Suciu 33:c3ec596a29c2 273
Adrian Suciu 33:c3ec596a29c2 274 float Thermocouple_Type_K::convert_inv(float temp)
Adrian Suciu 33:c3ec596a29c2 275 {
Adrian Suciu 33:c3ec596a29c2 276 return Thermocouple::convert(temp, inv_poly, inv_poly_size);
Adrian Suciu 33:c3ec596a29c2 277 }
Adrian Suciu 33:c3ec596a29c2 278
Adrian Suciu 33:c3ec596a29c2 279 float Thermocouple_Type_K::lookup_inv(float temp)
Adrian Suciu 33:c3ec596a29c2 280 {
Adrian Suciu 33:c3ec596a29c2 281 #ifdef TYPE_K_LUT
Adrian Suciu 33:c3ec596a29c2 282 if((temp + lut_offset) > lut_size)
Adrian Suciu 33:c3ec596a29c2 283 return lut[lut_size - 1];
Adrian Suciu 33:c3ec596a29c2 284 else
Adrian Suciu 33:c3ec596a29c2 285 return lut[(uint16_t)temp + lut_offset];
Adrian Suciu 33:c3ec596a29c2 286 #else
Adrian Suciu 33:c3ec596a29c2 287 /* NOT IMPLEMENTED */
Adrian Suciu 33:c3ec596a29c2 288 return 0;
Adrian Suciu 33:c3ec596a29c2 289 #endif
Adrian Suciu 33:c3ec596a29c2 290 }
Adrian Suciu 33:c3ec596a29c2 291 const int Thermocouple_Type_K::poly_size = 3;
Adrian Suciu 33:c3ec596a29c2 292 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_K::poly[3] = {
Adrian Suciu 33:c3ec596a29c2 293 {
Adrian Suciu 33:c3ec596a29c2 294 -5.891, 0.000, // characteristic curve for mV range between -5.891 and 0.000
Adrian Suciu 33:c3ec596a29c2 295 { 0.0000000, 2.5173462, -1.1662878, -1.0833638, -8.9773540, -3.7342377, -8.6632643, -1.0450598, -5.1920577, 0.0000000,},
Adrian Suciu 33:c3ec596a29c2 296 { 0, 1, 0, 0, -1, -1, -2, -2, -4, 0,},
Adrian Suciu 33:c3ec596a29c2 297 10
Adrian Suciu 33:c3ec596a29c2 298 },
Adrian Suciu 33:c3ec596a29c2 299 {
Adrian Suciu 33:c3ec596a29c2 300 0.000, 20.644, // characteristic curve for mV range between 0.000 and 20.644
Adrian Suciu 33:c3ec596a29c2 301 { 0.000000, 2.508355, 7.860106, -2.503131, 8.315270, -1.228034, 9.804036, -4.413030, 1.057734, -1.052755,},
Adrian Suciu 33:c3ec596a29c2 302 { 0, 1, -2, -1, -2, -2, -4, -5, -6, -8,},
Adrian Suciu 33:c3ec596a29c2 303 10
Adrian Suciu 33:c3ec596a29c2 304 },
Adrian Suciu 33:c3ec596a29c2 305 {
Adrian Suciu 33:c3ec596a29c2 306 20.644, 54.886, // characteristic curve for mV range between 20.644 and 54.886
Adrian Suciu 33:c3ec596a29c2 307 { -1.318058, 4.830222, -1.646031, 5.464731, -9.650715, 8.802193, -3.110810, 0.000000, 0.000000, 0.000000,},
Adrian Suciu 33:c3ec596a29c2 308 { 2, 1, 0, -2, -4, -6, -8, 0, 0, 0,},
Adrian Suciu 33:c3ec596a29c2 309 10
Adrian Suciu 33:c3ec596a29c2 310 }
Adrian Suciu 33:c3ec596a29c2 311 };
Adrian Suciu 33:c3ec596a29c2 312
Adrian Suciu 33:c3ec596a29c2 313 Thermocouple_Type_K::~Thermocouple_Type_K()
Adrian Suciu 33:c3ec596a29c2 314 {
Adrian Suciu 33:c3ec596a29c2 315
Adrian Suciu 33:c3ec596a29c2 316 }
Adrian Suciu 33:c3ec596a29c2 317
Adrian Suciu 33:c3ec596a29c2 318 float Thermocouple_Type_K::convert(float voltage)
Adrian Suciu 33:c3ec596a29c2 319 {
Adrian Suciu 33:c3ec596a29c2 320 return Thermocouple::convert(voltage, poly, poly_size);
Adrian Suciu 33:c3ec596a29c2 321 }
Adrian Suciu 33:c3ec596a29c2 322
Adrian Suciu 33:c3ec596a29c2 323 float Thermocouple_Type_K::lookup(float voltage)
Adrian Suciu 33:c3ec596a29c2 324 {
Adrian Suciu 33:c3ec596a29c2 325 #ifdef TYPE_K_LUT
Adrian Suciu 33:c3ec596a29c2 326 return Thermocouple::lookup(lut, voltage, lut_size, lut_offset);
Adrian Suciu 33:c3ec596a29c2 327 #else
Adrian Suciu 33:c3ec596a29c2 328 /* NOT IMPLEMENTED */
Adrian Suciu 33:c3ec596a29c2 329 return 0;
Adrian Suciu 33:c3ec596a29c2 330 #endif
Adrian Suciu 33:c3ec596a29c2 331 }
Adrian Suciu 33:c3ec596a29c2 332 const int Thermocouple_Type_N::inv_poly_size = 2;
Adrian Suciu 33:c3ec596a29c2 333 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_N::inv_poly[2] = {
Adrian Suciu 33:c3ec596a29c2 334 {
Adrian Suciu 33:c3ec596a29c2 335 -270.000, 0.000,// characteristic curve for temp range between -270.000, and 0.000,
Adrian Suciu 33:c3ec596a29c2 336 {0.000000000000, 0.261591059620, 0.109574842280, -0.938411115540, -0.464120397590, -0.263033577160, -0.226534380030, -0.760893007910, -0.934196678350,},
Adrian Suciu 33:c3ec596a29c2 337 { 0, -1, -4, -7, -10, -11, -13, -16, -19,},
Adrian Suciu 33:c3ec596a29c2 338 9
Adrian Suciu 33:c3ec596a29c2 339 },
Adrian Suciu 33:c3ec596a29c2 340 {
Adrian Suciu 33:c3ec596a29c2 341 0.000, 1300.000,// characteristic curve for temp range between 0.000, and 1300.000,
Adrian Suciu 33:c3ec596a29c2 342 {0.000000000000, 0.259293946010, 0.157101418800, 0.438256272370, -0.252611697940, 0.643118193390, -0.100634715190, 0.997453389920, -0.608632456070, 0.208492293390, -0.306821961510,},
Adrian Suciu 33:c3ec596a29c2 343 { 0, -1, -4, -7, -9, -12, -14, -18, -21, -24, -28,},
Adrian Suciu 33:c3ec596a29c2 344 11
Adrian Suciu 33:c3ec596a29c2 345 }
Adrian Suciu 33:c3ec596a29c2 346 };
Adrian Suciu 33:c3ec596a29c2 347
Adrian Suciu 33:c3ec596a29c2 348 float Thermocouple_Type_N::convert_inv(float temp)
Adrian Suciu 33:c3ec596a29c2 349 {
Adrian Suciu 33:c3ec596a29c2 350 return Thermocouple::convert(temp, inv_poly, inv_poly_size);
Adrian Suciu 33:c3ec596a29c2 351 }
Adrian Suciu 33:c3ec596a29c2 352
Adrian Suciu 33:c3ec596a29c2 353 float Thermocouple_Type_N::lookup_inv(float temp)
Adrian Suciu 33:c3ec596a29c2 354 {
Adrian Suciu 33:c3ec596a29c2 355 #ifdef TYPE_N_LUT
Adrian Suciu 33:c3ec596a29c2 356 if((temp + lut_offset) > lut_size)
Adrian Suciu 33:c3ec596a29c2 357 return lut[lut_size - 1];
Adrian Suciu 33:c3ec596a29c2 358 else
Adrian Suciu 33:c3ec596a29c2 359 return lut[(uint16_t)temp + lut_offset];
Adrian Suciu 33:c3ec596a29c2 360 #else
Adrian Suciu 33:c3ec596a29c2 361 /* NOT IMPLEMENTED */
Adrian Suciu 33:c3ec596a29c2 362 return 0;
Adrian Suciu 33:c3ec596a29c2 363 #endif
Adrian Suciu 33:c3ec596a29c2 364 }
Adrian Suciu 33:c3ec596a29c2 365 const int Thermocouple_Type_N::poly_size = 3;
Adrian Suciu 33:c3ec596a29c2 366 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_N::poly[3] = {
Adrian Suciu 33:c3ec596a29c2 367 {
Adrian Suciu 33:c3ec596a29c2 368 -3.990, 0.000, // characteristic curve for mV range between -3.990 and 0.000
Adrian Suciu 33:c3ec596a29c2 369 { 0.0000000, 3.8436847, 1.1010485, 5.2229312, 7.2060525, 5.8488586, 2.7754916, 7.7075166, 1.1582665, 7.3138868,},
Adrian Suciu 33:c3ec596a29c2 370 { 0, 1, 0, 0, 0, 0, 0, -1, -1, -3,},
Adrian Suciu 33:c3ec596a29c2 371 10
Adrian Suciu 33:c3ec596a29c2 372 },
Adrian Suciu 33:c3ec596a29c2 373 {
Adrian Suciu 33:c3ec596a29c2 374 0.000, 20.613, // characteristic curve for mV range between 0.000 and 20.613
Adrian Suciu 33:c3ec596a29c2 375 { 0.00000, 3.86896, -1.08267, 4.70205, -2.12169, -1.17272, 5.39280, -7.98156, 0.00000, 0.00000,},
Adrian Suciu 33:c3ec596a29c2 376 { 0, 1, 0, -2, -6, -4, -6, -8, 0, 0,},
Adrian Suciu 33:c3ec596a29c2 377 10
Adrian Suciu 33:c3ec596a29c2 378 },
Adrian Suciu 33:c3ec596a29c2 379 {
Adrian Suciu 33:c3ec596a29c2 380 20.613, 47.513, // characteristic curve for mV range between 20.613 and 47.513
Adrian Suciu 33:c3ec596a29c2 381 { 1.972485, 3.300943, -3.915159, 9.855391, -1.274371, 7.767022, 0.000000, 0.000000, 0.000000, 0.000000,},
Adrian Suciu 33:c3ec596a29c2 382 { 1, 1, -1, -3, -4, -7, 0, 0, 0, 0,},
Adrian Suciu 33:c3ec596a29c2 383 10
Adrian Suciu 33:c3ec596a29c2 384 }
Adrian Suciu 33:c3ec596a29c2 385 };
Adrian Suciu 33:c3ec596a29c2 386
Adrian Suciu 33:c3ec596a29c2 387 Thermocouple_Type_N::~Thermocouple_Type_N()
Adrian Suciu 33:c3ec596a29c2 388 {
Adrian Suciu 33:c3ec596a29c2 389
Adrian Suciu 33:c3ec596a29c2 390 }
Adrian Suciu 33:c3ec596a29c2 391
Adrian Suciu 33:c3ec596a29c2 392 float Thermocouple_Type_N::convert(float voltage)
Adrian Suciu 33:c3ec596a29c2 393 {
Adrian Suciu 33:c3ec596a29c2 394 return Thermocouple::convert(voltage, poly, poly_size);
Adrian Suciu 33:c3ec596a29c2 395 }
Adrian Suciu 33:c3ec596a29c2 396
Adrian Suciu 33:c3ec596a29c2 397 float Thermocouple_Type_N::lookup(float voltage)
Adrian Suciu 33:c3ec596a29c2 398 {
Adrian Suciu 33:c3ec596a29c2 399 #ifdef TYPE_N_LUT
Adrian Suciu 33:c3ec596a29c2 400 return Thermocouple::lookup(lut, voltage, lut_size, lut_offset);
Adrian Suciu 33:c3ec596a29c2 401 #else
Adrian Suciu 33:c3ec596a29c2 402 /* NOT IMPLEMENTED */
Adrian Suciu 33:c3ec596a29c2 403 return 0;
Adrian Suciu 33:c3ec596a29c2 404 #endif
Adrian Suciu 33:c3ec596a29c2 405 }
Adrian Suciu 33:c3ec596a29c2 406 const int Thermocouple_Type_R::inv_poly_size = 3;
Adrian Suciu 33:c3ec596a29c2 407 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_R::inv_poly[3] = {
Adrian Suciu 33:c3ec596a29c2 408 {
Adrian Suciu 33:c3ec596a29c2 409 -50.000, 1064.180,// characteristic curve for temp range between -50.000, and 1064.180,
Adrian Suciu 33:c3ec596a29c2 410 {0.000000000000, 0.528961729765, 0.139166589782, -0.238855693017, 0.356916001063, -0.462347666298, 0.500777441034, -0.373105886191, 0.157716482367, -0.281038625251,},
Adrian Suciu 33:c3ec596a29c2 411 { 0, -2, -4, -7, -10, -13, -16, -19, -22, -26,},
Adrian Suciu 33:c3ec596a29c2 412 10
Adrian Suciu 33:c3ec596a29c2 413 },
Adrian Suciu 33:c3ec596a29c2 414 {
Adrian Suciu 33:c3ec596a29c2 415 1064.180, 1664.500,// characteristic curve for temp range between 1064.180, and 1664.500,
Adrian Suciu 33:c3ec596a29c2 416 {0.295157925316, -0.252061251332, 0.159564501865, -0.764085947576, 0.205305291024, -0.293359668173,},
Adrian Suciu 33:c3ec596a29c2 417 { 1, -2, -4, -8, -11, -15,},
Adrian Suciu 33:c3ec596a29c2 418 6
Adrian Suciu 33:c3ec596a29c2 419 },
Adrian Suciu 33:c3ec596a29c2 420 {
Adrian Suciu 33:c3ec596a29c2 421 1664.500, 1768.100,// characteristic curve for temp range between 1664.500, and 1768.100,
Adrian Suciu 33:c3ec596a29c2 422 {0.152232118209, -0.268819888545, 0.171280280471, -0.345895706453, -0.934633971046,},
Adrian Suciu 33:c3ec596a29c2 423 { 3, 0, -3, -7, -14,},
Adrian Suciu 33:c3ec596a29c2 424 5
Adrian Suciu 33:c3ec596a29c2 425 }
Adrian Suciu 33:c3ec596a29c2 426 };
Adrian Suciu 33:c3ec596a29c2 427
Adrian Suciu 33:c3ec596a29c2 428 float Thermocouple_Type_R::convert_inv(float temp)
Adrian Suciu 33:c3ec596a29c2 429 {
Adrian Suciu 33:c3ec596a29c2 430 return Thermocouple::convert(temp, inv_poly, inv_poly_size);
Adrian Suciu 33:c3ec596a29c2 431 }
Adrian Suciu 33:c3ec596a29c2 432
Adrian Suciu 33:c3ec596a29c2 433 float Thermocouple_Type_R::lookup_inv(float temp)
Adrian Suciu 33:c3ec596a29c2 434 {
Adrian Suciu 33:c3ec596a29c2 435 #ifdef TYPE_R_LUT
Adrian Suciu 33:c3ec596a29c2 436 if((temp + lut_offset) > lut_size)
Adrian Suciu 33:c3ec596a29c2 437 return lut[lut_size - 1];
Adrian Suciu 33:c3ec596a29c2 438 else
Adrian Suciu 33:c3ec596a29c2 439 return lut[(uint16_t)temp + lut_offset];
Adrian Suciu 33:c3ec596a29c2 440 #else
Adrian Suciu 33:c3ec596a29c2 441 /* NOT IMPLEMENTED */
Adrian Suciu 33:c3ec596a29c2 442 return 0;
Adrian Suciu 33:c3ec596a29c2 443 #endif
Adrian Suciu 33:c3ec596a29c2 444 }
Adrian Suciu 33:c3ec596a29c2 445 const int Thermocouple_Type_R::poly_size = 4;
Adrian Suciu 33:c3ec596a29c2 446 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_R::poly[4] = {
Adrian Suciu 33:c3ec596a29c2 447 {
Adrian Suciu 33:c3ec596a29c2 448 -0.226, 1.923, // characteristic curve for mV range between -0.226 and 1.923
Adrian Suciu 33:c3ec596a29c2 449 { 0.0000000, 1.8891380, -9.3835290, 1.3068619, -2.2703580, 3.5145659, -3.8953900, 2.8239471, -1.2607281, 3.1353611, -3.3187769,},
Adrian Suciu 33:c3ec596a29c2 450 { 0, 2, 1, 2, 2, 2, 2, 2, 2, 1, 0,},
Adrian Suciu 33:c3ec596a29c2 451 11
Adrian Suciu 33:c3ec596a29c2 452 },
Adrian Suciu 33:c3ec596a29c2 453 {
Adrian Suciu 33:c3ec596a29c2 454 1.923, 13.228, // characteristic curve for mV range between 1.923 and 13.228
Adrian Suciu 33:c3ec596a29c2 455 {1.334584505, 1.472644573, -1.844024844, 4.031129726, -6.249428360, 6.468412046, -4.458750426, 1.994710149, -5.313401790, 6.481976217, 0.000000000,},
Adrian Suciu 33:c3ec596a29c2 456 { 1, 2, 1, 0, -1, -2, -3, -4, -6, -8, 0,},
Adrian Suciu 33:c3ec596a29c2 457 11
Adrian Suciu 33:c3ec596a29c2 458 },
Adrian Suciu 33:c3ec596a29c2 459 {
Adrian Suciu 33:c3ec596a29c2 460 11.361, 19.739, // characteristic curve for mV range between 11.361 and 19.739
Adrian Suciu 33:c3ec596a29c2 461 { -8.199599416, 1.553962042, -8.342197663, 4.279433549, -1.191577910, 1.492290091, 0.000000000, 0.000000000, 0.000000000, 0.000000000, 0.000000000,},
Adrian Suciu 33:c3ec596a29c2 462 { 1, 2, 0, -1, -2, -4, 0, 0, 0, 0, 0,},
Adrian Suciu 33:c3ec596a29c2 463 11
Adrian Suciu 33:c3ec596a29c2 464 },
Adrian Suciu 33:c3ec596a29c2 465 {
Adrian Suciu 33:c3ec596a29c2 466 19.739, 21.103, // characteristic curve for mV range between 19.739 and 21.103
Adrian Suciu 33:c3ec596a29c2 467 {3.406177836, -7.023729171, 5.582903813, -1.952394635, 2.560740231, 0.000000000, 0.000000000, 0.000000000, 0.000000000, 0.000000000, 0.000000000,},
Adrian Suciu 33:c3ec596a29c2 468 { 4, 3, 2, 1, -1, 0, 0, 0, 0, 0, 0,},
Adrian Suciu 33:c3ec596a29c2 469 11
Adrian Suciu 33:c3ec596a29c2 470 }
Adrian Suciu 33:c3ec596a29c2 471 };
Adrian Suciu 33:c3ec596a29c2 472
Adrian Suciu 33:c3ec596a29c2 473 Thermocouple_Type_R::~Thermocouple_Type_R()
Adrian Suciu 33:c3ec596a29c2 474 {
Adrian Suciu 33:c3ec596a29c2 475
Adrian Suciu 33:c3ec596a29c2 476 }
Adrian Suciu 33:c3ec596a29c2 477
Adrian Suciu 33:c3ec596a29c2 478 float Thermocouple_Type_R::convert(float voltage)
Adrian Suciu 33:c3ec596a29c2 479 {
Adrian Suciu 33:c3ec596a29c2 480 return Thermocouple::convert(voltage, poly, poly_size);
Adrian Suciu 33:c3ec596a29c2 481 }
Adrian Suciu 33:c3ec596a29c2 482
Adrian Suciu 33:c3ec596a29c2 483 float Thermocouple_Type_R::lookup(float voltage)
Adrian Suciu 33:c3ec596a29c2 484 {
Adrian Suciu 33:c3ec596a29c2 485 #ifdef TYPE_R_LUT
Adrian Suciu 33:c3ec596a29c2 486 return Thermocouple::lookup(lut, voltage, lut_size, lut_offset);
Adrian Suciu 33:c3ec596a29c2 487 #else
Adrian Suciu 33:c3ec596a29c2 488 /* NOT IMPLEMENTED */
Adrian Suciu 33:c3ec596a29c2 489 return 0;
Adrian Suciu 33:c3ec596a29c2 490 #endif
Adrian Suciu 33:c3ec596a29c2 491 }
Adrian Suciu 33:c3ec596a29c2 492 const int Thermocouple_Type_S::inv_poly_size = 3;
Adrian Suciu 33:c3ec596a29c2 493 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_S::inv_poly[3] = {
Adrian Suciu 33:c3ec596a29c2 494 {
Adrian Suciu 33:c3ec596a29c2 495 -50.000, 1064.180,// characteristic curve for temp range between -50.000, and 1064.180,
Adrian Suciu 33:c3ec596a29c2 496 {0.000000000000, 0.540313308631, 0.125934289740, -0.232477968689, 0.322028823036, -0.331465196389, 0.255744251786, -0.125068871393, 0.271443176145,},
Adrian Suciu 33:c3ec596a29c2 497 { 0, -2, -4, -7, -10, -13, -16, -19, -23,},
Adrian Suciu 33:c3ec596a29c2 498 9
Adrian Suciu 33:c3ec596a29c2 499 },
Adrian Suciu 33:c3ec596a29c2 500 {
Adrian Suciu 33:c3ec596a29c2 501 1064.180, 1664.500,// characteristic curve for temp range between 1064.180, and 1664.500,
Adrian Suciu 33:c3ec596a29c2 502 {0.132900444085, 0.334509311344, 0.654805192818, -0.164856259209, 0.129989605174,},
Adrian Suciu 33:c3ec596a29c2 503 { 1, -2, -5, -8, -13,},
Adrian Suciu 33:c3ec596a29c2 504 5
Adrian Suciu 33:c3ec596a29c2 505 },
Adrian Suciu 33:c3ec596a29c2 506 {
Adrian Suciu 33:c3ec596a29c2 507 1664.500, 1768.100,// characteristic curve for temp range between 1664.500, and 1768.100,
Adrian Suciu 33:c3ec596a29c2 508 {0.146628232636, -0.258430516752, 0.163693574641, -0.330439046987, -0.943223690612,},
Adrian Suciu 33:c3ec596a29c2 509 { 3, 0, -3, -7, -14,},
Adrian Suciu 33:c3ec596a29c2 510 5
Adrian Suciu 33:c3ec596a29c2 511 }
Adrian Suciu 33:c3ec596a29c2 512 };
Adrian Suciu 33:c3ec596a29c2 513
Adrian Suciu 33:c3ec596a29c2 514 float Thermocouple_Type_S::convert_inv(float temp)
Adrian Suciu 33:c3ec596a29c2 515 {
Adrian Suciu 33:c3ec596a29c2 516 return Thermocouple::convert(temp, inv_poly, inv_poly_size);
Adrian Suciu 33:c3ec596a29c2 517 }
Adrian Suciu 33:c3ec596a29c2 518
Adrian Suciu 33:c3ec596a29c2 519 float Thermocouple_Type_S::lookup_inv(float temp)
Adrian Suciu 33:c3ec596a29c2 520 {
Adrian Suciu 33:c3ec596a29c2 521 #ifdef TYPE_S_LUT
Adrian Suciu 33:c3ec596a29c2 522 if((temp + lut_offset) > lut_size)
Adrian Suciu 33:c3ec596a29c2 523 return lut[lut_size - 1];
Adrian Suciu 33:c3ec596a29c2 524 else
Adrian Suciu 33:c3ec596a29c2 525 return lut[(uint16_t)temp + lut_offset];
Adrian Suciu 33:c3ec596a29c2 526 #else
Adrian Suciu 33:c3ec596a29c2 527 /* NOT IMPLEMENTED */
Adrian Suciu 33:c3ec596a29c2 528 return 0;
Adrian Suciu 33:c3ec596a29c2 529 #endif
Adrian Suciu 33:c3ec596a29c2 530 }
Adrian Suciu 33:c3ec596a29c2 531 const int Thermocouple_Type_S::poly_size = 4;
Adrian Suciu 33:c3ec596a29c2 532 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_S::poly[4] = {
Adrian Suciu 33:c3ec596a29c2 533 {
Adrian Suciu 33:c3ec596a29c2 534 -0.235, 1.874, // characteristic curve for mV range between -0.235 and 1.874
Adrian Suciu 33:c3ec596a29c2 535 { 0.00000000, 1.84949460, -8.00504062, 1.02237430, -1.52248592, 1.88821343, -1.59085941, 8.23027880, -2.34181944, 2.79786260,},
Adrian Suciu 33:c3ec596a29c2 536 { 0, 2, 1, 2, 2, 2, 2, 1, 1, 0,},
Adrian Suciu 33:c3ec596a29c2 537 10
Adrian Suciu 33:c3ec596a29c2 538 },
Adrian Suciu 33:c3ec596a29c2 539 {
Adrian Suciu 33:c3ec596a29c2 540 1.874, 11.950, // characteristic curve for mV range between 1.874 and 11.950
Adrian Suciu 33:c3ec596a29c2 541 {1.291507177, 1.466298863, -1.534713402, 3.145945973, -4.163257839, 3.187963771, -1.291637500, 2.183475087, -1.447379511, 8.211272125,},
Adrian Suciu 33:c3ec596a29c2 542 { 1, 2, 1, 0, -1, -2, -3, -5, -7, -9,},
Adrian Suciu 33:c3ec596a29c2 543 10
Adrian Suciu 33:c3ec596a29c2 544 },
Adrian Suciu 33:c3ec596a29c2 545 {
Adrian Suciu 33:c3ec596a29c2 546 10.332, 17.536, // characteristic curve for mV range between 10.332 and 17.536
Adrian Suciu 33:c3ec596a29c2 547 { -8.087801117, 1.621573104, -8.536869453, 4.719686976, -1.441693666, 2.081618890, 0.000000000, 0.000000000, 0.000000000, 0.000000000,},
Adrian Suciu 33:c3ec596a29c2 548 { 1, 2, 0, -1, -2, -4, 0, 0, 0, 0,},
Adrian Suciu 33:c3ec596a29c2 549 10
Adrian Suciu 33:c3ec596a29c2 550 },
Adrian Suciu 33:c3ec596a29c2 551 {
Adrian Suciu 33:c3ec596a29c2 552 17.536, 18.693, // characteristic curve for mV range between 17.536 and 18.693
Adrian Suciu 33:c3ec596a29c2 553 {5.333875126, -1.235892298, 1.092657613, -4.265693686, 6.247205420, 0.000000000, 0.000000000, 0.000000000, 0.000000000, 0.000000000,},
Adrian Suciu 33:c3ec596a29c2 554 { 4, 4, 3, 1, -1, 0, 0, 0, 0, 0,},
Adrian Suciu 33:c3ec596a29c2 555 10
Adrian Suciu 33:c3ec596a29c2 556 }
Adrian Suciu 33:c3ec596a29c2 557 };
Adrian Suciu 33:c3ec596a29c2 558
Adrian Suciu 33:c3ec596a29c2 559 Thermocouple_Type_S::~Thermocouple_Type_S()
Adrian Suciu 33:c3ec596a29c2 560 {
Adrian Suciu 33:c3ec596a29c2 561
Adrian Suciu 33:c3ec596a29c2 562 }
Adrian Suciu 33:c3ec596a29c2 563
Adrian Suciu 33:c3ec596a29c2 564 float Thermocouple_Type_S::convert(float voltage)
Adrian Suciu 33:c3ec596a29c2 565 {
Adrian Suciu 33:c3ec596a29c2 566 return Thermocouple::convert(voltage, poly, poly_size);
Adrian Suciu 33:c3ec596a29c2 567 }
Adrian Suciu 33:c3ec596a29c2 568
Adrian Suciu 33:c3ec596a29c2 569 float Thermocouple_Type_S::lookup(float voltage)
Adrian Suciu 33:c3ec596a29c2 570 {
Adrian Suciu 33:c3ec596a29c2 571 #ifdef TYPE_S_LUT
Adrian Suciu 33:c3ec596a29c2 572 return Thermocouple::lookup(lut, voltage, lut_size, lut_offset);
Adrian Suciu 33:c3ec596a29c2 573 #else
Adrian Suciu 33:c3ec596a29c2 574 /* NOT IMPLEMENTED */
Adrian Suciu 33:c3ec596a29c2 575 return 0;
Adrian Suciu 33:c3ec596a29c2 576 #endif
Adrian Suciu 33:c3ec596a29c2 577 }
Adrian Suciu 33:c3ec596a29c2 578 const int Thermocouple_Type_T::inv_poly_size = 2;
Adrian Suciu 33:c3ec596a29c2 579 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_T::inv_poly[2] = {
Adrian Suciu 33:c3ec596a29c2 580 {
Adrian Suciu 33:c3ec596a29c2 581 -270.000, 0.000,// characteristic curve for temp range between -270.000, and 0.000,
Adrian Suciu 33:c3ec596a29c2 582 {0.000000000000, 0.387481063640, 0.441944343470, 0.118443231050, 0.200329735540, 0.901380195590, 0.226511565930, 0.360711542050, 0.384939398830, 0.282135219250, 0.142515947790, 0.487686622860, 0.107955392700, 0.139450270620, 0.797951539270,},
Adrian Suciu 33:c3ec596a29c2 583 { 0, -1, -4, -6, -7, -9, -10, -12, -14, -16, -18, -21, -23, -26, -30,},
Adrian Suciu 33:c3ec596a29c2 584 15
Adrian Suciu 33:c3ec596a29c2 585 },
Adrian Suciu 33:c3ec596a29c2 586 {
Adrian Suciu 33:c3ec596a29c2 587 0.000, 400.000,// characteristic curve for temp range between 0.000, and 400.000,
Adrian Suciu 33:c3ec596a29c2 588 {0.000000000000, 0.387481063640, 0.332922278800, 0.206182434040, -0.218822568460, 0.109968809280, -0.308157587720, 0.454791352900, -0.275129016730,},
Adrian Suciu 33:c3ec596a29c2 589 { 0, -1, -4, -6, -8, -10, -13, -16, -19,},
Adrian Suciu 33:c3ec596a29c2 590 9
Adrian Suciu 33:c3ec596a29c2 591 }
Adrian Suciu 33:c3ec596a29c2 592 };
Adrian Suciu 33:c3ec596a29c2 593
Adrian Suciu 33:c3ec596a29c2 594 float Thermocouple_Type_T::convert_inv(float temp)
Adrian Suciu 33:c3ec596a29c2 595 {
Adrian Suciu 33:c3ec596a29c2 596 return Thermocouple::convert(temp, inv_poly, inv_poly_size);
Adrian Suciu 33:c3ec596a29c2 597 }
Adrian Suciu 33:c3ec596a29c2 598
Adrian Suciu 33:c3ec596a29c2 599 float Thermocouple_Type_T::lookup_inv(float temp)
Adrian Suciu 33:c3ec596a29c2 600 {
Adrian Suciu 33:c3ec596a29c2 601 #ifdef TYPE_T_LUT
Adrian Suciu 33:c3ec596a29c2 602 if((temp + lut_offset) > lut_size)
Adrian Suciu 33:c3ec596a29c2 603 return lut[lut_size - 1];
Adrian Suciu 33:c3ec596a29c2 604 else
Adrian Suciu 33:c3ec596a29c2 605 return lut[(uint16_t)temp + lut_offset];
Adrian Suciu 33:c3ec596a29c2 606 #else
Adrian Suciu 33:c3ec596a29c2 607 /* NOT IMPLEMENTED */
Adrian Suciu 33:c3ec596a29c2 608 return 0;
Adrian Suciu 33:c3ec596a29c2 609 #endif
Adrian Suciu 33:c3ec596a29c2 610 }
Adrian Suciu 33:c3ec596a29c2 611 const int Thermocouple_Type_T::poly_size = 2;
Adrian Suciu 33:c3ec596a29c2 612 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_T::poly[2] = {
Adrian Suciu 33:c3ec596a29c2 613 {
Adrian Suciu 33:c3ec596a29c2 614 -5.603, 0.000, // characteristic curve for mV range between -5.603 and 0.000
Adrian Suciu 33:c3ec596a29c2 615 { 0.0000000, 2.5949192, -2.1316967, 7.9018692, 4.2527777, 1.3304473, 2.0241446, 1.2668171,},
Adrian Suciu 33:c3ec596a29c2 616 { 0, 1, -1, -1, -1, -1, -2, -3,},
Adrian Suciu 33:c3ec596a29c2 617 8
Adrian Suciu 33:c3ec596a29c2 618 },
Adrian Suciu 33:c3ec596a29c2 619 {
Adrian Suciu 33:c3ec596a29c2 620 0.000, 20.872, // characteristic curve for mV range between 0.000 and 20.872
Adrian Suciu 33:c3ec596a29c2 621 { 0.000000, 2.592800, -7.602961, 4.637791, -2.165394, 6.048144, -7.293422, 0.000000,},
Adrian Suciu 33:c3ec596a29c2 622 { 0, 1, -1, -2, -3, -5, -7, 0,},
Adrian Suciu 33:c3ec596a29c2 623 8
Adrian Suciu 33:c3ec596a29c2 624 }
Adrian Suciu 33:c3ec596a29c2 625 };
Adrian Suciu 33:c3ec596a29c2 626
Adrian Suciu 33:c3ec596a29c2 627 Thermocouple_Type_T::~Thermocouple_Type_T()
Adrian Suciu 33:c3ec596a29c2 628 {
Adrian Suciu 33:c3ec596a29c2 629
Adrian Suciu 33:c3ec596a29c2 630 }
Adrian Suciu 33:c3ec596a29c2 631
Adrian Suciu 33:c3ec596a29c2 632 float Thermocouple_Type_T::convert(float voltage)
Adrian Suciu 33:c3ec596a29c2 633 {
Adrian Suciu 33:c3ec596a29c2 634 return Thermocouple::convert(voltage, poly, poly_size);
Adrian Suciu 33:c3ec596a29c2 635 }
Adrian Suciu 33:c3ec596a29c2 636
Adrian Suciu 33:c3ec596a29c2 637 float Thermocouple_Type_T::lookup(float voltage)
Adrian Suciu 33:c3ec596a29c2 638 {
Adrian Suciu 33:c3ec596a29c2 639 #ifdef TYPE_T_LUT
Adrian Suciu 33:c3ec596a29c2 640 return Thermocouple::lookup(lut, voltage, lut_size, lut_offset);
Adrian Suciu 33:c3ec596a29c2 641 #else
Adrian Suciu 33:c3ec596a29c2 642 /* NOT IMPLEMENTED */
Adrian Suciu 33:c3ec596a29c2 643 return 0;
Adrian Suciu 33:c3ec596a29c2 644 #endif
Adrian Suciu 33:c3ec596a29c2 645 }