STM32-ADC内部温度

发布于:2025-07-12 ⋅ 阅读:(19) ⋅ 点赞:(0)

 在通道16无引脚(测量温度不准确)

跟ADC代码差不多;不需要使能引脚时钟;将内部温度测量打开

/**
  * @brief  启用或禁用温度传感器和内部参考电压功能
  * @param  NewState: 新的功能状态,取值为ENABLE或DISABLE
  * @retval 无
  * @note   温度传感器用于测量芯片温度
  * @note   内部参考电压用于提供稳定的参考电压值
  */
void ADC_TempSensorVrefintCmd(FunctionalState NewState)

 将通道改为通道16

代码如下:

#include "adc_temp.h"
#include "SysTick.h"

/*******************************************************************************
* 函 数 名         : ADC_Temp_Init
* 函数功能		   : ADC_Temp初始化函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void ADC_Temp_Init(void)
{	
	ADC_InitTypeDef       ADC_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
	
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //分频因子6时钟为72M/6=12MHz
	
	ADC_TempSensorVrefintCmd(ENABLE);//打开ADC内部温度传感器
	
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;	//ADC工作模式:ADC1和ADC2工作在独立模式
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式	
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//禁止触发检测,使用软件触发
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐	
	ADC_InitStructure.ADC_NbrOfChannel = 1;	//1个转换在规则序列中 也就是只转换规则序列1 
	ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化
	
	ADC_Cmd(ADC1, ENABLE);//开启AD转换器
	
	ADC_ResetCalibration(ADC1);//重置指定的ADC的校准寄存器
	while(ADC_GetResetCalibrationStatus(ADC1));//获取ADC重置校准寄存器的状态
	
	ADC_StartCalibration(ADC1);//开始指定ADC的校准状态
	while(ADC_GetCalibrationStatus(ADC1));//获取指定ADC的校准程序

	ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能或者失能指定的ADC的软件转换启动功能
}

/*******************************************************************************
* 函 数 名         : Get_ADC_Temp_Value
* 函数功能		   : 获取通道ch的转换值,取times次,然后平均 	
* 输    入         : ch:通道编号
					 times:获取次数
* 输    出         : 通道ch的times次转换结果平均值
*******************************************************************************/
u16 Get_ADC_Temp_Value(u8 ch,u8 times)
{
	u32 temp_val=0;
	u8 t;
	//设置指定ADC的规则组通道,一个序列,采样时间
	ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);	//ADC1,ADC通道,239.5个周期,提高采样时间可以提高精确度
	for(t=0;t<times;t++)
	{
		ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能指定的ADC1的软件转换启动功能	
		while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
		temp_val+=ADC_GetConversionValue(ADC1);
		delay_ms(5);
	}
	return temp_val/times;
} 

/*******************************************************************************
* 函 数 名         : Get_Temperture
* 函数功能		   : 获取温度值 	
* 输    入         : 无
* 输    出         : 温度值(扩大了100倍,单位:℃)
*******************************************************************************/
int Get_Temperture(void)
{
	u32 adc_value;
	int temp;
 	float temperture;
	adc_value=Get_ADC_Temp_Value(ADC_Channel_16,10);	//读取通道16内部温度传感器通道,10次取平均
	temperture=(float)adc_value*(3.3/4096);		//电压值
	temperture=(1.43-temperture)/0.0043+25; //转换为温度值 
	temp=temperture*100;					//扩大100倍.
	return temp;
}

主函数代码

#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart1.h"
#include "adc_temp.h"


/*******************************************************************************
* 函 数 名         : main
* 函数功能		   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
int main()
{
	u8 i=0;
	int temp=0;
	
	SysTick_Init(72);
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组
	LED_Init();
	USART1_Init(115200);
	ADC_Temp_Init();
	
	while(1)
	{
		i++;
		if(i%20==0)
		{
			LED1=!LED1;
		}
		
		if(i%50==0)
		{
			temp=Get_Temperture();
			if(temp<0)
			{
				temp=-temp;
				printf("内部温度检测值为:-");
			}
			else
			{
				printf("内部温度检测值为:+");
			}
			printf("%.2f°C\r\n",(float)temp/100);
		}
		delay_ms(10);	
	}
}


网站公告

今日签到

点亮在社区的每一天
去签到