热敏电阻温度阻值查询程序
2024-11-13
标签: 热敏电阻

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


可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号