bowen_fang 发表于 2012-9-26 15:53:10

NTC 测温度的表值如何计算?

如果温度要求精确到0.5度,该如何操作来读取值?

techbaby 发表于 2012-9-26 15:56:51



曾经使用NTC测温部分。

techbaby 发表于 2012-9-26 15:58:14

/*
***************************************************************************************************
*                                       INCLUDE HEADER FILES
***************************************************************************************************
*/
//#pragmasrc
#include "cpu.h"

#include <math.h>
#include "adc0.h"

/*
***************************************************************************************************
*                                       ntc对应采样电压值数组
*--------------------------------------------------------------------------------------------------
* 注释第一行:对应温度
*--------------------------------------------------------------------------------------------------
* 测量温度范围定为-10℃-150℃(可能会有零点几的数据出入)
***************************************************************************************************
*/
static int16u code ntc_adc[] =
{      
        4018,   3990,   3961,   3932,   3901,   3869,   3836,   3802,
        3767,   3731,   3694,   3656,   3617,   3577,   3536,   3494,   
        3451,   3407,   3363,   3318,   3271,   3225,   3177,   3129,   
        3080,   3031,   2981,   2931,   2881,   2830,   2779,   2728,   
        2676,   2625,   2573,   2522,   2470,   2419,   2368,   2317,   
        2267,   2216,   2167,   2117,   2068,   2020,   1972,   1925,   
        1878,   1832,   1787,   1742,   1698,   1655,   1612,   1571,   
        1530,   1490,   1450,   1412,   1374,   1337,   1301,   1265,   
        1231,   1197,   1164,   1132,   1101,   1070,   1040,   1011,   
       983,    956,    929,    903,    877,    853,    829,    805,   
       783,    761,    739,    718,    698,    678,    659,    641,   
       623,    605,    588,    572,    556,    541,    526,    511,   
       497,    483,    470,    457,    444,    432,    420,    409,   
       398,    387,    377,    367,    357,    347,    338,    329,   
       320,    312,    304,    296,    288,    280,    273,    266,   
       259,    253,    246,    240,    234,    228,    222,    217,   
       211,    206,    201,    196,    191,    186,    182,    177,   
       173,    169,    165,    161,    157,    153,    150,    146,   
       143,    139,    136,    133,    130,    127,    124,    121,   
       119,    116,    113,    111,    108,    106,    103,    101,   
          99,   97,   95,   93,   91,   89,   87,   85,   
          83,   81,          80,
};                                                                                       
#define NTC_ADC_ARRAY_NUM (sizeof(ntc_adc)/sizeof(int16u))
#define INDEX_MAX       (NTC_ADC_ARRAY_NUM-3)        /* 数组下标的最大可用取值,对应 80℃采样值下标 */
#define INDEX_MIN       3                                       /* 数组下标的最小可用取值,对应-10℃采样值下标 */
#define TEMPER_REF      -15                                   /* 温度基准点,即下标为0时对应的温度                    */
#define TEMPER_LAST   155                                   /* 温度最后值,即数组最后一个对应的温度      */

/*
***************************************************************************************************
* 函数名称: search_data()
* 输 入: search_value查找基准值
* 输 出:
* 作 者: Leigh Meng
* 日 期: 2010.08.11
* 功能描述: 二分查找adc采样值
*--------------------------------------------------------------------------------------------------
*注   意:
*    1.    返回值为查找表格中第一个小于查找值(search_value)的下标;
*    2.    查找值(search_value)大于查找表格中最大值时,返回1
*          查找值(search_value)小于查找表格中最小值时,返回查找表格数量,即最大下标+1
***************************************************************************************************
*/
static int16u search_data(int16u search_value)
{
    int16umax = NTC_ADC_ARRAY_NUM - 1;
    int16umin = 1;
    int16umid;

    while(min <= max)
    {
      mid = (max + min) / 2;

      if(search_value > ntc_adc)
      {
            max = mid - 1;
      }
      else
      {
            min = mid + 1;
      }
    }

    return min;
}

/*
***************************************************************************************************
* 函数名称: temper_calc()
* 输 入: index       数组下标
*         adc0_valuead滤波后的采样值
* 输 出: ntc温度测量值
* 作 者: Leigh Meng
* 日 期: 2010.10.26
* 功能描述: 温度计算(分段线性插值算法)
***************************************************************************************************
*/
static int16s temper_calc(int16u index, int16u adc0_value)
{
    if (index > INDEX_MAX || index < INDEX_MIN)
    {
      return TEMPER_ERROR;           //返回错误采样温度
    }
//    else if (index < INDEX_MIN)
//    {
//      return -150;      //返回-15.0℃
//    }
    else
    {
      /*************************************************
         === 直线近似计算 ===
         y1 = kx1+b       x <-> adc_value
         y2 = kx2+b       y <-> temper
         yn = kxn+b
               y2 - y1   yn - y1
         k= --------- = ---------
               x2 - x1   xn - x1
               (y2 - y1)*(xn - x1)
         yn = --------------------- + y1
                     (x2 - x1)
         *************************************************/

      int16s temper;
                                       
      temper= 10*(ntc_adc - adc0_value);   //放大10倍,temper放大10倍
      temper /= (ntc_adc - ntc_adc);//(xn - x1)
      temper += 10*(index + TEMPER_REF - 1);
      
      return temper;            
    }      
}

/*
***************************************************************************************************
* 函数名称: adc0_temper_calc()
* 输 入: adc0_sample_index温度采样序列值
*         adc0_sample_num    ad采样次数
* 输 出:
* 作 者: Leigh Meng
* 日 期: 2010.03.22
* 功能描述:
***************************************************************************************************
*/
void adc0_temper_calc(int8u adc0_sample_index, int8u adc0_sample_num)
{
    static int8u cnt;                // 采样滤波计数

        if (adc0_sample_index < ST_MAX) // 温度采样索引值在预定义范围内
    {                      
      int16u adc0_filter;         // 滤波处理的ad采样值                                 
      int16s temper;                  // 温度值
      int16u index;               // 查表下标值

                // 算术平均滤波(采样值求和后平均)处理
      adc0_filter = arithmetic_average_filter(&adc0_sample_value, adc0_sample_num);
      index       = search_data(adc0_filter);             // 取温度数组下标
      temper      = temper_calc(index, adc0_filter);      // 温度计算               

                if (abs(battery_info.battery_temper - temper) > 5)        // 两次温度采样相差0.5℃以上
                {
                        cnt += 1;
                       
                        if (cnt > 1)
                        {
                                cnt = 0;
                                battery_info.battery_temper = temper; // 赋值NTC温度
                        }       
                }
                else
                {
                        cnt = 0;
                        battery_info.battery_temper = temper; // 赋值NTC温度       
                }
                
    }
}

techbaby 发表于 2012-9-26 16:01:11

上面是使用的部分代码,NTC测温的算法实现就在里面。

注意:采样AD和具体外部电路相关,所以 NTC数据表要根据采样电路重做。

powermeter 发表于 2012-9-26 17:09:37

mark下{:smile:}

bowen_fang 发表于 2012-9-26 17:45:18

谢谢{:victory:}

asdf1776 发表于 2012-9-26 18:20:04

楼主什么型号的NTC都没说,2楼都能给出阻温表啊,佩服

老魏 发表于 2012-9-26 20:12:46

一般都是使用查表的方式,来找出对应的温度!

zuu0 发表于 2012-9-26 20:28:12

我怎么觉的NTC精度太差了,我用普通的B值为3435的那种,5度一步建立电阻表。查表加线性插值,有时能偏3,4度

D.lovers 发表于 2012-9-26 21:12:33

看你要测那个范围的温度,然后选用合适的NTC,就是在这个范围内NTC阻值分布比较好的.剩下怎么做你懂的!

dgdzas 发表于 2012-9-27 13:38:27

我怎么觉的NTC精度太差了,我用普通的B值为3435的那种,5度一步建立电阻表。查表加线性插值,有时能偏3,4度
------------------------------------------------------------------------------------------------
还好的。

xml2028 发表于 2012-9-27 13:42:04

techbaby 发表于 2012-9-26 15:56 static/image/common/back.gif
曾经使用NTC测温部分。

谢谢二楼共享方法

techbaby 发表于 2012-9-27 13:48:42

asdf1776 发表于 2012-9-26 18:20 static/image/common/back.gif
楼主什么型号的NTC都没说,2楼都能给出阻温表啊,佩服

自己使用的NTC电阻计算出来的,没说就是LZ要的程序啊。

我的意思是可以参考。嘿嘿

amwjie72 发表于 2012-9-28 11:25:00

随随便便都做到了0.1度了,如果有0.02的高精度恒稳水槽。可以将耗散系数引入的误差加入到测温补偿中去。精度达到0.05度是绝对没有问题的。

amwjie72 发表于 2012-9-28 11:27:44

dgdzas 发表于 2012-9-27 13:38 static/image/common/back.gif
我怎么觉的NTC精度太差了,我用普通的B值为3435的那种,5度一步建立电阻表。查表加线性插值,有时能偏3,4 ...

5度一步建立的电阻表能有什么用? 至少也得0.5度吧。还有流过NTC的电流所产生的功耗也会引起误差的。加入一个补偿因子就可以修正。

flotox 发表于 2012-11-23 14:43:47

MARK!   

xml2028 发表于 2012-11-23 14:56:47

amwjie72 发表于 2012-9-28 11:25 static/image/common/back.gif
随随便便都做到了0.1度了,如果有0.02的高精度恒稳水槽。可以将耗散系数引入的误差加入到测温补偿中去。精 ...

你是指的分辨率吧,精度做到0.05度?我凌乱了

a_2012_m 发表于 2012-11-23 15:04:29

techbaby 发表于 2012-9-26 15:56 static/image/common/back.gif
曾经使用NTC测温部分。

貌似用得上

lihw2@ 发表于 2012-11-23 21:19:26

正需要,收藏

amwjie72 发表于 2012-11-27 22:42:47

xml2028 发表于 2012-11-23 14:56 static/image/common/back.gif
你是指的分辨率吧,精度做到0.05度?我凌乱了

精度。!!!!

amwjie72 发表于 2012-11-28 15:14:09

jlian168 发表于 2012-11-28 09:20 static/image/common/back.gif
Sir: how can i do it=0.1?

Thank you.

精度做到0.1度
      首先,必须选用一个精度在0.1度以内的NTC。最好是可替换精度在0.1度。 一般生产商给出的阻温表,是在“零功耗”情况下测量出来了。
而在实际应用中,你是不可能在“零功耗”的情况下来测量NTC的电阻。这样就必定有一定量的电流流过NTC。电流的大小要控制好。
太小了,容易受到干扰,太大的,会使NTC过热。不易补偿。一般选取2~3mA。
测量电阻的同时,再计算出NTC是功耗。再根据耗散系数,减去一个补偿因子。

qingzhong 发表于 2012-12-29 10:35:34

温度计算(分段线性插值算法)

好方法

fanhanbai 发表于 2013-1-29 00:42:47

电流不能超过200微安呀,不然精度不会优于0.1度

jz701209李 发表于 2013-3-13 16:40:36

学习一下....

yikuang 发表于 2013-5-27 17:50:39

谢谢楼主,学习了

llz0734 发表于 2013-5-27 23:21:53

mark啊,好东东,学习了!

gfy200866 发表于 2013-5-28 12:22:13

不错,学习了

hncel 发表于 2013-6-6 11:24:15

终于有切入点了,感谢楼主分享。

Felix257 发表于 2013-6-6 15:56:57

先收藏了{:loveliness:}

lubyudf 发表于 2013-6-6 16:38:35

好东西,顶一个

lubyudf 发表于 2013-6-6 16:43:55

本帖最后由 lubyudf 于 2013-6-6 16:45 编辑

怎么测量市面上的测温传感器是NTC,求教.

bmagui 发表于 2013-6-6 16:55:28

老贴,再顶!

bingshuihuo888 发表于 2014-8-13 15:47:36

一般都是使用查表的方式,来找出对应的温度!

xurenhui 发表于 2014-10-4 08:30:37

techbaby 发表于 2012-9-26 15:58


非常谢谢你的无私奉献

qumei 发表于 2014-10-4 10:14:43

先收藏备用

darkness27 发表于 2014-10-4 20:27:13

老魏 发表于 2012-9-26 20:12
一般都是使用查表的方式,来找出对应的温度!

需要每个板子都进行校准吗?谢谢。

cnshibo 发表于 2014-10-4 20:33:07

收藏备用

wxb7893212 发表于 2014-10-31 15:36:37

谢谢二楼提供的资料,正好用到

fm0826 发表于 2014-10-31 16:09:56

收藏备用。。。。。

121854416 发表于 2014-11-7 20:36:07

好贴留用!!!

打酱油要专业 发表于 2014-12-18 16:23:06

谁能说说PT100测温和NTC测温有啥区别呢?感谢

RelayProtect 发表于 2015-1-13 16:56:28

MARK      

a_y_ang 发表于 2015-1-19 00:48:45

收藏。以备后用

online9930 发表于 2015-1-19 01:12:50

谢谢分享,好资料

opiviqo 发表于 2015-2-10 14:32:32

amwjie72 发表于 2012-11-28 15:14
精度做到0.1度
      首先,必须选用一个精度在0.1度以内的NTC。最好是可替换精度在0.1度。 一般生产商给 ...

这个哥们说的挺好的!~~~
mark

kv2004 发表于 2015-2-10 15:17:23

一直用公式法,觉得用公式法就很好,

楼上说用2-3mA电流,如果使用100KNTC(20多度时)大概算算功率:0.003*0.003*100000=0.9W {:3_50:} NTC两段电压:0.003*100000=300V{:3_50:}
                              如果使用10KNTC                                 :0.003*0.003*10000 =0.09W   NTC两段电压:0.003*10000 =30 V{:3_50:}

qq854149876 发表于 2015-3-2 08:48:06

谢谢,正好要用

opiviqo 发表于 2015-3-2 11:46:19

kv2004 发表于 2015-2-10 15:17
一直用公式法,觉得用公式法就很好,

楼上说用2-3mA电流,如果使用100KNTC(20多度时)大概算算功率:0.003*0 ...

哥们 你那个公式法的精度能精确到多少?
贴点资料出来给大家参考参考呗{:loveliness:}

ZL_electric 发表于 2015-3-2 17:18:43

计算方法挺好的,我正准备自己写程序呢

杨遥 发表于 2015-5-12 12:40:11

楼主需要这么高的精度呀。一般用查表法做,加一个滤波。

jeoo8888 发表于 2015-11-25 00:14:40

这么大的变化,做到0.5应不好做吧

yanzhiwei 发表于 2015-12-12 11:32:44

收藏了。。。

喜羊羊 发表于 2016-4-6 13:34:47

不错,很好的资料。

52HLX 发表于 2017-1-5 20:02:46

mark,NTC学习

caoxuedong 发表于 2017-2-22 16:05:44

二楼给出的数组数据表是AD转换后的电压值,而厂家一般给出的是不同温度对应的电阻值,这个电压值是要根据参考电压和分压电阻计算出来的吧?

xianghaisha 发表于 2017-4-12 15:33:07

ntc是不是按照不同温度范围定制探头啊

liushiming82 发表于 2019-10-10 20:27:21

techbaby 发表于 2012-9-26 16:01
上面是使用的部分代码,NTC测温的算法实现就在里面。

注意:采样AD和具体外部电路相关,所以 NTC数据表要 ...

能否把你的测试原理给我们说一下,谢谢

techbaby 发表于 2019-10-11 09:08:58

liushiming82 发表于 2019-10-10 20:27
能否把你的测试原理给我们说一下,谢谢

间隔1度计算每个点对应AD值并生成数组表格,由实测AD值反推查找当前对应温度。

lcmdw 发表于 2024-8-9 16:30:36

学习,谢谢分享
页: [1]
查看完整版本: NTC 测温度的表值如何计算?