A collection of Analog Devices drivers for the mbed platform

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Thermocouple.cpp Source File

Thermocouple.cpp

00001 #include "thermocouple.h"
00002 
00003 // http://srdata.nist.gov/its90/download/allcoeff.tab
00004 
00005 Thermocouple::Thermocouple() {}
00006 Thermocouple::~Thermocouple() {}
00007 
00008 float Thermocouple::lookup(const int32_t *lut, float voltage, uint16_t size, int16_t offset)
00009 {
00010     uint16_t first = 0;
00011     uint16_t last = size - 1;
00012     uint16_t middle = (first + last) / 2;
00013     int32_t integer_voltage = int32_t(voltage * 1000);
00014     while (first <= last) {
00015         if (lut[middle] < integer_voltage)
00016             first = middle + 1;
00017         else if (lut[middle] == integer_voltage) {
00018             return static_cast<float>(middle + offset);
00019         } else
00020             last = middle - 1;
00021 
00022         middle = (first + last) / 2;
00023     }
00024     if (first > last)
00025         return static_cast<float>(first + offset);
00026 
00027     return 0; // should never get here
00028 }
00029 
00030 float Thermocouple::convert(float voltage, const thermocouple_poly_subrange range[], const int n)
00031 {
00032     int range_id = 0;
00033     float temperature = 0;
00034     for(range_id = 0 ; range_id < n; range_id++) {
00035         if(voltage > range[range_id].min_voltage_range && voltage <= range[range_id].max_voltage_range)
00036             break;
00037     }
00038 
00039     for (int i = 0; i < range[range_id].n; i++) {
00040         temperature += (range[range_id].coef[i] * pow(10, range[range_id].power[i])) * pow(voltage, i);
00041     }
00042     return temperature;
00043 }
00044 
00045 
00046 
00047 
00048 const int Thermocouple_Type_B::inv_poly_size = 2;
00049 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_B::inv_poly[2] = {
00050     {
00051         0.000,   630.615,// characteristic curve for temp range between 0.000, and 630.615,
00052         {0.000000000000, -0.246508183460, 0.590404211710, -0.132579316360, 0.156682919010, -0.169445292400, 0.629903470940,},
00053         {          0,         -3,         -5,         -8,        -11,        -14,        -18,},
00054         7
00055     },
00056     {
00057         630.615,  1820.000,// characteristic curve for temp range between 630.615, and 1820.000,
00058         { -0.389381686210, 0.285717474700, -0.848851047850, 0.157852801640, -0.168353448640, 0.111097940130, -0.445154310330, 0.989756408210, -0.937913302890,},
00059         {          1,         -1,         -4,         -6,         -9,        -12,        -16,        -20,        -24,},
00060         9
00061     }
00062 };
00063 
00064 float Thermocouple_Type_B::convert_inv(float temp)
00065 {
00066     return Thermocouple::convert(temp, inv_poly, inv_poly_size);
00067 }
00068 
00069 float Thermocouple_Type_B::lookup_inv(float temp)
00070 {
00071 #ifdef TYPE_B_LUT
00072     if((temp + lut_offset) > lut_size)
00073         return lut[lut_size - 1];
00074     else
00075         return lut[(uint16_t)temp + lut_offset];
00076 #else
00077     /* NOT IMPLEMENTED */
00078     return 0;
00079 #endif
00080 }
00081 const int Thermocouple_Type_B::poly_size = 2;
00082 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_B::poly[2] = {
00083     {
00084         0.291,       2.431, // characteristic curve for mV range between 0.291 and 2.431
00085         {  9.8423321,  6.9971500, -8.4765304,  1.0052644, -8.3345952,  4.5508542, -1.5523037,  2.9886750, -2.4742860,},
00086         {          1,          2,          2,          3,          2,          2,          2,          1,          0,},
00087         9
00088     },
00089     {
00090         2.431,      13.820, // characteristic curve for mV range between 2.431 and 13.820
00091         {  2.1315071,  2.8510504, -5.2742887,  9.9160804, -1.2965303,  1.1195870, -6.0625199,  1.8661696, -2.4878585,},
00092         {          2,          2,          1,          0,          0,         -1,         -3,         -4,         -6,},
00093         9
00094     }
00095 };
00096 
00097 Thermocouple_Type_B::~Thermocouple_Type_B()
00098 {
00099 
00100 }
00101 
00102 float Thermocouple_Type_B::convert(float voltage)
00103 {
00104     return Thermocouple::convert(voltage, poly, poly_size);
00105 }
00106 
00107 float Thermocouple_Type_B::lookup(float voltage)
00108 {
00109 #ifdef TYPE_B_LUT
00110     return Thermocouple::lookup(lut, voltage, lut_size, lut_offset);
00111 #else
00112     /* NOT IMPLEMENTED */
00113     return 0;
00114 #endif
00115 }
00116 const int Thermocouple_Type_E::inv_poly_size = 2;
00117 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_E::inv_poly[2] = {
00118     {
00119         -270.000,     0.000,// characteristic curve for temp range between -270.000, and 0.000,
00120         {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,},
00121         {          0,         -1,         -4,         -6,         -7,         -9,        -11,        -12,        -15,        -17,        -19,        -22,        -25,        -28,},
00122         14
00123     },
00124     {
00125         0.000,  1000.000,// characteristic curve for temp range between 0.000, and 1000.000,
00126         {0.000000000000, 0.586655087100, 0.450322755820, 0.289084072120, -0.330568966520, 0.650244032700, -0.191974955040, -0.125366004970, 0.214892175690, -0.143880417820, 0.359608994810,},
00127         {          0,         -1,         -4,         -7,         -9,        -12,        -15,        -17,        -20,        -23,        -27,},
00128         11
00129     }
00130 };
00131 
00132 float Thermocouple_Type_E::convert_inv(float temp)
00133 {
00134     return Thermocouple::convert(temp, inv_poly, inv_poly_size);
00135 }
00136 
00137 float Thermocouple_Type_E::lookup_inv(float temp)
00138 {
00139 #ifdef TYPE_E_LUT
00140     if((temp + lut_offset) > lut_size)
00141         return lut[lut_size - 1];
00142     else
00143         return lut[(uint16_t)temp + lut_offset];
00144 #else
00145     /* NOT IMPLEMENTED */
00146     return 0;
00147 #endif
00148 }
00149 const int Thermocouple_Type_E::poly_size = 2;
00150 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_E::poly[2] = {
00151     {
00152         -8.825,       0.000, // characteristic curve for mV range between -8.825 and 0.000
00153         {  0.0000000,  1.6977288, -4.3514970, -1.5859697, -9.2502871, -2.6084314, -4.1360199, -3.4034030, -1.1564890,  0.0000000,},
00154         {          0,          1,         -1,         -1,         -2,         -2,         -3,         -4,         -5,          0,},
00155         10
00156     },
00157     {
00158         0.000,      76.373, // characteristic curve for mV range between 0.000 and 76.373
00159         {  0.0000000,  1.7057035, -2.3301759,  6.5435585, -7.3562749, -1.7896001,  8.4036165, -1.3735879,  1.0629823, -3.2447087,},
00160         {          0,          1,         -1,         -3,         -5,         -6,         -8,         -9,        -11,        -14,},
00161         10
00162     }
00163 };
00164 
00165 Thermocouple_Type_E::~Thermocouple_Type_E()
00166 {
00167 
00168 }
00169 
00170 float Thermocouple_Type_E::convert(float voltage)
00171 {
00172     return Thermocouple::convert(voltage, poly, poly_size);
00173 }
00174 
00175 float Thermocouple_Type_E::lookup(float voltage)
00176 {
00177 #ifdef TYPE_E_LUT
00178     return Thermocouple::lookup(lut, voltage, lut_size, lut_offset);
00179 #else
00180     /* NOT IMPLEMENTED */
00181     return 0;
00182 #endif
00183 }
00184 const int Thermocouple_Type_J::inv_poly_size = 2;
00185 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_J::inv_poly[2] = {
00186     {
00187         -210.000,   760.000,// characteristic curve for temp range between -210.000, and 760.000,
00188         {0.000000000000, 0.503811878150, 0.304758369300, -0.856810657200, 0.132281952950, -0.170529583370, 0.209480906970, -0.125383953360, 0.156317256970,},
00189         {          0,         -1,         -4,         -7,         -9,        -12,        -15,        -18,        -22,},
00190         9
00191     },
00192     {
00193         760.000,  1200.000,// characteristic curve for temp range between 760.000, and 1200.000,
00194         {0.296456256810, -0.149761277860, 0.317871039240, -0.318476867010, 0.157208190040, -0.306913690560,},
00195         {          3,          1,         -2,         -5,         -8,        -12,},
00196         6
00197     }
00198 };
00199 
00200 float Thermocouple_Type_J::convert_inv(float temp)
00201 {
00202     return Thermocouple::convert(temp, inv_poly, inv_poly_size);
00203 }
00204 
00205 float Thermocouple_Type_J::lookup_inv(float temp)
00206 {
00207 #ifdef TYPE_J_LUT
00208     if((temp + lut_offset) > lut_size)
00209         return lut[lut_size - 1];
00210     else
00211         return lut[(uint16_t)temp + lut_offset];
00212 #else
00213     /* NOT IMPLEMENTED */
00214     return 0;
00215 #endif
00216 }
00217 const int Thermocouple_Type_J::poly_size = 3;
00218 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_J::poly[3] = {
00219     {
00220         -8.095,       0.000, // characteristic curve for mV range between -8.095 and 0.000
00221         {  0.0000000,  1.9528268, -1.2286185, -1.0752178, -5.9086933, -1.7256713, -2.8131513, -2.3963370, -8.3823321,},
00222         {          0,          1,          0,          0,         -1,         -1,         -2,         -3,         -5,},
00223         9
00224     },
00225     {
00226         0.000,      42.919, // characteristic curve for mV range between 0.000 and 42.919
00227         {   0.000000,   1.978425,  -2.001204,   1.036969,  -2.549687,   3.585153,  -5.344285,   5.099890,   0.000000,},
00228         {          0,          1,         -1,         -2,         -4,         -6,         -8,        -10,          0,},
00229         9
00230     },
00231     {
00232         42.919,      69.553, // characteristic curve for mV range between 42.919 and 69.553
00233         { -3.11358187, 3.00543684, -9.94773230, 1.70276630, -1.43033468, 4.73886084, 0.00000000, 0.00000000, 0.00000000,},
00234         {          3,          2,          0,         -1,         -3,         -6,          0,          0,          0,},
00235         9
00236     }
00237 };
00238 
00239 Thermocouple_Type_J::~Thermocouple_Type_J()
00240 {
00241 
00242 }
00243 
00244 float Thermocouple_Type_J::convert(float voltage)
00245 {
00246     return Thermocouple::convert(voltage, poly, poly_size);
00247 }
00248 
00249 float Thermocouple_Type_J::lookup(float voltage)
00250 {
00251 #ifdef TYPE_J_LUT
00252     return Thermocouple::lookup(lut, voltage, lut_size, lut_offset);
00253 #else
00254     /* NOT IMPLEMENTED */
00255     return 0;
00256 #endif
00257 }
00258 const int Thermocouple_Type_K::inv_poly_size = 2;
00259 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_K::inv_poly[2] = {
00260     {
00261         -270.000,     0.000,// characteristic curve for temp range between -270.000, and 0.000,
00262         {0.000000000000, 0.394501280250, 0.236223735980, -0.328589067840, -0.499048287770, -0.675090591730, -0.574103274280, -0.310888728940, -0.104516093650, -0.198892668780, -0.163226974860,},
00263         {          0,         -1,         -4,         -6,         -8,        -10,        -12,        -14,        -16,        -19,        -22,},
00264         11
00265     },
00266     {
00267         0.000,  1372.000,// characteristic curve for temp range between 0.000, and 1372.000,
00268         { -0.176004136860, 0.389212049750, 0.185587700320, -0.994575928740, 0.318409457190, -0.560728448890, 0.560750590590, -0.320207200030, 0.971511471520, -0.121047212750,},
00269         {         -1,         -1,         -4,         -7,         -9,        -12,        -15,        -18,        -22,        -25,},
00270         10
00271     }
00272 };
00273 
00274 float Thermocouple_Type_K::convert_inv(float temp)
00275 {
00276     return Thermocouple::convert(temp, inv_poly, inv_poly_size);
00277 }
00278 
00279 float Thermocouple_Type_K::lookup_inv(float temp)
00280 {
00281 #ifdef TYPE_K_LUT
00282     if((temp + lut_offset) > lut_size)
00283         return lut[lut_size - 1];
00284     else
00285         return lut[(uint16_t)temp + lut_offset];
00286 #else
00287     /* NOT IMPLEMENTED */
00288     return 0;
00289 #endif
00290 }
00291 const int Thermocouple_Type_K::poly_size = 3;
00292 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_K::poly[3] = {
00293     {
00294         -5.891,       0.000, // characteristic curve for mV range between -5.891 and 0.000
00295         {  0.0000000,  2.5173462, -1.1662878, -1.0833638, -8.9773540, -3.7342377, -8.6632643, -1.0450598, -5.1920577,  0.0000000,},
00296         {          0,          1,          0,          0,         -1,         -1,         -2,         -2,         -4,          0,},
00297         10
00298     },
00299     {
00300         0.000,      20.644, // characteristic curve for mV range between 0.000 and 20.644
00301         {   0.000000,   2.508355,   7.860106,  -2.503131,   8.315270,  -1.228034,   9.804036,  -4.413030,   1.057734,  -1.052755,},
00302         {          0,          1,         -2,         -1,         -2,         -2,         -4,         -5,         -6,         -8,},
00303         10
00304     },
00305     {
00306         20.644,      54.886, // characteristic curve for mV range between 20.644 and 54.886
00307         {  -1.318058,   4.830222,  -1.646031,   5.464731,  -9.650715,   8.802193,  -3.110810,   0.000000,   0.000000,   0.000000,},
00308         {          2,          1,          0,         -2,         -4,         -6,         -8,          0,          0,          0,},
00309         10
00310     }
00311 };
00312 
00313 Thermocouple_Type_K::~Thermocouple_Type_K()
00314 {
00315 
00316 }
00317 
00318 float Thermocouple_Type_K::convert(float voltage)
00319 {
00320     return Thermocouple::convert(voltage, poly, poly_size);
00321 }
00322 
00323 float Thermocouple_Type_K::lookup(float voltage)
00324 {
00325 #ifdef TYPE_K_LUT
00326     return Thermocouple::lookup(lut, voltage, lut_size, lut_offset);
00327 #else
00328     /* NOT IMPLEMENTED */
00329     return 0;
00330 #endif
00331 }
00332 const int Thermocouple_Type_N::inv_poly_size = 2;
00333 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_N::inv_poly[2] = {
00334     {
00335         -270.000,     0.000,// characteristic curve for temp range between -270.000, and 0.000,
00336         {0.000000000000, 0.261591059620, 0.109574842280, -0.938411115540, -0.464120397590, -0.263033577160, -0.226534380030, -0.760893007910, -0.934196678350,},
00337         {          0,         -1,         -4,         -7,        -10,        -11,        -13,        -16,        -19,},
00338         9
00339     },
00340     {
00341         0.000,  1300.000,// characteristic curve for temp range between 0.000, and 1300.000,
00342         {0.000000000000, 0.259293946010, 0.157101418800, 0.438256272370, -0.252611697940, 0.643118193390, -0.100634715190, 0.997453389920, -0.608632456070, 0.208492293390, -0.306821961510,},
00343         {          0,         -1,         -4,         -7,         -9,        -12,        -14,        -18,        -21,        -24,        -28,},
00344         11
00345     }
00346 };
00347 
00348 float Thermocouple_Type_N::convert_inv(float temp)
00349 {
00350     return Thermocouple::convert(temp, inv_poly, inv_poly_size);
00351 }
00352 
00353 float Thermocouple_Type_N::lookup_inv(float temp)
00354 {
00355 #ifdef TYPE_N_LUT
00356     if((temp + lut_offset) > lut_size)
00357         return lut[lut_size - 1];
00358     else
00359         return lut[(uint16_t)temp + lut_offset];
00360 #else
00361     /* NOT IMPLEMENTED */
00362     return 0;
00363 #endif
00364 }
00365 const int Thermocouple_Type_N::poly_size = 3;
00366 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_N::poly[3] = {
00367     {
00368         -3.990,       0.000, // characteristic curve for mV range between -3.990 and 0.000
00369         {  0.0000000,  3.8436847,  1.1010485,  5.2229312,  7.2060525,  5.8488586,  2.7754916,  7.7075166,  1.1582665,  7.3138868,},
00370         {          0,          1,          0,          0,          0,          0,          0,         -1,         -1,         -3,},
00371         10
00372     },
00373     {
00374         0.000,      20.613, // characteristic curve for mV range between 0.000 and 20.613
00375         {    0.00000,    3.86896,   -1.08267,    4.70205,   -2.12169,   -1.17272,    5.39280,   -7.98156,    0.00000,    0.00000,},
00376         {          0,          1,          0,         -2,         -6,         -4,         -6,         -8,          0,          0,},
00377         10
00378     },
00379     {
00380         20.613,      47.513, // characteristic curve for mV range between 20.613 and 47.513
00381         {   1.972485,   3.300943,  -3.915159,   9.855391,  -1.274371,   7.767022,   0.000000,   0.000000,   0.000000,   0.000000,},
00382         {          1,          1,         -1,         -3,         -4,         -7,          0,          0,          0,          0,},
00383         10
00384     }
00385 };
00386 
00387 Thermocouple_Type_N::~Thermocouple_Type_N()
00388 {
00389 
00390 }
00391 
00392 float Thermocouple_Type_N::convert(float voltage)
00393 {
00394     return Thermocouple::convert(voltage, poly, poly_size);
00395 }
00396 
00397 float Thermocouple_Type_N::lookup(float voltage)
00398 {
00399 #ifdef TYPE_N_LUT
00400     return Thermocouple::lookup(lut, voltage, lut_size, lut_offset);
00401 #else
00402     /* NOT IMPLEMENTED */
00403     return 0;
00404 #endif
00405 }
00406 const int Thermocouple_Type_R::inv_poly_size = 3;
00407 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_R::inv_poly[3] = {
00408     {
00409         -50.000,  1064.180,// characteristic curve for temp range between -50.000, and 1064.180,
00410         {0.000000000000, 0.528961729765, 0.139166589782, -0.238855693017, 0.356916001063, -0.462347666298, 0.500777441034, -0.373105886191, 0.157716482367, -0.281038625251,},
00411         {          0,         -2,         -4,         -7,        -10,        -13,        -16,        -19,        -22,        -26,},
00412         10
00413     },
00414     {
00415         1064.180,  1664.500,// characteristic curve for temp range between 1064.180, and 1664.500,
00416         {0.295157925316, -0.252061251332, 0.159564501865, -0.764085947576, 0.205305291024, -0.293359668173,},
00417         {          1,         -2,         -4,         -8,        -11,        -15,},
00418         6
00419     },
00420     {
00421         1664.500,  1768.100,// characteristic curve for temp range between 1664.500, and 1768.100,
00422         {0.152232118209, -0.268819888545, 0.171280280471, -0.345895706453, -0.934633971046,},
00423         {          3,          0,         -3,         -7,        -14,},
00424         5
00425     }
00426 };
00427 
00428 float Thermocouple_Type_R::convert_inv(float temp)
00429 {
00430     return Thermocouple::convert(temp, inv_poly, inv_poly_size);
00431 }
00432 
00433 float Thermocouple_Type_R::lookup_inv(float temp)
00434 {
00435 #ifdef TYPE_R_LUT
00436     if((temp + lut_offset) > lut_size)
00437         return lut[lut_size - 1];
00438     else
00439         return lut[(uint16_t)temp + lut_offset];
00440 #else
00441     /* NOT IMPLEMENTED */
00442     return 0;
00443 #endif
00444 }
00445 const int Thermocouple_Type_R::poly_size = 4;
00446 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_R::poly[4] = {
00447     {
00448         -0.226,       1.923, // characteristic curve for mV range between -0.226 and 1.923
00449         {  0.0000000,  1.8891380, -9.3835290,  1.3068619, -2.2703580,  3.5145659, -3.8953900,  2.8239471, -1.2607281,  3.1353611, -3.3187769,},
00450         {          0,          2,          1,          2,          2,          2,          2,          2,          2,          1,          0,},
00451         11
00452     },
00453     {
00454         1.923,      13.228, // characteristic curve for mV range between 1.923 and 13.228
00455         {1.334584505, 1.472644573, -1.844024844, 4.031129726, -6.249428360, 6.468412046, -4.458750426, 1.994710149, -5.313401790, 6.481976217, 0.000000000,},
00456         {          1,          2,          1,          0,         -1,         -2,         -3,         -4,         -6,         -8,          0,},
00457         11
00458     },
00459     {
00460         11.361,      19.739, // characteristic curve for mV range between 11.361 and 19.739
00461         { -8.199599416, 1.553962042, -8.342197663, 4.279433549, -1.191577910, 1.492290091, 0.000000000, 0.000000000, 0.000000000, 0.000000000, 0.000000000,},
00462         {          1,          2,          0,         -1,         -2,         -4,          0,          0,          0,          0,          0,},
00463         11
00464     },
00465     {
00466         19.739,      21.103, // characteristic curve for mV range between 19.739 and 21.103
00467         {3.406177836, -7.023729171, 5.582903813, -1.952394635, 2.560740231, 0.000000000, 0.000000000, 0.000000000, 0.000000000, 0.000000000, 0.000000000,},
00468         {          4,          3,          2,          1,         -1,          0,          0,          0,          0,          0,          0,},
00469         11
00470     }
00471 };
00472 
00473 Thermocouple_Type_R::~Thermocouple_Type_R()
00474 {
00475 
00476 }
00477 
00478 float Thermocouple_Type_R::convert(float voltage)
00479 {
00480     return Thermocouple::convert(voltage, poly, poly_size);
00481 }
00482 
00483 float Thermocouple_Type_R::lookup(float voltage)
00484 {
00485 #ifdef TYPE_R_LUT
00486     return Thermocouple::lookup(lut, voltage, lut_size, lut_offset);
00487 #else
00488     /* NOT IMPLEMENTED */
00489     return 0;
00490 #endif
00491 }
00492 const int Thermocouple_Type_S::inv_poly_size = 3;
00493 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_S::inv_poly[3] = {
00494     {
00495         -50.000,  1064.180,// characteristic curve for temp range between -50.000, and 1064.180,
00496         {0.000000000000, 0.540313308631, 0.125934289740, -0.232477968689, 0.322028823036, -0.331465196389, 0.255744251786, -0.125068871393, 0.271443176145,},
00497         {          0,         -2,         -4,         -7,        -10,        -13,        -16,        -19,        -23,},
00498         9
00499     },
00500     {
00501         1064.180,  1664.500,// characteristic curve for temp range between 1064.180, and 1664.500,
00502         {0.132900444085, 0.334509311344, 0.654805192818, -0.164856259209, 0.129989605174,},
00503         {          1,         -2,         -5,         -8,        -13,},
00504         5
00505     },
00506     {
00507         1664.500,  1768.100,// characteristic curve for temp range between 1664.500, and 1768.100,
00508         {0.146628232636, -0.258430516752, 0.163693574641, -0.330439046987, -0.943223690612,},
00509         {          3,          0,         -3,         -7,        -14,},
00510         5
00511     }
00512 };
00513 
00514 float Thermocouple_Type_S::convert_inv(float temp)
00515 {
00516     return Thermocouple::convert(temp, inv_poly, inv_poly_size);
00517 }
00518 
00519 float Thermocouple_Type_S::lookup_inv(float temp)
00520 {
00521 #ifdef TYPE_S_LUT
00522     if((temp + lut_offset) > lut_size)
00523         return lut[lut_size - 1];
00524     else
00525         return lut[(uint16_t)temp + lut_offset];
00526 #else
00527     /* NOT IMPLEMENTED */
00528     return 0;
00529 #endif
00530 }
00531 const int Thermocouple_Type_S::poly_size = 4;
00532 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_S::poly[4] = {
00533     {
00534         -0.235,       1.874, // characteristic curve for mV range between -0.235 and 1.874
00535         { 0.00000000, 1.84949460, -8.00504062, 1.02237430, -1.52248592, 1.88821343, -1.59085941, 8.23027880, -2.34181944, 2.79786260,},
00536         {          0,          2,          1,          2,          2,          2,          2,          1,          1,          0,},
00537         10
00538     },
00539     {
00540         1.874,      11.950, // characteristic curve for mV range between 1.874 and 11.950
00541         {1.291507177, 1.466298863, -1.534713402, 3.145945973, -4.163257839, 3.187963771, -1.291637500, 2.183475087, -1.447379511, 8.211272125,},
00542         {          1,          2,          1,          0,         -1,         -2,         -3,         -5,         -7,         -9,},
00543         10
00544     },
00545     {
00546         10.332,      17.536, // characteristic curve for mV range between 10.332 and 17.536
00547         { -8.087801117, 1.621573104, -8.536869453, 4.719686976, -1.441693666, 2.081618890, 0.000000000, 0.000000000, 0.000000000, 0.000000000,},
00548         {          1,          2,          0,         -1,         -2,         -4,          0,          0,          0,          0,},
00549         10
00550     },
00551     {
00552         17.536,      18.693, // characteristic curve for mV range between 17.536 and 18.693
00553         {5.333875126, -1.235892298, 1.092657613, -4.265693686, 6.247205420, 0.000000000, 0.000000000, 0.000000000, 0.000000000, 0.000000000,},
00554         {          4,          4,          3,          1,         -1,          0,          0,          0,          0,          0,},
00555         10
00556     }
00557 };
00558 
00559 Thermocouple_Type_S::~Thermocouple_Type_S()
00560 {
00561 
00562 }
00563 
00564 float Thermocouple_Type_S::convert(float voltage)
00565 {
00566     return Thermocouple::convert(voltage, poly, poly_size);
00567 }
00568 
00569 float Thermocouple_Type_S::lookup(float voltage)
00570 {
00571 #ifdef TYPE_S_LUT
00572     return Thermocouple::lookup(lut, voltage, lut_size, lut_offset);
00573 #else
00574     /* NOT IMPLEMENTED */
00575     return 0;
00576 #endif
00577 }
00578 const int Thermocouple_Type_T::inv_poly_size = 2;
00579 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_T::inv_poly[2] = {
00580     {
00581         -270.000,     0.000,// characteristic curve for temp range between -270.000, and 0.000,
00582         {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,},
00583         {          0,         -1,         -4,         -6,         -7,         -9,        -10,        -12,        -14,        -16,        -18,        -21,        -23,        -26,        -30,},
00584         15
00585     },
00586     {
00587         0.000,   400.000,// characteristic curve for temp range between 0.000, and 400.000,
00588         {0.000000000000, 0.387481063640, 0.332922278800, 0.206182434040, -0.218822568460, 0.109968809280, -0.308157587720, 0.454791352900, -0.275129016730,},
00589         {          0,         -1,         -4,         -6,         -8,        -10,        -13,        -16,        -19,},
00590         9
00591     }
00592 };
00593 
00594 float Thermocouple_Type_T::convert_inv(float temp)
00595 {
00596     return Thermocouple::convert(temp, inv_poly, inv_poly_size);
00597 }
00598 
00599 float Thermocouple_Type_T::lookup_inv(float temp)
00600 {
00601 #ifdef TYPE_T_LUT
00602     if((temp + lut_offset) > lut_size)
00603         return lut[lut_size - 1];
00604     else
00605         return lut[(uint16_t)temp + lut_offset];
00606 #else
00607     /* NOT IMPLEMENTED */
00608     return 0;
00609 #endif
00610 }
00611 const int Thermocouple_Type_T::poly_size = 2;
00612 const Thermocouple::thermocouple_poly_subrange Thermocouple_Type_T::poly[2] = {
00613     {
00614         -5.603,       0.000, // characteristic curve for mV range between -5.603 and 0.000
00615         {  0.0000000,  2.5949192, -2.1316967,  7.9018692,  4.2527777,  1.3304473,  2.0241446,  1.2668171,},
00616         {          0,          1,         -1,         -1,         -1,         -1,         -2,         -3,},
00617         8
00618     },
00619     {
00620         0.000,      20.872, // characteristic curve for mV range between 0.000 and 20.872
00621         {   0.000000,   2.592800,  -7.602961,   4.637791,  -2.165394,   6.048144,  -7.293422,   0.000000,},
00622         {          0,          1,         -1,         -2,         -3,         -5,         -7,          0,},
00623         8
00624     }
00625 };
00626 
00627 Thermocouple_Type_T::~Thermocouple_Type_T()
00628 {
00629 
00630 }
00631 
00632 float Thermocouple_Type_T::convert(float voltage)
00633 {
00634     return Thermocouple::convert(voltage, poly, poly_size);
00635 }
00636 
00637 float Thermocouple_Type_T::lookup(float voltage)
00638 {
00639 #ifdef TYPE_T_LUT
00640     return Thermocouple::lookup(lut, voltage, lut_size, lut_offset);
00641 #else
00642     /* NOT IMPLEMENTED */
00643     return 0;
00644 #endif
00645 }