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