97 lines
3.5 KiB
C
97 lines
3.5 KiB
C
#include "ntc.h"
|
||
|
||
#define TABLE_SIZE 181
|
||
#define NTC_SERIES_RESISTOR 10000 // 10K
|
||
#define BASE_TEMP -55
|
||
// NTC-10K-3950-B值
|
||
//-55~125°C对应的电阻阻值表(单位: Ω)
|
||
static uint32_t _table[TABLE_SIZE] = {
|
||
739500, 705664, 669165, 631466, 593686, //-55~-51
|
||
556644, 520911, 486858, 454704, 424553, 396426, 370283, 346049, 323623, 302890, //-50~-41
|
||
283730, 266022, 249649, 234498, 220466, 207454, 195372, 184139, 173681, 163931, //-40~-31
|
||
154827, 146315, 138347, 130877, 123866, 117280, 111084, 105252, 99756, 94573, //-30~-21
|
||
89682, 85063, 80699, 76574, 72672, 68982, 65489, 62183, 59052, 56087, //-20~-11
|
||
53280, 50620, 48100, 45712, 43450, 41306, 39274, 37349, 35524, 33795, //-10~-1
|
||
32116, // 0
|
||
30601, 29128, 27732, 26408, 25152, 23962, 22833, 21762, 20746, 19783, // 1~10
|
||
18868, 18000, 17177, 16395, 15652, 14947, 14277, 13641, 13036, 12461, // 11~20
|
||
11915, 11395, 10901, 10431, 10000, 9557, 9151, 8765, 8397, 8047, // 21~30
|
||
7712, 7394, 7090, 6800, 6523, 6259, 6008, 5767, 5537, 5318, // 31~40
|
||
5108, 4907, 4716, 4532, 4357, 4189, 4029, 3875, 3728, 3588, // 41~50
|
||
3453, 3324, 3200, 3081, 2968, 2859, 2754, 2654, 2558, 2466, // 51~60
|
||
2377, 2293, 2211, 2133, 2058, 1986, 1917, 1850, 1786, 1725, // 61~70
|
||
1666, 1610, 1555, 1503, 1452, 1404, 1358, 1313, 1270, 1228, // 71~80
|
||
1189, 1150, 1113, 1078, 1044, 1011, 979, 948, 919, 890, // 81~90
|
||
863, 837, 811, 787, 763, 740, 718, 697, 676, 657, // 91~100
|
||
637, 619, 601, 584, 567, 551, 535, 520, 505, 491, // 101~110
|
||
478, 464, 451, 439, 427, 415, 404, 393, 382, 371, // 111~120
|
||
361, 351, 342, 333, 324, // 121~125
|
||
};
|
||
|
||
static uint8_t ntc_lookup(const uint32_t *list, uint16_t adc)
|
||
{
|
||
uint8_t middle = 0;
|
||
uint8_t indexL = 0;
|
||
uint8_t indexR = TABLE_SIZE - 1;
|
||
if (adc >= *(list + 0))
|
||
return 0;
|
||
if (adc <= *(list + TABLE_SIZE - 1))
|
||
return TABLE_SIZE - 1;
|
||
|
||
while ((indexR - indexL) > 1)
|
||
{
|
||
middle = (indexL + indexR) >> 1;
|
||
if (adc == *(list + middle))
|
||
return middle;
|
||
else if (adc > *(list + middle))
|
||
indexR = middle;
|
||
else if (adc < *(list + middle))
|
||
indexL = middle;
|
||
}
|
||
return indexL;
|
||
}
|
||
|
||
void ntc_init(void)
|
||
{
|
||
}
|
||
|
||
/**
|
||
* @brief 获取温度值,单位为0.1摄氏度
|
||
* @param {uint16_t} adc采集值
|
||
* @return {float32_t} 温度值
|
||
* @note
|
||
*/
|
||
float32_t ntc_get_temp(uint16_t adc)
|
||
{
|
||
|
||
uint8_t index = 0;
|
||
int16_t data = 0;
|
||
int16_t t = 0;
|
||
int16_t result = 0;
|
||
uint32_t rt = 0;
|
||
const int16_t base = BASE_TEMP * 10;
|
||
float32_t res;
|
||
res.f = BASE_TEMP;
|
||
|
||
/**
|
||
* ad = (4095*rt)/(rt+10000)
|
||
* rt = (ad*100)/(4095-ad)
|
||
*/
|
||
rt = (adc * NTC_SERIES_RESISTOR) / (4095 - adc);
|
||
index = ntc_lookup(_table, rt);
|
||
if (rt >= _table[0])
|
||
return res;
|
||
if (rt <= *(_table + TABLE_SIZE - 1))
|
||
{
|
||
result = (TABLE_SIZE - 1) * 10 + base;
|
||
}
|
||
else
|
||
{
|
||
data = _table[index] - _table[index + 1];
|
||
t = 10 * (_table[index] - rt) / data;
|
||
result = base + index * 10 + t;
|
||
}
|
||
res.f = result / 10.0;
|
||
return res;
|
||
}
|