Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
For additional information check out the mbed page of the Analog Devices wiki: https://wiki.analog.com/resources/tools-software/mbed-drivers-all
libraries/Thermocouple/Thermocouple.cpp@33:c3ec596a29c2, 2016-11-07 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |
CN0357 - Toxic gas measurement
CN0216 - Weight Scale