单片机测量NTC热敏电阻温度的方法(含程序代码)

这篇具有很好参考价值的文章主要介绍了单片机测量NTC热敏电阻温度的方法(含程序代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、NTC介绍

NTC是负温度系数热敏电阻,随着温度的升高,NTC的阻值会呈非线性的下降。

2、硬件连接

单片机测量NTC热敏电阻温度的方法(含程序代码)

这里采用100k 3950的热敏电阻,100k代表的是在25℃下的标准阻值,3950是热敏电阻的B值,B值与电阻温度系数正相关,也就是说B值越大,其电阻温度系数也就越大。

3、 温度计算

网上查找我们所选用NTC对应的R-T对照表,也就是温度阻值对照表。根据R-T表绘制出的曲线图发现这是一个非线性曲线,所以我们很难求解。这个时候我们可以采用曲线拟合的方法,划分成很多个区间,每个区间都是一段小直线,就类比分段函数,区间划分的越多结果就越精确。这样我们只要知道NTC的阻值,找到对应的区间,带入一元一次方程求解就可以计算出对应的温度值。NTC的阻值可以通过单片机ADC采集100K电阻两端电压,然后根据电阻分压来算出。

下图是用Excel表绘制出的曲线图,Y轴是温度,单位℃,X轴是电阻值,单位KΩ。

单片机测量NTC热敏电阻温度的方法(含程序代码)

 4、代码

1、本次需要测量的温度范围为-30~90度之间,划分为120个区间,网上查找3950 100k热敏电阻所对应的R-T对照表,把各温度对应的电阻值写入一个数值中。

// b值为3950 的NTC阻值表,单位为10Ω
uint32_t NTC[121]=		
{
   178797,      //-30
   167960,      //-29
   157850,      //-28
   148415,      //-27
   139606,      //-26
   131377,      //-25
   123686,      //-24
   116495,      //-23
   109769,      //-22
   103474,      //-21
   97580,       //-20
   92059,       //-19
   86886,       //-18
   82036,       //-17
   77487,       //-16
   73218,       //-15
   69212,       //-14
   65449,       //-13
   61915,       //-12
   58593,       //-11
   55470,       //-10
   52532,       //-9
   49768,       //-8
   47166,       //-7
   44715,       //-6
   42407,       //-5
   40232,       //-4
   38182,       //-3
   36248,       //-2
   34423,       //-1
   32701,       //0
   31076,       //1
   29541,       //2
   28090,       //3
   26720,       //4
   25424,       //5
   24198,       //6
   23039,       //7
   21942,       //8
   20903,       //9
   19920,       //10
   18988,       //11
   18105,       //12
   17268,       //13
   16475,       //14
   15722,       //15
   15008,       //16
   14331,       //17
   13688,       //18
   13077,       //19
   12497,       //20
   11946,       //21
   11422,       //22
   10924,       //23
   10450,       //24
   10000,       //25
   9571,        //26
   9163,        //27
   8774,        //28
   8405,        //29
   8052,        //30
   7717,        //31
   7397,        //32
   7092,        //33
   6801,        //34
   6524,        //35
   6259,        //36
   6007,        //37
   5766,        //38
   5536,        //39
   5316,        //40
   5106,        //41
   4906,        //42
   4714,        //43
   4531,        //44
   4356,        //45
   4188,        //46
   4028,        //47
   3875,        //48
   3728,        //49
   3588,        //50
   3454,        //51
   3325,        //52
   3202,        //53
   3084,        //54
   2970,        //55
   2862,        //56
   2758,        //57
   2658,        //58
   2563,        //59
   2471,        //60
   2383,        //61
   2299,        //62
   2218,        //63
   2140,        //64
   2065,        //65
   1994,        //66
   1925,        //67
   1859,        //68
   1795,        //69
   1734,        //70
   1675,        //71
   1619,        //72
   1564,        //73
   1512,        //74
   1462,        //75
   1414,        //76
   1367,        //77
   1322,        //78
   1279,        //79
   1238,        //80
   1198,        //81
   1159,        //82
   1122,        //83
   1086,        //84
   1052,        //85
   1019,        //86
   987,         //87
   956,         //88
   926,         //89
   898          //90
};

2、温度计算代码如下:文章来源地址https://www.toymoban.com/news/detail-510667.html

#define	REF_RES_VAL     10000    //参考电阻为100K=10000*10, 单位是10Ω
uint16_t VCC,NTC1_VOLT,NTC2_VOLT;
uint16_t get_value[8];
extern uint32_t NTC[121];

uint16_t Voltage_Samples(adc_channel_t ch)
{
	uint16_t InterrefVolt_ADC,ANI2_ADC,ANI3_ADC;
	
	ADC_Converse(ADC_INTERREFVOLT, 8 , get_value); 
	InterrefVolt_ADC = ADC_MidAvg_Filter(get_value,8);
	VCC = 1450*4096/InterrefVolt_ADC;
//	printf("VCC = %dmv\r\n",VCC);
	
  if(ch == ADC_CHANNEL_2)
  {
  	ADC_Converse(ADC_CHANNEL_2, 8 , get_value); 
  	ANI2_ADC = ADC_MidAvg_Filter(get_value,8);
    NTC1_VOLT = ANI2_ADC*VCC/4096;
    ADC_Stop();			
//  	printf("NTC1_VOLT = %dmv\r\n",NTC1_VOLT);
  	return NTC1_VOLT;
  }	

  if(ch == ADC_CHANNEL_3)
  {
	  ADC_Converse(ADC_CHANNEL_3, 8 , get_value);
	  ANI3_ADC = ADC_MidAvg_Filter(get_value,8);
      NTC2_VOLT = ANI3_ADC*VCC/4096;	
		ADC_Stop();	
//	  printf("NTC2_VOLT = %dmv\r\n",NTC2_VOLT);
		return NTC2_VOLT;
	}
	return 0;
}

uint16_t ADC_MidAvg_Filter(uint16_t *buf, uint8_t num)
{
    uint8_t i, j;
    uint16_t tmp;
    uint32_t sum;

    /* sort the value from small to large */
    for(i = 0; i < num; i++)
    {
        for(j = 0; j < ((num - 1) - i); j++)
        {
            if(buf[j] > buf[j + 1])
            {
                tmp = buf[j];
                buf[j] = buf[j + 1];
                buf[j + 1] = tmp;
            }
        }
    }

    /* Remove the smallest and largest values, then take the average */
    sum = 0;
    for(i = 2; i < (num - 2); i++)
    {
        sum += buf[i];
    }
    tmp = (uint16_t) (sum / (num - 4));

    return (tmp);
}

/*************************************************************************************************
* 函数名: CalcuTemp
* 参  数: 无
* 返回值: 无
* 描  述: 根据计算的阻值来查表,获取对应温度
*************************************************************************************************/
int16_t CalcuTemp(uint16_t getdata)
{
	uint8_t i;
	uint8_t TempeMiddle=60;
	int16_t Temperature;
    uint32_t resis;
	resis = (uint32_t)(VCC-getdata)*REF_RES_VAL/getdata; //计算热敏电阻的阻值
//  printf("Tempcalcu = %d\r\n",Tempcalcu);
	if(resis >= NTC[0])                       
	{
		Temperature = -300;			
	}
	else if(resis <= NTC[120])
	{
		Temperature = 900;
	}
	else
	{
		i = TempeMiddle;                           
		if(resis > NTC[i])
		{
			for(i=TempeMiddle-1; i>=0; i--)
			{
				if(resis <= NTC[i])                //NTC[i+1] < resis < NTC[i]
				{
					break;
				}
			}
		}
		else
		{
			for(i=TempeMiddle+1; i<120; i++)
			{
				if(resis > NTC[i])                 //NTC[i-1] < resis < NTC[i]
				{
					break;
				}
			}
			i--;
		}
		TempeMiddle = i; 
		
		Temperature = (uint16_t)(TempeMiddle-30)*10+(NTC[i]-resis)*10/(NTC[i]-NTC[i+1]);	
	}
	return Temperature;	 
}

void Get_Temperature(void)
{	
      float Temp1,Temp2;
	  Voltage_Samples(ADC_CHANNEL_2);
	  Voltage_Samples(ADC_CHANNEL_3);
      Temp1= CalcuTemp(NTC1_VOLT)/10.0;		
	  Temp2= CalcuTemp(NTC2_VOLT)/10.0;		
	  printf("Temp1 = %.1f℃\r\n",Temp1);
	  printf("Temp2 = %.1f℃\r\n",Temp2);
}

到了这里,关于单片机测量NTC热敏电阻温度的方法(含程序代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SMD NTC Thermistor NTC热敏电阻产品基本参数定义

    热敏电阻器(Thermistor)是一种电阻值对温度极为灵敏的半导体元件,温度系数可分为Positive Temperature Coefficient   正温度系数热敏电阻又称PTC热敏电阻和Negative Temperature Coefficient  负温度系数热敏电阻又称NTC热敏电阻. NTC热敏电阻用于温度测量,温度控制,温度补偿等,称为温

    2024年01月16日
    浏览(45)
  • 热敏电阻NTC103、PT100温度计算公式

    NTC 热敏电阻温度计算公式:Rt = R *EXP(B*(1/T1-1/T2))         (1) T1和T2指的是K度,即开尔文温度。         (2) Rt 是热敏电阻在T1温度下的阻值。         (3) R是热敏电阻在T2常温下的标称阻值。10K的热敏电阻25℃的值为10K(即R=10K)。         (4) T2 = (273.15+25)。         (

    2024年02月06日
    浏览(48)
  • 功率型热敏电阻(NTC)的主要参数及深入介绍

          RT指在规定温度 T 时,采用引起电阻值变化相对于总的测量误差来说可以忽略不计的测量功率测得的电阻值。       这个被包含于上一条,要理解清楚。也叫标称电阻值,根据国标规定,NTC热敏电阻器在25℃环境温度中所测得的零功率电阻值并标志在热敏电阻器上面。

    2024年02月11日
    浏览(47)
  • 使用 STM32 读取和解析 NTC 热敏电阻的数值

    本文介绍了如何利用 STM32 微控制器读取和解析 NTC(Negative Temperature Coefficient)热敏电阻的数值。 首先,我们将简要介绍 NTC 热敏电阻的原理和特性。接下来,我们将详细讨论如何设计电路连接和采用合适的 STM32 外设进行数值读取。然后,我们将介绍如何进行温度解析和校准

    2024年02月04日
    浏览(44)
  • STM32 热敏电阻NTC的软件设计(ADC采集)

    目录   前言 一、查表函数 二、ADC采集        三、查表 四、数据滤波 记录一些我在工作和学习过程中遇到的问题。 NTC:在淘宝随便买的 单片机型号:STM32G030C8T6 目的:用单片机采集NTC温度 代码是小学生水平!         电路设计可以参考https://blog.csdn.net/qq_45217932/article/d

    2024年02月13日
    浏览(38)
  • 51单片机简易电阻测量仪仿真设计

    51单片机简易电阻测量仪仿真设计( proteus仿真+程序+报告+讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0037 基于51单片机的简易电阻测量仪仿真设计( proteus仿真+程序+报告+讲解视频) 单片机最小系统,或者称为 最小应用系统,是指用最

    2023年04月26日
    浏览(50)
  • 51单片机简易电阻电感电容RLC测量仪仿真设计

    51单片机简易电阻电感电容RLC测量仪仿真( proteus仿真+程序+讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0040 单片机最小系统,或者称为 最小应用系统,是指用最少的元件组成的单片机可以工作的系统。对51系列单片机来说,最小系统

    2024年02月04日
    浏览(72)
  • 【GUI】使用PID控制器进行台式过程控制实验,以保持热敏电阻的温度(Matlab代码实现)

    目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码、操作说明 本实验是温度控制的反馈控制应用。特别是,本实验讲解: 手动和自动控制的区别 生成动态数据的 步进测试 拟合动态数据以构建简单的一阶加死区时间 (FOPDT) 模型 从标准调整规则 获取 PID 控制的 参数

    2024年02月15日
    浏览(50)
  • 学习笔记|ADC|NTC原理|测温程序|STC32G单片机视频开发教程(冲哥)|第十九集:ADC应用之NTC

    NTC(Negative Temperature Coefficient)是指随温度上升电阻呈指数关系减小、具有负温度系数的热敏电阻现象和材料。该材料是利用锰、铜、硅、钴、铁、镍、锌等两种或两种以上的金属氧化物进行充分混合、成型、烧结等工艺而成的半导体陶瓷,可制成具有负温度系数(NTC)的热

    2024年02月07日
    浏览(59)
  • 定量分析计算51单片机复位电路工作原理 怎么计算单片机复位电容和电阻大小

    下面画出等效电路图  可以知道单片机内必然有一个电阻RX,为了简化分析,我们假设他是线性电阻(不带电容,电感的支路) 还有一个基础知识: 电容器的充电放电曲线: 还需要知道电容电压的变化是连续的,(高数知识)无法跳变。 一个很大的误区就是认为电容一上电

    2024年02月12日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包