简易的NTC-10K-3950测温
前言
温度是一个非常重要的物理量, 无论是生活还是工业上都离不开它, 我们可通过温度传感器测量被测物体的温度来获取物体的冷热程序。温度传感器有非常多的种类, 而NTC类无疑是应用最广泛的, 它具有易制造、成本低、精度好和稳定性好等优点。NTC是负温度热敏电阻, 我们只需要简单的电路, 通过MCU的ADC采集电压再换算成温度便可得到被测物体的温度。
一、概述
??正是NTC温度传感器这些优势使它应用于各行各业中, 比如家用电饭煲、饮水机、冰箱、热水器和空调等家用电器, 因此学习电子技术是必须要掌握的。下图是一个外接式NTC-10K-3950温度传感器。
?
二、电路和原理
1.电路图
?
2.原理概述
??上图是一个简单的测温电路, 只需要NTC串接一个10K电阻并在电源两端, MCU的ADC采集RT_INT上电压再经过欧姆定律求出NTC的阻值, 通过温度表或公式就可求出温度值, 如果是通过公式计算是比较麻烦的且误差比查表大, 因此查表是一个不错的实现方式, 虽然会占用MCU的flash较多, 但以目前的MCU来说是九牛一毛。为什么先前说它精度和稳定性好, 主要它每摄氏度之间相差在几百Ω的距离, 因此外延线可较长, 不易受干扰。如果是PT100温度传感器, 每摄氏度之间相差不到1Ω, 易受电路和延长线干扰。
?
??同时, 采集的温度精度还取决于MCU的ADC, 主要包括ADC的分辨率和参考电压, 每款MCU的ADC精度是不一样的, 具体精度误差需要查看手册看是否满足自己的需求, 如下图是灵动微MM32F0130系列的ADC精度表, 单位LSB指的一个12位分辨率的ADC共有4096数字位(2的12次幂等于4096)的其中一位。如综合误差在3.4LSB, 在3.3V参考电压下, 该误差电压是3.3V / 4096 * 3.4LSB ≈ 3mV, 再通过NTC温度表逆推看是否可忽略该误差。
?
??下图是NTC温度表其中的一段表值, 假如取39°C和40°C两个中间值变化对比, 在3.3V情况下, 39°C的ADC采样电压=3.3V * 5.531K / (10K + 5.531K) ≈ 1.1752V, 40°C的ADC采样电压=3.3V * 5.311K / (10K + 5.311K) ≈ 1.1447V, 两相减约得30mV是满足总误差3mV。假设最糟糕的情况下, 39°C的最小值与40°C的最大值两值的电压距离, 通过计算约得15mV, 也是足够的。如果还不能满足要求请校准ADC, 同时给ADC参考电压提供稳定和精度好的电压源, 可用专用的参考电压IC, 通常用TL431可调稳压管可节省成本。
?
三、程序设计
1.程序代码
#include "ntc_rv_table.h"
#include "adcx.h"
#define TABLE_SIZE 181
#define ADC1_CONVDATA_SIZE 8
const u32 g_rvTable[TABLE_SIZE] = {
1034600, 959006, 889452, 825419, 766434,
712066, 661926, 615656, 572934, 533466, 496983, 463240, 432015, 403104, 376320,
351495, 328472, 307110, 287279, 268859, 251741, 235826, 221021, 207242, 194412,
182460, 171320, 160932, 151241, 142196, 133750, 125859, 118485, 111589, 105139,
99102, 93450, 88156, 83195, 78544, 74183, 70091, 66250, 66643, 59255,
56071, 53078, 50263, 47614, 45121, 42774, 40563, 38480, 36517, 34665,
32919,
31270, 29715, 28246, 26858, 25547, 24307, 23135, 22026, 20977, 19987,
19044, 18154, 17310, 16510, 15752, 15034, 14352, 13705, 13090, 12507,
11953, 11427, 10927, 10452, 10000, 9570, 9161, 8771, 8401, 8048,
7712, 7391, 7086, 6795, 6518, 6254, 6001, 5761, 5531, 5311,
5102, 4902, 4710, 4528, 4353, 4186, 4026, 3874, 3728, 3588,
3454, 3326, 3203, 3085, 2973, 2865, 2761, 2662, 2567, 2476,
2388, 2304, 2223, 2146, 2072, 2000, 1932, 1866, 1803, 1742,
1684, 1627, 1573, 1521, 1471, 1423, 1377, 1332, 1289, 1248,
1208, 1170, 1133, 1097, 1063, 1030, 998, 968, 938, 909,
882, 855, 829, 805, 781, 758, 735, 714, 693, 673,
653, 635, 616, 599, 582, 565, 550, 534, 519, 505,
491, 478, 465, 452, 440, 428, 416, 405, 395, 384,
374, 364, 355, 345, 337
};
u16 mid_filter(u16 *collection, u16 size)
{
u16 e;
u16 i, j;
u8 sorted;
i = 0;
while(i < size - 1){
sorted = 1;
j = 0;
while(j < size - 1 - i){
if(collection[j] > collection[j + 1]){
e = collection[j];
collection[j] = collection[j + 1];
collection[j + 1] = e;
sorted = 0;
}
j++;
}
if(sorted) break;
i++;
}
return collection[size / 2];
}
s8 ntc_get_temp(void)
{
s16 i;
u32 adcValue;
float rValue;
s8 temperature;
u16 adc_buffer[ADC1_CONVDATA_SIZE];
for(i = 0; i < ADC1_CONVDATA_SIZE; i++)
adc_buffer[i] = GetAdcAverage(5);
adcValue = mid_filter(adc_buffer, ADC1_CONVDATA_SIZE);
rValue = 4095000.0;
rValue = rValue / adcValue - 1000;
adcValue = 10000000.0 / rValue;
for(i = 0; i < TABLE_SIZE; i++) {
if(adcValue > g_rvTable[i]) {
temperature = i - 55;
break;
}
}
return temperature;
}
?
2.程序简述
??调用ntc_get_temp()函数可获取温度值, GetAdcAverage()函数是ADC采集的数字量电压, 之后通过mid_filter()滤波。
rValue = 4095000.0;
rValue = rValue / adcValue - 1000;
adcValue = 10000000.0 / rValue;
上面 三条语句是获取NTC阻值的换算公式, 为何要这么写呢?这是推算的结果, 假设NTC通过10K电阻并在电源上的电压与ADC参考电压一致, 都是3.3V, 即 VCC = ADC_REF = 3.3V, 则ADC采集电压(电路图中RT_INT的网络号)ADC_V = VCC * RT / (10K + RT)。已知MCU的ADC分辨率是12BIT, 即最大数字量是4095, 则ADC_V = ADC_REF * ADC_DATA / 4095, ADC_DATA为ADC获取的数字量电压。将这两公式进行合并解方程求出RT阻值, VCC * RT / (10K + RT) = VCC * ADC_DATA / 4095, 最后公式得出RT = 10000000 / (4095000 / ADC_DATA - 1000), 简化出结果只受一个变量影响, 排除了电源电压相关变量, 精度更好了, 详细公式计算如下图。
?
四、总结
??该电路简单有效, 只要配合少量代码便能准确读出被测物体的温度值, 在通常应用中是够用的, 如需精度更准, 应用环境恶劣要求稳定性更好, 可加运放和做温度补偿, 但一般这些情况下用数字温度传感器会更好。
?
五、下载地址
https://github.com/chengzidun/blog.git https://download.csdn.net/download/chengzidun/21732373
?
免责申明: 作者难免技术水平有限,如有错误拒不承认,本文技术资料只适于学习和参考,不可商用,若要商用,不必告知我,跟我没一毛关系。
|