搜索
bottom↓
回复: 58

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

  [复制链接]

出0入0汤圆

发表于 2012-9-26 15:53:10 | 显示全部楼层 |阅读模式
  如果温度要求精确到0.5度,该如何操作来读取值?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出20入70汤圆

发表于 2012-9-26 15:56:51 | 显示全部楼层


曾经使用NTC测温部分。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出20入70汤圆

发表于 2012-9-26 15:58:14 | 显示全部楼层
  1. /*
  2. ***************************************************************************************************
  3. *                                       INCLUDE HEADER FILES
  4. ***************************************************************************************************
  5. */
  6. //#pragma  src
  7. #include "cpu.h"

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

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

  49. /*
  50. ***************************************************************************************************
  51. * 函数名称: search_data()
  52. * 输   入: search_value  查找基准值
  53. * 输   出:
  54. * 作   者: Leigh Meng
  55. * 日   期: 2010.08.11
  56. * 功能描述: 二分查找adc采样值
  57. *--------------------------------------------------------------------------------------------------
  58. *注     意:
  59. *    1.    返回值为查找表格中第一个小于查找值(search_value)的下标;
  60. *    2.    查找值(search_value)大于查找表格中最大值时,返回1
  61. *          查找值(search_value)小于查找表格中最小值时,返回查找表格数量,即最大下标+1
  62. ***************************************************************************************************
  63. */
  64. static int16u search_data(int16u search_value)
  65. {
  66.     int16u  max = NTC_ADC_ARRAY_NUM - 1;
  67.     int16u  min = 1;
  68.     int16u  mid;

  69.     while(min <= max)
  70.     {
  71.         mid = (max + min) / 2;

  72.         if(search_value > ntc_adc[mid])
  73.         {
  74.             max = mid - 1;
  75.         }
  76.         else
  77.         {
  78.             min = mid + 1;
  79.         }
  80.     }

  81.     return min;
  82. }

  83. /*
  84. ***************************************************************************************************
  85. * 函数名称: temper_calc()
  86. * 输   入: index       数组下标
  87. *           adc0_value  ad滤波后的采样值
  88. * 输   出: ntc温度测量值
  89. * 作   者: Leigh Meng
  90. * 日   期: 2010.10.26
  91. * 功能描述: 温度计算(分段线性插值算法)
  92. ***************************************************************************************************
  93. */
  94. static int16s temper_calc(int16u index, int16u adc0_value)
  95. {
  96.     if (index > INDEX_MAX || index < INDEX_MIN)
  97.     {
  98.         return TEMPER_ERROR;           //  返回错误采样温度
  99.     }
  100. //    else if (index < INDEX_MIN)
  101. //    {
  102. //        return -150;        //  返回-15.0℃
  103. //    }
  104.     else
  105.     {
  106.         /*************************************************
  107.          === 直线近似计算 ===
  108.          y1 = kx1+b       x <-> adc_value
  109.          y2 = kx2+b       y <-> temper
  110.          yn = kxn+b
  111.                y2 - y1     yn - y1
  112.          k  = --------- = ---------
  113.                x2 - x1     xn - x1
  114.                (y2 - y1)*(xn - x1)
  115.          yn = --------------------- + y1
  116.                      (x2 - x1)
  117.          *************************************************/

  118.         int16s temper;
  119.                                        
  120.         temper  = 10*(ntc_adc[index-1] - adc0_value);   //  放大10倍,temper放大10倍
  121.         temper /= (ntc_adc[index-1] - ntc_adc[index]);  //  (xn - x1)
  122.         temper += 10*(index + TEMPER_REF - 1);
  123.         
  124.         return temper;            
  125.     }      
  126. }

  127. /*
  128. ***************************************************************************************************
  129. * 函数名称: adc0_temper_calc()
  130. * 输   入: adc0_sample_index  温度采样序列值
  131. *           adc0_sample_num    ad采样次数
  132. * 输   出:
  133. * 作   者: Leigh Meng
  134. * 日   期: 2010.03.22
  135. * 功能描述:
  136. ***************************************************************************************************
  137. */
  138. void adc0_temper_calc(int8u adc0_sample_index, int8u adc0_sample_num)
  139. {
  140.     static int8u cnt[ST_MAX];                // 采样滤波计数

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

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

  150.                 if (abs(battery_info.battery_temper[adc0_sample_index] - temper) > 5)        // 两次温度采样相差0.5℃以上
  151.                 {
  152.                         cnt[adc0_sample_index] += 1;
  153.                        
  154.                         if (cnt[adc0_sample_index] > 1)
  155.                         {
  156.                                 cnt[adc0_sample_index] = 0;
  157.                                 battery_info.battery_temper[adc0_sample_index] = temper; // 赋值NTC温度
  158.                         }       
  159.                 }
  160.                 else
  161.                 {
  162.                         cnt[adc0_sample_index] = 0;
  163.                         battery_info.battery_temper[adc0_sample_index] = temper; // 赋值NTC温度       
  164.                 }
  165.                 
  166.     }
  167. }
复制代码

出20入70汤圆

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

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

出0入0汤圆

发表于 2012-9-26 17:09:37 | 显示全部楼层
mark下

出0入0汤圆

 楼主| 发表于 2012-9-26 17:45:18 | 显示全部楼层
谢谢  

出0入0汤圆

发表于 2012-9-26 18:20:04 | 显示全部楼层
楼主什么型号的NTC都没说,2楼都能给出阻温表啊,佩服

出0入0汤圆

发表于 2012-9-26 20:12:46 | 显示全部楼层
一般都是使用查表的方式,来找出对应的温度!

出0入0汤圆

发表于 2012-9-26 20:28:12 | 显示全部楼层
我怎么觉的NTC精度太差了,我用普通的B值为3435的那种,5度一步建立电阻表。查表加线性插值,有时能偏3,4度

出0入4汤圆

发表于 2012-9-26 21:12:33 | 显示全部楼层
看你要测那个范围的温度,然后选用合适的NTC,就是在这个范围内NTC阻值分布比较好的.剩下怎么做你懂的!

出0入0汤圆

发表于 2012-9-27 13:38:27 | 显示全部楼层
我怎么觉的NTC精度太差了,我用普通的B值为3435的那种,5度一步建立电阻表。查表加线性插值,有时能偏3,4度
------------------------------------------------------------------------------------------------
还好的。

出675入8汤圆

发表于 2012-9-27 13:42:04 | 显示全部楼层
techbaby 发表于 2012-9-26 15:56
曾经使用NTC测温部分。

谢谢二楼共享方法

出20入70汤圆

发表于 2012-9-27 13:48:42 | 显示全部楼层
asdf1776 发表于 2012-9-26 18:20
楼主什么型号的NTC都没说,2楼都能给出阻温表啊,佩服

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

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

出0入0汤圆

发表于 2012-9-28 11:25:00 | 显示全部楼层
随随便便都做到了0.1度了,如果有0.02的高精度恒稳水槽。可以将耗散系数引入的误差加入到测温补偿中去。精度达到0.05度是绝对没有问题的。

出0入0汤圆

发表于 2012-9-28 11:27:44 | 显示全部楼层
dgdzas 发表于 2012-9-27 13:38
我怎么觉的NTC精度太差了,我用普通的B值为3435的那种,5度一步建立电阻表。查表加线性插值,有时能偏3,4 ...

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

出0入0汤圆

发表于 2012-11-23 14:43:47 | 显示全部楼层
MARK!     

出675入8汤圆

发表于 2012-11-23 14:56:47 | 显示全部楼层
amwjie72 发表于 2012-9-28 11:25
随随便便都做到了0.1度了,如果有0.02的高精度恒稳水槽。可以将耗散系数引入的误差加入到测温补偿中去。精 ...

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

出0入0汤圆

发表于 2012-11-23 15:04:29 | 显示全部楼层
techbaby 发表于 2012-9-26 15:56
曾经使用NTC测温部分。

貌似用得上

出0入0汤圆

发表于 2012-11-23 21:19:26 | 显示全部楼层
正需要,收藏

出0入0汤圆

发表于 2012-11-27 22:42:47 | 显示全部楼层
xml2028 发表于 2012-11-23 14:56
你是指的分辨率吧,精度做到0.05度?我凌乱了

精度。!!!!

出0入0汤圆

发表于 2012-11-28 15:14:09 | 显示全部楼层
jlian168 发表于 2012-11-28 09:20
Sir: how can i do it=0.1?

Thank you.

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

出0入0汤圆

发表于 2012-12-29 10:35:34 | 显示全部楼层
温度计算(分段线性插值算法)

好方法

出0入0汤圆

发表于 2013-1-29 00:42:47 | 显示全部楼层
电流不能超过200微安呀,不然精度不会优于0.1度

出0入0汤圆

发表于 2013-3-13 16:40:36 来自手机 | 显示全部楼层
学习一下....

出0入0汤圆

发表于 2013-5-27 17:50:39 | 显示全部楼层
谢谢楼主,学习了

出0入0汤圆

发表于 2013-5-27 23:21:53 | 显示全部楼层
mark啊,好东东,学习了!

出0入0汤圆

发表于 2013-5-28 12:22:13 | 显示全部楼层
不错,学习了

出0入0汤圆

发表于 2013-6-6 11:24:15 | 显示全部楼层
终于有切入点了,感谢楼主分享。

出0入0汤圆

发表于 2013-6-6 15:56:57 | 显示全部楼层
先收藏了

出0入0汤圆

发表于 2013-6-6 16:38:35 | 显示全部楼层
好东西,顶一个

出0入0汤圆

发表于 2013-6-6 16:43:55 | 显示全部楼层
本帖最后由 lubyudf 于 2013-6-6 16:45 编辑

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

出350入8汤圆

发表于 2013-6-6 16:55:28 | 显示全部楼层
老贴,再顶!

出0入0汤圆

发表于 2014-8-13 15:47:36 | 显示全部楼层
一般都是使用查表的方式,来找出对应的温度!

出0入0汤圆

发表于 2014-10-4 08:30:37 | 显示全部楼层

非常谢谢你的无私奉献

出0入0汤圆

发表于 2014-10-4 10:14:43 | 显示全部楼层
先收藏备用

出0入0汤圆

发表于 2014-10-4 20:27:13 | 显示全部楼层
老魏 发表于 2012-9-26 20:12
一般都是使用查表的方式,来找出对应的温度!

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

出0入4汤圆

发表于 2014-10-4 20:33:07 | 显示全部楼层
收藏备用

出0入0汤圆

发表于 2014-10-31 15:36:37 | 显示全部楼层
谢谢二楼提供的资料,正好用到

出0入0汤圆

发表于 2014-10-31 16:09:56 | 显示全部楼层
收藏备用。。。。。

出0入0汤圆

发表于 2014-11-7 20:36:07 | 显示全部楼层
好贴留用!!!

出0入0汤圆

发表于 2014-12-18 16:23:06 | 显示全部楼层
谁能说说PT100测温和NTC测温有啥区别呢?感谢

出0入0汤圆

发表于 2015-1-13 16:56:28 | 显示全部楼层
MARK      

出0入0汤圆

发表于 2015-1-19 00:48:45 | 显示全部楼层
收藏。以备后用

出0入0汤圆

发表于 2015-1-19 01:12:50 来自手机 | 显示全部楼层
谢谢分享,好资料

出0入8汤圆

发表于 2015-2-10 14:32:32 | 显示全部楼层
amwjie72 发表于 2012-11-28 15:14
精度做到0.1度
      首先,必须选用一个精度在0.1度以内的NTC。最好是可替换精度在0.1度。 一般生产商给 ...

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

出0入12汤圆

发表于 2015-2-10 15:17:23 | 显示全部楼层
一直用公式法,觉得用公式法就很好,

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

出0入0汤圆

发表于 2015-3-2 08:48:06 | 显示全部楼层
谢谢,正好要用

出0入8汤圆

发表于 2015-3-2 11:46:19 | 显示全部楼层
kv2004 发表于 2015-2-10 15:17
一直用公式法,觉得用公式法就很好,

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

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

出0入4汤圆

发表于 2015-3-2 17:18:43 | 显示全部楼层
计算方法挺好的,我正准备自己写程序呢

出0入0汤圆

发表于 2015-5-12 12:40:11 | 显示全部楼层
楼主需要这么高的精度呀。一般用查表法做,加一个滤波。

出0入0汤圆

发表于 2015-11-25 00:14:40 | 显示全部楼层
这么大的变化,做到0.5应不好做吧

出0入0汤圆

发表于 2015-12-12 11:32:44 | 显示全部楼层
收藏了。。。

出0入0汤圆

发表于 2016-4-6 13:34:47 | 显示全部楼层
不错,很好的资料。

出0入0汤圆

发表于 2017-1-5 20:02:46 | 显示全部楼层
mark,NTC学习

出0入0汤圆

发表于 2017-2-22 16:05:44 | 显示全部楼层
二楼给出的数组数据表是AD转换后的电压值,而厂家一般给出的是不同温度对应的电阻值,这个电压值是要根据参考电压和分压电阻计算出来的吧?

出0入0汤圆

发表于 2017-4-12 15:33:07 | 显示全部楼层
ntc是不是按照不同温度范围定制探头啊

出0入0汤圆

发表于 2019-10-10 20:27:21 | 显示全部楼层
techbaby 发表于 2012-9-26 16:01
上面是使用的部分代码,NTC测温的算法实现就在里面。

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

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

出20入70汤圆

发表于 2019-10-11 09:08:58 | 显示全部楼层
liushiming82 发表于 2019-10-10 20:27
能否把你的测试原理给我们说一下,谢谢

间隔1度计算每个点对应AD值并生成数组表格,由实测AD值反推查找当前对应温度。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 09:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表