NTC 测温度的表值如何计算?
如果温度要求精确到0.5度,该如何操作来读取值?曾经使用NTC测温部分。
/*
***************************************************************************************************
* 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温度
}
}
}
上面是使用的部分代码,NTC测温的算法实现就在里面。
注意:采样AD和具体外部电路相关,所以 NTC数据表要根据采样电路重做。 mark下{:smile:} 谢谢{:victory:} 楼主什么型号的NTC都没说,2楼都能给出阻温表啊,佩服 一般都是使用查表的方式,来找出对应的温度! 我怎么觉的NTC精度太差了,我用普通的B值为3435的那种,5度一步建立电阻表。查表加线性插值,有时能偏3,4度 看你要测那个范围的温度,然后选用合适的NTC,就是在这个范围内NTC阻值分布比较好的.剩下怎么做你懂的! 我怎么觉的NTC精度太差了,我用普通的B值为3435的那种,5度一步建立电阻表。查表加线性插值,有时能偏3,4度
------------------------------------------------------------------------------------------------
还好的。 techbaby 发表于 2012-9-26 15:56 static/image/common/back.gif
曾经使用NTC测温部分。
谢谢二楼共享方法 asdf1776 发表于 2012-9-26 18:20 static/image/common/back.gif
楼主什么型号的NTC都没说,2楼都能给出阻温表啊,佩服
自己使用的NTC电阻计算出来的,没说就是LZ要的程序啊。
我的意思是可以参考。嘿嘿 随随便便都做到了0.1度了,如果有0.02的高精度恒稳水槽。可以将耗散系数引入的误差加入到测温补偿中去。精度达到0.05度是绝对没有问题的。 dgdzas 发表于 2012-9-27 13:38 static/image/common/back.gif
我怎么觉的NTC精度太差了,我用普通的B值为3435的那种,5度一步建立电阻表。查表加线性插值,有时能偏3,4 ...
5度一步建立的电阻表能有什么用? 至少也得0.5度吧。还有流过NTC的电流所产生的功耗也会引起误差的。加入一个补偿因子就可以修正。 MARK! amwjie72 发表于 2012-9-28 11:25 static/image/common/back.gif
随随便便都做到了0.1度了,如果有0.02的高精度恒稳水槽。可以将耗散系数引入的误差加入到测温补偿中去。精 ...
你是指的分辨率吧,精度做到0.05度?我凌乱了 techbaby 发表于 2012-9-26 15:56 static/image/common/back.gif
曾经使用NTC测温部分。
貌似用得上 正需要,收藏 xml2028 发表于 2012-11-23 14:56 static/image/common/back.gif
你是指的分辨率吧,精度做到0.05度?我凌乱了
精度。!!!! 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是功耗。再根据耗散系数,减去一个补偿因子。
温度计算(分段线性插值算法)
好方法 电流不能超过200微安呀,不然精度不会优于0.1度 学习一下.... 谢谢楼主,学习了 mark啊,好东东,学习了! 不错,学习了 终于有切入点了,感谢楼主分享。 先收藏了{:loveliness:} 好东西,顶一个 本帖最后由 lubyudf 于 2013-6-6 16:45 编辑
怎么测量市面上的测温传感器是NTC,求教. 老贴,再顶! 一般都是使用查表的方式,来找出对应的温度! techbaby 发表于 2012-9-26 15:58
非常谢谢你的无私奉献 先收藏备用 老魏 发表于 2012-9-26 20:12
一般都是使用查表的方式,来找出对应的温度!
需要每个板子都进行校准吗?谢谢。 收藏备用 谢谢二楼提供的资料,正好用到 收藏备用。。。。。 好贴留用!!! 谁能说说PT100测温和NTC测温有啥区别呢?感谢 MARK 收藏。以备后用 谢谢分享,好资料 amwjie72 发表于 2012-11-28 15:14
精度做到0.1度
首先,必须选用一个精度在0.1度以内的NTC。最好是可替换精度在0.1度。 一般生产商给 ...
这个哥们说的挺好的!~~~
mark 一直用公式法,觉得用公式法就很好,
楼上说用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:} 谢谢,正好要用 kv2004 发表于 2015-2-10 15:17
一直用公式法,觉得用公式法就很好,
楼上说用2-3mA电流,如果使用100KNTC(20多度时)大概算算功率:0.003*0 ...
哥们 你那个公式法的精度能精确到多少?
贴点资料出来给大家参考参考呗{:loveliness:} 计算方法挺好的,我正准备自己写程序呢 楼主需要这么高的精度呀。一般用查表法做,加一个滤波。 这么大的变化,做到0.5应不好做吧
收藏了。。。 不错,很好的资料。 mark,NTC学习 二楼给出的数组数据表是AD转换后的电压值,而厂家一般给出的是不同温度对应的电阻值,这个电压值是要根据参考电压和分压电阻计算出来的吧? ntc是不是按照不同温度范围定制探头啊 techbaby 发表于 2012-9-26 16:01
上面是使用的部分代码,NTC测温的算法实现就在里面。
注意:采样AD和具体外部电路相关,所以 NTC数据表要 ...
能否把你的测试原理给我们说一下,谢谢 liushiming82 发表于 2019-10-10 20:27
能否把你的测试原理给我们说一下,谢谢
间隔1度计算每个点对应AD值并生成数组表格,由实测AD值反推查找当前对应温度。 学习,谢谢分享
页:
[1]