目录
前言
一、查表函数
二、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;
}
四、数据滤波
滤波还是很有必要的,我用的是比较传统的滤波方式:掐头去尾取平均值。经过滤波和不经过滤波数据还是区别蛮大的。文章来源:https://www.toymoban.com/news/detail-534311.html
/***********************************************************************
功 能:掐头去尾取平均值
参 数:无
返回值:平均值
*************************************************************************/
#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;
}
我的数据最后是需要上云的,所以对数据要求有些特殊,大家如果也有特殊的显示就要考虑数据的格式了。文章来源地址https://www.toymoban.com/news/detail-534311.html
到了这里,关于STM32 热敏电阻NTC的软件设计(ADC采集)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!