STM32热敏电阻NTC软件设计及ADC采集原理详解

目录

 

前言

一、查表函数

二、ADC采集       

三、查表

四、数据滤波


前言

记录一些我在工作和学习过程中遇到的问题。

NTC:在淘宝随便买的

单片机型号:STM32G030C8T6

目的:用单片机采集NTC温度

代码是小学生水平!

        电路设计可以参考https://blog.csdn.net/qq_45217932/article/details/127513686?spm=1001.2014.3001.5501

一、查表函数

        NTC就是随温度变化阻值变化的传感器,所以在硬件上只要计算出他现在是什么阻值就能得到他的温度了,什么阻值对应什么温度。也就是阻值随温度变化的对照表。我在淘宝随便买的随便问的,我买了两个型号反正RT表是大差不差,可以参考一下。

         得到RT表只是第一步,还要把你测量的温度范围对应的阻值打到软件上,这样才能形成这个表,纯手打的有没有打错我也没一个一个对比,反正用到现在也是没出错就对了。

#define NTCTABNum 251

float NTCTAB_2[NTCTABNum] = {
	32.660,31.040,29.500,28.060,26.680,25.400,24.180,23.020,21.920,20.880,  				//0   -  
	19.900,18.970,18.090,17.260,16.460,15.710,15.000,14.320,13.680,13.070,  				//10  -  19
	12.490,11.940,11.420,10.920,10.450,10.000,7.574 ,9.166 ,8.778 ,8.408 ,	 				//20  -  29
	8.058 ,7.722 ,7.404 ,7.098 ,6.808 ,6.532 ,6.268 ,6.016 ,5.776 ,5.546 ,					//30  -  39
	5.326 ,5.118 ,4.918 ,4.726 ,4.544 ,4.368 ,4.202 ,4.042 ,3.888 ,3.742 ,					//40  -  49
	3.602 ,3.468 ,3.340 ,3.216 ,3.098 ,2.986 ,2.878 ,2.774 ,2.674 ,2.580 ,					//50  -  59
	2.488 ,2.400 ,2.316 ,2.234 ,2.158 ,2.082 ,2.012 ,1.942 ,1.876 ,1.813 ,					//60  -  69
	1.751 ,1.693 ,1.637 ,1.582 ,1.530 ,1.480 ,1.432 ,1.385 ,1.341 ,1.289 ,					//70  -  79
	1.256 ,1.216 ,1.178 ,1.141 ,1.105 ,1.071 ,1.038 ,1.006 ,0.975 ,0.9452,					//80  -  89
	0.9164,0.8888,0.862 ,0.8364,0.8114,0.7874,0.7642,0.7418,0.7202,0.6994,					//90  -  99
};

二、ADC采集       

        在介绍采集之前,我想说一下关于ADC+DMA,我想大家大部分都是用的这个采集的,我现在还是会用的阶段。我就简单说下我的理解吧,ADC全称Analog-to-Digital Converter,模数转换器顾名思义将模拟量转换成数字量,在这里就是我们采集到的温度(模拟量)经过单片机的ADC转换成0和1的数字量进行数据分析。

        而DMA全称Direct Memory Access,直接储存器访问,在这里配合ADC实现了将ADC采集到的数据通过DMA传输到指定的内存空间,我们程序直接访问这个内存空间就可以得到想要的数据了。这个挺重要的哦,新手不知道怎么配置移步百度一下先,后面我把他了解透透了也会出一个ADC+DMA的博文的。

        好的,那么我们保证ADC+DMA配置顺利,要准备开始采集了 。关于NTC的采集硬件设计在我之前的博文有更过大家可以参考一些,今天主要介绍软件设计。

        来!ADC采集数据,并转换成电阻

/***********************************************************************
功  能:将ADC采到的值转换成电阻
参  数:channel:指定的ADC通道
返回值:电阻值
*************************************************************************/
float GetResValue(void)
{
	
	HAL_ADCEx_Calibration_Start(&hadc1);  
	HAL_ADC_Start_DMA(&hadc1, (uint32_t*)ADC_Value, 1);  //开启ADC DMA传输 

    float 	adc_v,res;
	adc_v 	= (float)(ADC_Value[0]&0xFFF)*3.275/4096;  //将采集到值转换成电压
	res 	= 10 /( 4.096/adc_v - 1);	//电压转换成电阻
	return res;
}

三、查表

得到电阻值就可以对照查温度了:

/***********************************************************************
功  能:查表函数
参  数:1.tableNum :表格的元素的个数  
		2.*p:表格
返回值:当前阻值下的温度值
*************************************************************************/

float GetADCTemperature(float *p,uint8_t tableNum)
{
	uint8_t	i,index	= 0;
	float v1,v2,v3;
	float tem;
	float resdata;
	resdata = GetResValue();  //电阻值
    /*查表*/
	for(i=0;i<(tableNum-1);i++)  
	{
		if((resdata<p[i]) && (resdata>p[i+1]))
			index = i;	
	}
	v1 	= p[index] - resdata;
	v2 	= p[index] - p[index+1];
	v3 	= v1/v2;
	tem = v3+index;

	return tem;
}

四、数据滤波

        滤波还是很有必要的,我用的是比较传统的滤波方式:掐头去尾取平均值。经过滤波和不经过滤波数据还是区别蛮大的。


/***********************************************************************
功  能:掐头去尾取平均值
参  数:无  
返回值:平均值

*************************************************************************/
#define NUM 30
#define NTCTABNum 102   //表内数据个数
int	ave_temp1[NUM+1];

int GetMedian_Temperature(void)
{
	int i,j;
	int tmp;
    int ave_temp;
	uint32_t    sum1=0;
	for(i=0;i<NUM;i++)
	{
		ave_temp1[i] = GetADCTemperature(NTCTAB_1,NTCTABNum)*10;      //将测得的温度值放大10倍存在int型数组中,方便后面上传有人云
//		HAL_Delay(100);
	}

	for(i=0;i<NUM-1;i++)		//排序
	{
		for(j=0;j<(NUM)-i;j++)
		{
			if(ave_temp1[j]<ave_temp1[j+1])
			{
				tmp 			= ave_temp1[j];
				ave_temp1[j] 	= ave_temp1[j+1];
				ave_temp1[j+1] 	= tmp;
			}
		}
	}

	for(i=5;i<NUM-5;i++)	//掐头去尾取平均值
	{
		sum1 += ave_temp1[i];
	}
	ave_temp = sum1/(NUM-10); 
	
	return ave_temp;
}

        我的数据最后是需要上云的,所以对数据要求有些特殊,大家如果也有特殊的显示就要考虑数据的格式了。

物联沃分享整理
物联沃-IOTWORD物联网 » STM32热敏电阻NTC软件设计及ADC采集原理详解

发表回复