Thermocouple mV conversion library
Thermocouple_core_cpp.txt@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 | 0:a878bf59a337 | 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 | uint16_t first = 0; |
adisuciu | 0:a878bf59a337 | 10 | uint16_t last = size - 1; |
adisuciu | 0:a878bf59a337 | 11 | uint16_t middle = (first + last) / 2; |
adisuciu | 0:a878bf59a337 | 12 | int32_t integer_voltage = int32_t(voltage*1000); |
adisuciu | 0:a878bf59a337 | 13 | while (first <= last) { |
adisuciu | 0:a878bf59a337 | 14 | if (lut[middle] < integer_voltage) |
adisuciu | 0:a878bf59a337 | 15 | first = middle + 1; |
adisuciu | 0:a878bf59a337 | 16 | else if (lut[middle] == integer_voltage) { |
adisuciu | 0:a878bf59a337 | 17 | return static_cast<float>(middle + offset); |
adisuciu | 0:a878bf59a337 | 18 | } else |
adisuciu | 0:a878bf59a337 | 19 | last = middle - 1; |
adisuciu | 0:a878bf59a337 | 20 | |
adisuciu | 0:a878bf59a337 | 21 | middle = (first + last) / 2; |
adisuciu | 0:a878bf59a337 | 22 | } |
adisuciu | 0:a878bf59a337 | 23 | if (first > last) |
adisuciu | 0:a878bf59a337 | 24 | return static_cast<float>(first+offset); |
adisuciu | 0:a878bf59a337 | 25 | |
adisuciu | 0:a878bf59a337 | 26 | return 0; // should never get here |
adisuciu | 0:a878bf59a337 | 27 | } |
adisuciu | 0:a878bf59a337 | 28 | |
adisuciu | 0:a878bf59a337 | 29 | float Thermocouple::convert(float voltage, const thermocouple_poly_subrange range[], const int n) { |
adisuciu | 0:a878bf59a337 | 30 | int range_id = 0; |
adisuciu | 0:a878bf59a337 | 31 | float temperature=0; |
adisuciu | 0:a878bf59a337 | 32 | for(range_id = 0 ; range_id<n;range_id++) |
adisuciu | 0:a878bf59a337 | 33 | { |
adisuciu | 0:a878bf59a337 | 34 | if(voltage > range[range_id].min_voltage_range && voltage <= range[range_id].max_voltage_range) |
adisuciu | 0:a878bf59a337 | 35 | break; |
adisuciu | 0:a878bf59a337 | 36 | } |
adisuciu | 0:a878bf59a337 | 37 | |
adisuciu | 0:a878bf59a337 | 38 | for (int i = 0; i < range[range_id].n; i++) { |
adisuciu | 0:a878bf59a337 | 39 | temperature += (range[range_id].coef[i] * pow(10,range[range_id].power[i])) * pow(voltage, i); |
adisuciu | 0:a878bf59a337 | 40 | } |
adisuciu | 0:a878bf59a337 | 41 | return temperature; |
adisuciu | 0:a878bf59a337 | 42 | } |
adisuciu | 0:a878bf59a337 | 43 |