forked from feistjo/bq79656
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy paththermistor.h
More file actions
105 lines (101 loc) · 7.21 KB
/
thermistor.h
File metadata and controls
105 lines (101 loc) · 7.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#pragma once
#include <map>
class IThermistor
{
public:
virtual float VoltageToTemperature(float voltage) = 0;
virtual float TemperatureToVoltage(float temperature) = 0;
};
class NXFT15XH103FA2B050 : public IThermistor
{
public:
float VoltageToTemperature(float voltage) override
{
float resistance = (voltage * kSeriesResistance) / (kVRef - voltage);
return Interpolate(resistance_to_temperature_lut_, resistance);
}
float TemperatureToVoltage(float temperature) override
{
float resistance = Interpolate(temperature_to_resistance_lut_, temperature);
return (resistance * kVRef) / (kSeriesResistance + resistance);
}
private:
// consts from datasheet
std::map<float, float> resistance_to_temperature_lut_{
{195652, -40}, {184917.1, -39}, {174845.2, -38}, {165391, -37}, {156512.5, -36}, {148171, -35},
{140330.4, -34}, {132957.6, -33}, {126021.5, -32}, {119493.6, -31}, {113347.1, -30}, {107564.9, -29},
{102115.5, -28}, {96977.6, -27}, {92131.5, -26}, {87558.8, -25}, {83242.4, -24}, {79166.3, -23},
{75315.7, -22}, {71676.8, -21}, {68236.7, -20}, {64990.7, -19}, {61919, -18}, {59011.3, -17},
{56257.9, -16}, {53649.6, -15}, {51177.9, -14}, {48834.9, -13}, {46613.2, -12}, {44505.8, -11},
{42506.2, -10}, {40599.7, -9}, {38790.5, -8}, {37072.9, -7}, {35441.7, -6}, {33892.2, -5},
{32419.7, -4}, {31020, -3}, {29689, -2}, {28423.1, -1}, {27218.6, 0}, {26076, 1},
{24987.7, 2}, {23950.9, 3}, {22962.9, 4}, {22021.1, 5}, {21123, 6}, {20266.6, 7},
{19449.5, 8}, {18669.8, 9}, {17925.5, 10}, {17213.9, 11}, {16534.4, 12}, {15885.6, 13},
{15265.8, 14}, {14673.5, 15}, {14107.5, 16}, {13566.4, 17}, {13048.9, 18}, {12554, 19},
{12080.5, 20}, {11628.1, 21}, {11194.7, 22}, {10779.5, 23}, {10381.5, 24}, {10000, 25},
{9634.2, 26}, {9283.5, 27}, {8947, 28}, {8624.2, 29}, {8314.5, 30}, {8018.1, 31},
{7733.7, 32}, {7460.9, 33}, {7199.1, 34}, {6947.9, 35}, {6706.7, 36}, {6475.1, 37},
{6252.6, 38}, {6039, 39}, {5833.6, 40}, {5635.7, 41}, {5445.4, 42}, {5262.3, 43},
{5086.3, 44}, {4916.9, 45}, {4753.9, 46}, {4597.1, 47}, {4446.1, 48}, {4300.8, 49},
{4160.9, 50}, {4026.2, 51}, {3896.4, 52}, {3771.4, 53}, {3651, 54}, {3535, 55},
{3423.1, 56}, {3315.2, 57}, {3211.3, 58}, {3111, 59}, {3014.3, 60}, {2922.4, 61},
{2833.7, 62}, {2748.2, 63}, {2665.7, 64}, {2586.1, 65}, {2509.3, 66}, {2435.1, 67},
{2363.5, 68}, {2294.3, 69}, {2227.5, 70}, {2162.7, 71}, {2100.1, 72}, {2039.6, 73},
{1981.1, 74}, {1924.5, 75}, {1869.8, 76}, {1817, 77}, {1765.8, 78}, {1716.4, 79},
{1668.5, 80}, {1622.4, 81}, {1577.7, 82}, {1534.5, 83}, {1492.7, 84}, {1452.1, 85},
{1412.9, 86}, {1374.9, 87}, {1338.1, 88}, {1302.5, 89}, {1268, 90}, {1234.3, 91},
{1201.6, 92}, {1170, 93}, {1139.3, 94}, {1109.6, 95}, {1080.7, 96}, {1052.8, 97},
{1025.6, 98}, {999.3, 99}, {973.8, 100}, {949.2, 101}, {925.4, 102}, {902.2, 103},
{879.8, 104}, {858, 105}, {836.8, 106}, {816.2, 107}, {796.3, 108}, {776.9, 109},
{758, 110}, {739.7, 111}, {721.9, 112}, {704.6, 113}, {687.8, 114}, {671.5, 115},
{655.6, 116}, {640.2, 117}, {625.2, 118}, {610.6, 119}, {596.4, 120}, {582.6, 121},
{569.2, 122}, {556.2, 123}, {543.5, 124}, {531.1, 125}};
std::map<float, float> temperature_to_resistance_lut_{
{-40, 195652}, {-39, 184917.1}, {-38, 174845.2}, {-37, 165391}, {-36, 156512.5}, {-35, 148171},
{-34, 140330.4}, {-33, 132957.6}, {-32, 126021.5}, {-31, 119493.6}, {-30, 113347.1}, {-29, 107564.9},
{-28, 102115.5}, {-27, 96977.6}, {-26, 92131.5}, {-25, 87558.8}, {-24, 83242.4}, {-23, 79166.3},
{-22, 75315.7}, {-21, 71676.8}, {-20, 68236.7}, {-19, 64990.7}, {-18, 61919}, {-17, 59011.3},
{-16, 56257.9}, {-15, 53649.6}, {-14, 51177.9}, {-13, 48834.9}, {-12, 46613.2}, {-11, 44505.8},
{-10, 42506.2}, {-9, 40599.7}, {-8, 38790.5}, {-7, 37072.9}, {-6, 35441.7}, {-5, 33892.2},
{-4, 32419.7}, {-3, 31020}, {-2, 29689}, {-1, 28423.1}, {0, 27218.6}, {1, 26076},
{2, 24987.7}, {3, 23950.9}, {4, 22962.9}, {5, 22021.1}, {6, 21123}, {7, 20266.6},
{8, 19449.5}, {9, 18669.8}, {10, 17925.5}, {11, 17213.9}, {12, 16534.4}, {13, 15885.6},
{14, 15265.8}, {15, 14673.5}, {16, 14107.5}, {17, 13566.4}, {18, 13048.9}, {19, 12554},
{20, 12080.5}, {21, 11628.1}, {22, 11194.7}, {23, 10779.5}, {24, 10381.5}, {25, 10000},
{26, 9634.2}, {27, 9283.5}, {28, 8947}, {29, 8624.2}, {30, 8314.5}, {31, 8018.1},
{32, 7733.7}, {33, 7460.9}, {34, 7199.1}, {35, 6947.9}, {36, 6706.7}, {37, 6475.1},
{38, 6252.6}, {39, 6039}, {40, 5833.6}, {41, 5635.7}, {42, 5445.4}, {43, 5262.3},
{44, 5086.3}, {45, 4916.9}, {46, 4753.9}, {47, 4597.1}, {48, 4446.1}, {49, 4300.8},
{50, 4160.9}, {51, 4026.2}, {52, 3896.4}, {53, 3771.4}, {54, 3651}, {55, 3535},
{56, 3423.1}, {57, 3315.2}, {58, 3211.3}, {59, 3111}, {60, 3014.3}, {61, 2922.4},
{62, 2833.7}, {63, 2748.2}, {64, 2665.7}, {65, 2586.1}, {66, 2509.3}, {67, 2435.1},
{68, 2363.5}, {69, 2294.3}, {70, 2227.5}, {71, 2162.7}, {72, 2100.1}, {73, 2039.6},
{74, 1981.1}, {75, 1924.5}, {76, 1869.8}, {77, 1817}, {78, 1765.8}, {79, 1716.4},
{80, 1668.5}, {81, 1622.4}, {82, 1577.7}, {83, 1534.5}, {84, 1492.7}, {85, 1452.1},
{86, 1412.9}, {87, 1374.9}, {88, 1338.1}, {89, 1302.5}, {90, 1268}, {91, 1234.3},
{92, 1201.6}, {93, 1170}, {94, 1139.3}, {95, 1109.6}, {96, 1080.7}, {97, 1052.8},
{98, 1025.6}, {99, 999.3}, {100, 973.8}, {101, 949.2}, {102, 925.4}, {103, 902.2},
{104, 879.8}, {105, 858}, {106, 836.8}, {107, 816.2}, {108, 796.3}, {109, 776.9},
{110, 758}, {111, 739.7}, {112, 721.9}, {113, 704.6}, {114, 687.8}, {115, 671.5},
{116, 655.6}, {117, 640.2}, {118, 625.2}, {119, 610.6}, {120, 596.4}, {121, 582.6},
{122, 569.2}, {123, 556.2}, {124, 543.5}, {125, 531.1}};
const float kVRef{5.0f};
const float kSeriesResistance{10000.0f};
float Interpolate(const std::map<float, float>& map, float x)
{
typedef std::map<float, float>::const_iterator iterator;
iterator ub = map.upper_bound(x);
if (ub == map.end())
{
return (--ub)->second;
}
if (ub == map.begin())
{
return ub->second;
}
iterator lb = ub;
lb--;
const float delta = (x - lb->first) / (ub->first - lb->first);
return delta * ub->second + (1 - delta) * lb->second;
}
};