这是一个热敏电阻查询程序,程序目前适配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