IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 简易的NTC-10K-3950测温 -> 正文阅读

[嵌入式]简易的NTC-10K-3950测温

简易的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

//NTC-10K-3950-B值
//-55~125°C对应的电阻阻值表(单位: Ω)
//阻值~温度换算: 数组下标索引减去55即为温度值
const u32 g_rvTable[TABLE_SIZE] = {
	1034600, 959006, 889452, 825419, 766434, 											//-55~-51
	712066, 661926, 615656, 572934, 533466, 496983, 463240, 432015, 403104, 376320, 	//-50~-41
	351495, 328472, 307110, 287279, 268859, 251741, 235826, 221021, 207242, 194412, 	//-40~-31
	182460, 171320, 160932, 151241, 142196, 133750, 125859, 118485, 111589, 105139, 	//-30~-21
	99102, 93450, 88156, 83195, 78544, 74183, 70091, 66250, 66643, 59255, 				//-20~-11
	56071, 53078, 50263, 47614, 45121, 42774, 40563, 38480, 36517, 34665, 				//-10~-1
	32919, 																				//0
	31270, 29715, 28246, 26858, 25547, 24307, 23135, 22026, 20977, 19987, 				//1~10
	19044, 18154, 17310, 16510, 15752, 15034, 14352, 13705, 13090, 12507, 				//11~20
	11953, 11427, 10927, 10452, 10000, 9570, 9161, 8771, 8401, 8048, 					//21~30
	7712, 7391, 7086, 6795, 6518, 6254, 6001, 5761, 5531, 5311, 						//31~40
	5102, 4902, 4710, 4528, 4353, 4186, 4026, 3874, 3728, 3588, 						//41~50
	3454, 3326, 3203, 3085, 2973, 2865, 2761, 2662, 2567, 2476, 						//51~60
	2388, 2304, 2223, 2146, 2072, 2000, 1932, 1866, 1803, 1742, 						//61~70
	1684, 1627, 1573, 1521, 1471, 1423, 1377, 1332, 1289, 1248, 						//71~80
	1208, 1170, 1133, 1097, 1063, 1030, 998, 968, 938, 909, 							//81~90
	882, 855, 829, 805, 781, 758, 735, 714, 693, 673, 									//91~100
	653, 635, 616, 599, 582, 565, 550, 534, 519, 505, 									//101~110
	491, 478, 465, 452, 440, 428, 416, 405, 395, 384, 									//111~120
	374, 364, 355, 345, 337																//121~125
};

/**
 * @brief 中值滤波
 * @param collection: 元素集合
 * @param size: 集合大小
 * @retval 中值
 */
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

?


免责申明: 作者难免技术水平有限,如有错误拒不承认,本文技术资料只适于学习和参考,不可商用,若要商用,不必告知我,跟我没一毛关系。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-31 15:36:26  更:2021-08-31 15:38:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:43:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码