STM32CUBEMX_DMA_ADC读取NTC温度

该文描述了一个基于STM32CUBEMX的项目,通过配置DMA和ADC来读取NTC热敏电阻的温度。程序首先设置时钟和下载引脚,然后配置ADC采样和DMA传输。接着,利用ADC转换结果和预定义的NTC电阻-温度对照表计算出当前温度。在主循环中,不断读取并显示NTC电阻对应的温度值。
摘要由CSDN通过智能技术生成

STM32CUBEMX_DMA_ADC读取NTC温度

1、新建工程,配置时钟和下载引脚
在这里插入图片描述
在这里插入图片描述
2、配置ADC采样
在这里插入图片描述
3、配置DMA
在这里插入图片描述
4、时钟配置
在这里插入图片描述
5、NTC热敏电阻的对照表格
在这里插入图片描述

#define ADC_LEN 10
//注意:adc_value[0]、adc_value[2]、adc_value[4]、adc_value[6]、adc_value[8]采集是CH8通道
//注意:adc_value[1]、adc_value[3]、adc_value[5]、adc_value[7]、adc_value[9]采集是CH9通道
unsigned int adc_value[ADC_LEN] = {0};
#define ADC_BIT_12 4096	//ADC精度
#define ADC_PULL_UP_R 10000	//ntc电路中上拉电阻值
#define ADC_TABLE_LEN (sizeof(X_Temp)/sizeof(X_Temp[0]) == sizeof(Y_Res)/sizeof(Y_Res[0]) ? sizeof(X_Temp)/sizeof(X_Temp[0]) : 0)
//温度表
unsigned int X_Temp[] = {-40,-35,-30,-25,-20,-15,-10,-5,0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125};
//和温度表对应的阻值表
unsigned int Y_Res[] = {195652,148171,113347,87559,68237,53650,42506,33892,27219,22021,17926,14674,12081,10000,8315,6948,5834,4917,4161,3535,3014,2586,2228,1925,1669,1452,1268,1110,974,858,758,672,596,531};


unsigned int ntc_adc_read(void)	//采集两通道的值做均值计算
{
	unsigned int adc = 0;
	for(int i = 0;i < ADC_LEN;i++)
	{
		adc += adc_value[i];
	}
	adc = adc/ADC_LEN;
	return adc;
}

unsigned int ntc_count_r(void)
{
	unsigned int ntc_r;
	unsigned int adc;
	adc = ntc_adc_read();
	ntc_r = (ADC_PULL_UP_R*adc)/(ADC_BIT_12-adc);
	return ntc_r;
}

float ntc_build_equation(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2,unsigned int Unkown_x,unsigned int Unkown_y)
{
	float k = 0;
	float b = 0;
	
	k = ((float)y1-(float)y2)/((float)x1-(float)x2);
	b = (float)y1-(float)x1*k;
	
	if(0 == Unkown_x)
	{
		return ((float)Unkown_y-b)/k;
	}
	else
	{
		return ((float)Unkown_x*k+b); 
	}
}

float ntc_get_temp(unsigned int ntc_r)
{
	unsigned int start_point = 0;
	float temp_valve = 0;
	
	for(unsigned int loop = 0;loop < ADC_TABLE_LEN;loop++)
	{
		if(ntc_r > Y_Res[loop])
		{
			start_point = loop;
			break;
		}
	}
	temp_valve = (float)ntc_build_equation(X_Temp[start_point],Y_Res[start_point],X_Temp[start_point+1],Y_Res[start_point+1],0,ntc_r);
 
	return temp_valve;
}

void main(void)
{
	HAL_ADC_Start_DMA(&hadc1,adc_value,ADC_LEN);
	
	while(1)
	{
		Debug_printf("ntc_get_temp:%0.2f\r\n",ntc_get_temp(ntc_count_r()));
	}
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32 HAL库是STM32开发过程中常用的一个开发库,它为我们提供了很多方便的API,能够简化开发的流程,提高开发效率。其中,NTC热敏电阻是一种常用的温度传感器,其阻值随温度的变化而变化。本文将介绍如何使用STM32 HAL库来检测NTC温度。 首先,需要将NTC连接到STM32ADC采样引脚上,通常采用电压分压的方式将NTC输出的电压信号转换为0~3.3V的输入电压信号。接着,使用STM32 HAL库的ADC驱动程序进行ADC通道的配置和采样,采样完成后通过换算公式将ADC输出值转换为对应的温度值。 以下是详细步骤: 1. 配置ADC通道 在HAL库中,需要使用ADC_InitTypeDef结构体对ADC进行配置。首先,需要配置输入通道(即连接NTC的引脚),以及ADC分辨率、采样时间等参数。在配置完成后,使用HAL_ADC_Init函数将配置好的结构体作为参数传入,初始化ADC。 2. 启动ADC采样 调用HAL_ADC_Start函数,开始进行ADC采样。 3. 等待ADC采样结束 使用HAL_ADC_PollForConversion函数等待ADC采样完成。在函数返回后,通过HAL_ADC_GetValue函数获取ADC输出值。 4. 换算温度值 利用NTC的公式将ADC输出值转化为温度值。具体公式需要结合NTC的实际参数进行计算,这里不再赘述。 以上就是如何使用STM32 HAL库进行NTC温度检测的详细步骤。需要注意的是,在实际应用中,还需考虑到温度采样的精度、噪声等问题。但是,使用STM32 HAL库可以省去一部分驱动程序开发的工作量,同时也提高了代码的可读性和可维护性。 ### 回答2: STM32 HAL库是为STM32系列微控制器编写的一个高级API,该库提供了许多有用的函数和接口来简化硬件驱动程序的编写。在使用STM32 HAL库时,常常需要与温度检测器这样的传感器进行交互。其中一种常见的温度检测器是NTC(Negative Temperature Coefficient)热敏电阻。NTC的电阻随温度的变化而变化,这使得NTC常被用来测量温度。 首先,在HAL库中,需要使用ADC(Analog-to-Digital Converter)模块来读取NTC的阻值。可以使用HAL_ADC_XXX()函数来控制ADC模块,并与NTC电路相连接的引脚。 其次,在NTC检测温度时,需要根据NTC温度特性曲线求解。可以使用HAL库提供的数学函数库,例如sqrt()和pow(),来处理温度特性曲线,以产生正确的温度读数。 最后,在使用NTC时,需要考虑到NTC的电路失真和误差。可以采用校准技术和电路优化来降低误差和提高NTC检测温度的精确度。 总之,在使用STM32 HAL库检测NTC温度时,需要了解和掌握ADC模块的相关函数,以及数学函数库的应用,同时需要重视NTC电路的失真和误差的影响,并采取有效措施来提高温度检测的准确性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值