hetao7241 发表于 2012-6-3 12:17:51

大家用NTC测温用的啥型号,多少K的?分享一下程序,谢谢!

本帖最后由 hetao7241 于 2012-6-3 15:35 编辑

我最近也需要低成本测温,准备用ATMEGA8L(10位AD)来做,以前没用过,希望用常用的NTC,在电子市场或淘宝好买。

我测温在-40°-60°就可以了,分辨率1°就可以了,在论坛上搜了一下,以前的附件都不能下载,想走点捷径,希望分享一下大家测温部分的代码。

谢谢!

llssr 发表于 2012-6-3 12:43:16

10K或100K

somuchso 发表于 2012-6-3 14:33:42

你10位的ADC想做到采样精度为1度劝你最好用温度传感器做,10K或100K NTC是做不到这个精度的。

babysnail 发表于 2012-6-3 14:51:21

somuchso 发表于 2012-6-3 14:33 static/image/common/back.gif
你10位的ADC想做到采样精度为1度劝你最好用温度传感器做,10K或100K NTC是做不到这个精度的。 ...

凡是没绝对。

可以采用过超采样的方法提高1、2位是可以的。 ntc也有温漂、线性、精度比较好的厂家和型号。要做好非线性补偿。
做这个有个麻烦就是生产标定问题!

hetao7241 发表于 2012-6-3 15:37:15

llssr 发表于 2012-6-3 12:43 static/image/common/back.gif
10K或100K

感谢你的分享!

hetao7241 发表于 2012-6-3 15:37:32

somuchso 发表于 2012-6-3 14:33 static/image/common/back.gif
你10位的ADC想做到采样精度为1度劝你最好用温度传感器做,10K或100K NTC是做不到这个精度的。 ...

搞错了,分辨率1°,精度的话也要求不要,相差2-3°不碍大事

hetao7241 发表于 2012-6-3 15:39:42

babysnail 发表于 2012-6-3 14:51 static/image/common/back.gif
凡是没绝对。

可以采用过超采样的方法提高1、2位是可以的。 ntc也有温漂、线性、精度比较好的厂家和型号 ...

我这个相差几度没有问题,每一个热敏电阻要是不标定相差都有10多°,用这个也没有多大意义了

hetao7241 发表于 2012-6-3 16:18:26

llssr 发表于 2012-6-3 12:43 static/image/common/back.gif
10K或100K

请教一下,不知你是通过哪种方式买到他们产品的,我在网上比如淘宝都不好找到他们的产品,

另外这个是不是每个厂家做的参数基本一致哦?所以程序基本通用就一定的阻值哈。

谢谢!

llssr 发表于 2012-6-3 17:36:04

hetao7241 发表于 2012-6-3 16:18 static/image/common/back.gif
请教一下,不知你是通过哪种方式买到他们产品的,我在网上比如淘宝都不好找到他们的产品,

另外这个是不 ...

直接找他们要的样品,你在深圳的话可以给你几个用一下

korgo 发表于 2012-6-3 17:55:38

测温度直接上PT385很准,而且计算简单

hetao7241 发表于 2012-6-4 08:48:31

korgo 发表于 2012-6-3 17:55 static/image/common/back.gif
测温度直接上PT385很准,而且计算简单

你这个哪里有资料?怎么查不到?

onlywen 发表于 2012-6-4 09:32:26

用5k的NTC也很好啊

korgo 发表于 2012-6-4 09:36:54

hetao7241 发表于 2012-6-4 08:48 static/image/common/back.gif
你这个哪里有资料?怎么查不到?

PT385也叫PT100,零度是是100欧姆,每变化1度阻值变化0.385欧姆

hetao7241 发表于 2012-6-4 10:46:51

本帖最后由 hetao7241 于 2012-6-4 11:06 编辑

onlywen 发表于 2012-6-4 09:32 static/image/common/back.gif
用5k的NTC也很好啊

这个热敏电阻不同厂家的能不能基本通用呢?我看淘宝上MF的比较多,不带H.

我把你的和网上找的一个对比了一下,参数都不太一样:



hetao7241 发表于 2012-6-4 10:47:34

korgo 发表于 2012-6-4 09:36 static/image/common/back.gif
PT385也叫PT100,零度是是100欧姆,每变化1度阻值变化0.385欧姆

谢谢!原来没有搞懂385.

onlywen 发表于 2012-6-5 10:37:11

你看下B值有不同。

hetao7241 发表于 2012-6-5 10:54:53

onlywen 发表于 2012-6-5 10:37 static/image/common/back.gif
你看下B值有不同。

非常感谢!基本搞懂了,热敏电阻不同厂家生产的,在某一温度值,阻值应该基本一致;B值当然是一个可选参数。我对温度变化速度,精度没有太多要求

techbaby 发表于 2012-6-5 11:21:11


/*
***************************************************************************************************
*                                       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查找基准值
* 输 出:
* 作 者:
* 日 期: 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温度测量值
* 作 者:
* 日 期: 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采样次数
* 输 出:
* 作 者:
* 日 期:
* 功能描述:
***************************************************************************************************
*/
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-6-5 11:23:02

NTC采样电压计算

hetao7241 发表于 2012-6-5 11:58:01

techbaby 发表于 2012-6-5 11:23 static/image/common/back.gif
NTC采样电压计算

感谢你提供这么好的资料!

hetao7241 发表于 2012-6-5 12:02:10

llssr 发表于 2012-6-3 12:43 static/image/common/back.gif
10K或100K

我正在分析你提供的资料,其中有一个提供了完整程序:
这程序里的“temp>=ad_date;”是啥用法呢?
void tempertur()
{
for(n=0;temp>=ad_date;n++);
tp=temperiture;
change(tp);
LCD_Write_add_data(4,0,0x30+bai);
LCD_Write_add_data(5,0,0x30+shi);
LCD_Write_add_data(7,0,0x30+ge);
}

提供一个图:

sync765 发表于 2012-6-5 12:09:47

好帖子
内容很全面啊
学习

jade1988 发表于 2012-6-5 12:14:57

hetao7241 发表于 2012-6-5 12:02 static/image/common/back.gif
我正在分析你提供的资料,其中有一个提供了完整程序:
这程序里的“temp>=ad_date;”是啥用法呢?
voi ...

大于等于啊??

hetao7241 发表于 2012-6-5 12:25:58

jade1988 发表于 2012-6-5 12:14 static/image/common/back.gif
大于等于啊??

for(n=0;temp>=ad_date;n++);

怎么解释呢?我是向你虚心学习的。

蜂巢 发表于 2012-6-5 12:45:20

NTC做+/-1C的精度是可以的。我常用的是10K的。

god-father 发表于 2012-6-5 13:06:00

somuchso 发表于 2012-6-3 14:33 static/image/common/back.gif
你10位的ADC想做到采样精度为1度劝你最好用温度传感器做,10K或100K NTC是做不到这个精度的。 ...

NTC可以做到0.3左右,这个我做过。

jade1988 发表于 2012-6-5 13:11:30

hetao7241 发表于 2012-6-5 12:25 static/image/common/back.gif
for(n=0;temp>=ad_date;n++);

怎么解释呢?我是向你虚心学习的。

呵呵,别这样说,我也是菜鸟一个,好久没有写程序了;

我看那个意思,好象是拿读取的AD值与其中的一个表中的对应找出n的值,再在另一个表中找出对应温度的值;

jade1988 发表于 2012-6-5 13:29:37

hetao7241 发表于 2012-6-5 12:25 static/image/common/back.gif
for(n=0;temp>=ad_date;n++);

怎么解释呢?我是向你虚心学习的。

大哥,你那个图片上你不都已经标上注释了么??{:dizzy:}

难道还是有什么特别的问题??

hetao7241 发表于 2012-6-5 13:37:06

本帖最后由 hetao7241 于 2012-6-5 13:39 编辑

他是想表达这个意思,但是“>=”是用于比较,单两个数值比较,没有“if”什么,这个怎么理解?

jade1988 发表于 2012-6-5 13:56:27

hetao7241 发表于 2012-6-5 13:37 static/image/common/back.gif
他是想表达这个意思,但是“>=”是用于比较,单两个数值比较,没有“if”什么,这个怎么理解? ...

他那也是两个值比较啊;只不过外面加了个循环;

把读取到的值与一个表中的值从小到大比较,那个n起到一个桥梁的作用;

我认为那个表你应该以你自己的真实环境实测一下;那个电阻在扳子上的位置不同也会有差别吧;

hetao7241 发表于 2012-6-5 14:32:44

jade1988 发表于 2012-6-5 13:56 static/image/common/back.gif
他那也是两个值比较啊;只不过外面加了个循环;

把读取到的值与一个表中的值从小到大比较,那个n起到一 ...

感谢!我的C语言功底不扎实,刚才把keil弄起,仿真了一下,确实是对的。

hetao7241 发表于 2012-6-5 14:59:15

本帖最后由 hetao7241 于 2012-6-5 15:01 编辑

god-father 发表于 2012-6-5 13:06 static/image/common/back.gif
NTC可以做到0.3左右,这个我做过。

请教一下,你们是怎么买这个NTC的,我刚才问了电子市场卖这个的,他们只晓得热敏电阻值大小,

B值大小就查不到了,这个B值好像对值影响很大的。

确定的某个值,比如50K的NTC,B值不同厂家应该会不一样嘛,矛盾呢

谢谢!

eblc1388 发表于 2012-6-5 15:29:22

B值大小在不同的温度段落是有小许差别的,因为B值目的是用来模仿温度段落内真实的电阻曲线。使用温度段落两端的实测阻值,就能计算B出来。段落太大模仿就不准确了。

例如:

B(0~50C)    = 3892K
B(25C~50C) = 3936K
B(25C~85C) = 3976K

hetao7241 发表于 2012-6-5 15:45:55

本帖最后由 hetao7241 于 2012-6-5 15:47 编辑

哦,明白了。

hetao7241 发表于 2012-6-5 15:47:30

本帖最后由 hetao7241 于 2012-6-5 17:25 编辑

eblc1388 发表于 2012-6-5 15:29 static/image/common/back.gif
B值大小在不同的温度段落是有小许差别的,因为B值目的是用来模仿温度段落内真实的电阻曲线。使用温度段落两 ...

原来B值也是变化的,那给的参数B值可能也是25时或25左右的温度范围。

那我在电子市场上买一个热敏电阻,比如50K的热敏电阻,怎么来弄R与T的对照表呢?电子市场卖器件的是没法提供B值的

根据经验一般怎么做,谢谢!

找到的一些资料:


ntc热敏电阻(关键词 热敏电阻 查找 B值):

http://www.elecfans.com/weiji/wiki/ntc%E7%83%AD%E6%95%8F%E7%94%B5%E9%98%BB

eblc1388 发表于 2012-6-5 17:26:17

那就要看资料文档。通常 B 值是提供 B(25C~50C) 的。

>> 怎么来弄R与T的对照表呢?

如卖家不能提供,这只能用恒温箱自己直接测量。

hetao7241 发表于 2012-6-5 17:28:37

eblc1388 发表于 2012-6-5 17:26 static/image/common/back.gif
那就要看资料文档。通常 B 值是提供 B(25C~50C) 的。

>> 怎么来弄R与T的对照表呢?


哦,非常感谢!看来必须得找到B值,否则很麻烦的。

eblc1388 发表于 2012-6-5 17:37:59

你如果买的量是以千计的,那卖方当然会给你提供或代你向厂家拿资料文档。

hetao7241 发表于 2012-6-5 22:21:54

eblc1388 发表于 2012-6-5 17:37 static/image/common/back.gif
你如果买的量是以千计的,那卖方当然会给你提供或代你向厂家拿资料文档。 ...

嗯,你说得好。但是开初不可能那么大的量。

god-father 发表于 2012-6-5 23:03:38

hetao7241 发表于 2012-6-5 14:59 static/image/common/back.gif
请教一下,你们是怎么买这个NTC的,我刚才问了电子市场卖这个的,他们只晓得热敏电阻值大小,

B值大小就 ...

B值是要用的。如果你用的是查表的方法,还需要厂商提供完整的拟合曲线。
记得网上有MF系列的拟合曲线,根据你的要求做拟合。
要注意,NTC是有精度的,
精度包括两方面,一个是阻值精度、另一个就是B值精度,你项目的精度高低及产品的一致性跟精度有直接关系。

eblc1388 发表于 2012-6-5 23:25:16

致楼主,图中的 NTC 都标有 B 值的,至於B值精度就不知道了。



hetao7241 发表于 2012-6-6 08:55:27

god-father 发表于 2012-6-5 23:03 static/image/common/back.gif
B值是要用的。如果你用的是查表的方法,还需要厂商提供完整的拟合曲线。
记得网上有MF系列的拟合曲线,根 ...

感谢!可能一致性确实不好弄,热敏电阻的精度应该不至于相差个2-3度嘛,我的要求不高,有两三度差异没事。

hetao7241 发表于 2012-6-6 08:55:59

本帖最后由 hetao7241 于 2012-6-6 14:21 编辑

eblc1388 发表于 2012-6-5 23:25 static/image/common/back.gif
致楼主,图中的 NTC 都标有 B 值的,至於B值精度就不知道了。

感谢提供的信息!

保存些有用的地址信息:

http://bbs.ednchina.com/BLOG_ARTICLE_224223.HTM

http://www.ourdev.cn/forum.php?mod=viewthread&tid=2110044&highlight=%E6%B5%8B%E6%B8%A9

http://www.ouravr.com/forum.php?mod=viewthread&tid=756872

110011019 发表于 2013-7-23 11:27:59

您这个最后做成了吗?NTC热敏电阻如何选取,精密电阻又是如何选取的呢??、

deyun 发表于 2013-7-23 15:57:35

查表太麻烦,并且不同的电阻值和不同的B值需要不同的表,看看我的做法:
/*
根据公式R=R25*expB(1/T-1/T25)导出T=B/或T=B/
B=3950,则B/T25=13.2483649
NTC=100k,则ln(R25)=11.51292546
最后得出T=B/,计算结果是绝对温度
精确到1位小数的摄氏度算法是:
(int)((B*10)/(log(adc6)/(1024-adc6))+B/(273.15+25))-273.15*10+0.5)) */
#define NTC_B 4100
int adc2t(void){
        return((int)( (float)(NTC_B*10)/(log((float)adc6/(float)(1024-adc6))+NTC_B/298.15)-2747));
}

powermeter 发表于 2013-7-24 07:44:00

mark,收了。

song77 发表于 2013-7-24 08:26:20

我用线性拟合的方法

touch_mcu 发表于 2013-7-24 10:48:18

deyun 发表于 2013-7-23 15:57 static/image/common/back.gif
查表太麻烦,并且不同的电阻值和不同的B值需要不同的表,看看我的做法:
/*
根据公式R=R25*expB(1/T-1/T25) ...

这执行一次大概需要多长时间?

deyun 发表于 2013-7-25 04:11:20

touch_mcu 发表于 2013-7-24 10:48 static/image/common/back.gif
这执行一次大概需要多长时间?

完成这个运算需要5.8k左右个时钟周期,如果芯片的晶振频率比较低,就适合用曲线拟合程序了。

touch_mcu 发表于 2013-7-25 12:22:55

deyun 发表于 2013-7-25 04:11 static/image/common/back.gif
完成这个运算需要5.8k左右个时钟周期,如果芯片的晶振频率比较低,就适合用曲线拟合程序了。 ...

这样的公式,单片机要执行这么多的时钟周期。还不如二分法查表。

jz701209李 发表于 2013-7-25 14:31:13

正需要,好帖

夜尽天明 发表于 2013-7-25 15:12:12

还可以用RC充放电测电阻

divineliu 发表于 2013-7-25 21:30:21

热心的人很多啊

deyun 发表于 2013-7-28 16:13:09

touch_mcu 发表于 2013-7-25 12:22 static/image/common/back.gif
这样的公式,单片机要执行这么多的时钟周期。还不如二分法查表。

无论是CRC还是浮点函数运算,AVR都需要消耗很多周期,但是代码可以做的短小或者编程变得比较容易,如果单片机工作到接近极限,查表就作为优先选择了,但是会占用很多程序代码空间。

气球 发表于 2013-7-28 16:47:03

常见的NTC一致性都很差的,一般又不会用烘箱标定,还是用Pt精度有保证。

3.3v 发表于 2013-7-29 13:52:43

我一般用10K的NTC

逆流而上 发表于 2013-10-1 16:33:15

MARK {:lol:}{:lol:}

guziqiang0005 发表于 2013-10-18 21:07:20

llssr 发表于 2012-6-3 12:43 static/image/common/back.gif
10K或100K

下载后仔细看,谢谢!

烂泥桑 发表于 2013-10-22 15:20:38

大神啊。。。

wildcat7261 发表于 2014-3-2 14:27:35

收藏了   

XIE2099 发表于 2014-3-2 16:06:49

测温在-40°-60°这种NTC 应该要跟工厂确认,我们用的是这家WWW.SensorBase.com

Xplain 发表于 2014-5-15 15:48:20

学习了{:smile:},NTC测温很详细

bulejeans 发表于 2014-5-15 19:38:49

Mark.         

elec_china 发表于 2014-5-15 20:09:21

我一般用33K的NTC

lncwangfeilnc 发表于 2014-5-17 18:14:17

mark            

sunlifang159 发表于 2014-6-5 17:25:50

都是干货,很详细,收藏了

humy 发表于 2014-7-8 21:32:44

很好的资料

sweet_136 发表于 2014-10-20 19:56:54

夜尽天明 发表于 2013-7-25 15:12
还可以用RC充放电测电阻

大神..求指导

lpantonie 发表于 2014-12-29 10:48:08

{:smile:}不错的帖子,有学习到了

yanzhiwei 发表于 2015-12-12 13:08:03

llssr 发表于 2012-6-3 12:43
10K或100K

很好的资料

daicp 发表于 2016-5-21 18:34:34

deyun 发表于 2013-7-23 15:57
查表太麻烦,并且不同的电阻值和不同的B值需要不同的表,看看我的做法:
/*
根据公式R=R25*expB(1/T-1/T25) ...

请问您这个算法中,NTC和多大的电阻串联呢?

52HLX 发表于 2016-7-7 13:06:10

好资料,多谢

taiyangshendi2 发表于 2016-9-21 09:45:13

ntc的零下貌似很差我们一般用10K的

粤H广宁 发表于 2016-12-27 20:31:28

MARK !谢谢!

lbygtwx 发表于 2016-12-27 21:15:28

不错的资料,收了。
页: [1]
查看完整版本: 大家用NTC测温用的啥型号,多少K的?分享一下程序,谢谢!