Thermocouple mV conversion library

Dependents:   CN0391

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?

UserRevisionLine numberNew 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