Thermocouple mV conversion library

Dependents:   CN0391

Thermocouple_core_cpp.txt

Committer:
adisuciu
Date:
2016-11-07
Revision:
1:5421fc992678
Parent:
0:a878bf59a337

File content as of revision 1:5421fc992678:

#include "thermocouple.h"

// http://srdata.nist.gov/its90/download/allcoeff.tab

Thermocouple::Thermocouple(){}
Thermocouple::~Thermocouple() {}

float Thermocouple::lookup(const int32_t *lut, float voltage, uint16_t size, int16_t offset) {
    uint16_t first = 0;
    uint16_t last = size - 1;
    uint16_t middle = (first + last) / 2;
    int32_t integer_voltage = int32_t(voltage*1000);
    while (first <= last) {
        if (lut[middle] < integer_voltage)
            first = middle + 1;
        else if (lut[middle] == integer_voltage) {
            return static_cast<float>(middle + offset);
        } else
            last = middle - 1;

        middle = (first + last) / 2;
    }
    if (first > last)
        return static_cast<float>(first+offset);

    return 0; // should never get here
}

float Thermocouple::convert(float voltage, const thermocouple_poly_subrange range[], const int n) {
    int range_id = 0;
    float temperature=0;
    for(range_id = 0 ; range_id<n;range_id++)
    {
        if(voltage > range[range_id].min_voltage_range && voltage <= range[range_id].max_voltage_range)
            break;
    }

    for (int i = 0; i < range[range_id].n; i++) {
        temperature += (range[range_id].coef[i] * pow(10,range[range_id].power[i])) * pow(voltage, i);
    }
    return temperature;
}