这是一个热敏电阻查询程序,程序目前适配B值为3950,25℃时阻值为10K的NTC,程序res_temp_list列表值为阻值,可以计算得到阻值后查询,也可以用NTC_TEMP_VAL进行常量计算得到AD值,再以AD值查询,每个电路度算方式不一样。 查询温度自动适别升序和降序。两温度之间按值进行线性计算。
NTC_TEMP_VAL也可以以温度为参数,通过公式计算得到阻值,不过要对程序进行修改。其它B值,请自行修改。
/** * \file ntc_3950_10k.c * \brief 热敏电阻温度对应值表 * \author 红尘客 * \date 2021-09-01 * * 温度从-10℃到85℃,1℃对应一个值 \n * B值: 3950 \n * 阻值: 10K \n */ #include "ntc_temp.h" /** \brief AD值温度值对应表 * * 此表值通过计算查询获得 */ const uint16_t res_temp_list[] = { #if NTC_TEMP_MIN < -5 NTC_TEMP_VAL(58246), //-10 NTC_TEMP_VAL(55028), NTC_TEMP_VAL(52011), NTC_TEMP_VAL(49179), NTC_TEMP_VAL(46522), #endif #if NTC_TEMP_MIN < 0 NTC_TEMP_VAL(44026), //-5 NTC_TEMP_VAL(41681), NTC_TEMP_VAL(39477), NTC_TEMP_VAL(37405), NTC_TEMP_VAL(35455), #endif NTC_TEMP_VAL(33621), //0 NTC_TEMP_VAL(31893), NTC_TEMP_VAL(30266), NTC_TEMP_VAL(28733), NTC_TEMP_VAL(27288), NTC_TEMP_VAL(25925), //5 NTC_TEMP_VAL(24639), NTC_TEMP_VAL(23425), NTC_TEMP_VAL(22279), NTC_TEMP_VAL(21197), NTC_TEMP_VAL(20175), //10 NTC_TEMP_VAL(19208), NTC_TEMP_VAL(18294), NTC_TEMP_VAL(17430), NTC_TEMP_VAL(16612), NTC_TEMP_VAL(15837), //15 NTC_TEMP_VAL(15104), NTC_TEMP_VAL(14409), NTC_TEMP_VAL(13751), NTC_TEMP_VAL(13127), NTC_TEMP_VAL(12535), //20 NTC_TEMP_VAL(11974), NTC_TEMP_VAL(11441), NTC_TEMP_VAL(10936), NTC_TEMP_VAL(10456), NTC_TEMP_VAL(10000), //25 NTC_TEMP_VAL(9567), NTC_TEMP_VAL(9155), NTC_TEMP_VAL(8764), NTC_TEMP_VAL(8391), NTC_TEMP_VAL(8037), //30 NTC_TEMP_VAL(7700), NTC_TEMP_VAL(7379), NTC_TEMP_VAL(7074), NTC_TEMP_VAL(6783), NTC_TEMP_VAL(6506), //35 NTC_TEMP_VAL(6241), NTC_TEMP_VAL(5989), NTC_TEMP_VAL(5749), NTC_TEMP_VAL(5520), NTC_TEMP_VAL(5301), //40 NTC_TEMP_VAL(5093), NTC_TEMP_VAL(4894), NTC_TEMP_VAL(4703), NTC_TEMP_VAL(4522), NTC_TEMP_VAL(4348), //45 NTC_TEMP_VAL(4182), NTC_TEMP_VAL(4024), NTC_TEMP_VAL(3872), NTC_TEMP_VAL(3727), NTC_TEMP_VAL(3588), //50 #if NTC_TEMP_MAX > 50 NTC_TEMP_VAL(3455), NTC_TEMP_VAL(3328), NTC_TEMP_VAL(3207), NTC_TEMP_VAL(3090), NTC_TEMP_VAL(2978), //55 NTC_TEMP_VAL(2871), NTC_TEMP_VAL(2769), NTC_TEMP_VAL(2671), NTC_TEMP_VAL(2577), NTC_TEMP_VAL(2486), //60 #endif #if NTC_TEMP_MAX > 60 NTC_TEMP_VAL(2399), NTC_TEMP_VAL(2316), NTC_TEMP_VAL(2237), NTC_TEMP_VAL(2160), NTC_TEMP_VAL(2086), //65 NTC_TEMP_VAL(2016), NTC_TEMP_VAL(1948), NTC_TEMP_VAL(1883), NTC_TEMP_VAL(1820), NTC_TEMP_VAL(1760), //70 #endif #if NTC_TEMP_MAX > 70 NTC_TEMP_VAL(1702), NTC_TEMP_VAL(1646), NTC_TEMP_VAL(1593), NTC_TEMP_VAL(1541), NTC_TEMP_VAL(1492), //75 NTC_TEMP_VAL(1444), NTC_TEMP_VAL(1398), NTC_TEMP_VAL(1354), NTC_TEMP_VAL(1311), NTC_TEMP_VAL(1270), //80 NTC_TEMP_VAL(1231), NTC_TEMP_VAL(1193), NTC_TEMP_VAL(1156), NTC_TEMP_VAL(1121), NTC_TEMP_VAL(1087) //85 #endif }; /** \brief 计算温度 * \param val 阻值,AD值,电压值或者与温度相关的其它值 * \return 温度值,带一个小数,如:168表求16.8℃ */ int16_t ntc_inquire(uint16_t val) { uint8_t left, right, mid; uint8_t asc; //升序 left = 0; right = sizeof(res_temp_list) / sizeof(res_temp_list[0]) - 1; asc = res_temp_list[1] > res_temp_list[0]; do { mid = left + (right - left) / 2; if (val >= res_temp_list[mid]) { if (asc) { left = mid; } else { right = mid; } } else { if (asc) { right = mid; } else { left = mid; } } } while (right - left >= 2); return ((int32_t)res_temp_list[left] - val) * 10 / ((int32_t)res_temp_list[left] - res_temp_list[right]) + (left + NTC_TEMP_MIN) * 10; }
以下为头文件和配置文件:
/** * \file ntc_temp.h * \brief NTC热敏电阻温度查询头文件 * \author 红尘客 * \date 2021-09-01 * * 热敏电阻阻值计算: \n * Rt = R * e^(B * (1 / (273.15 + t) - 1 / 298.15)) \n * 其中R为25℃时电阻,B为热敏最阻B25/50值,t为温度 */ #ifndef __NTC_TEMP_H__ #define __NTC_TEMP_H__ #include <stdint.h> /** \brief 温度对应的数据 * \param RES 电阻值 * * 可以是常量表达式 */ #define NTC_TEMP_VAL(RES) (RES) #define NTC_TEMP_MIN (-10) ///< 最低温度,可选-10, -5, 0 #define NTC_TEMP_MAX (70) ///< 最高温度,可选50, 60, 70, 85 extern int16_t ntc_inquire(uint16_t res); #endif