1.STM32内部温度传感器介绍:
- 内部温度传感器支持的温度范围为:-40~125度,精度为±1.5℃左右;
- T(℃)={(V25-Vsense)/Avg_Slope}+25;
- STM32的内部温度传感器是直接连接在ADC内部输入通道,在ADC1通道16连接的内部温度传感器;
- V25的标准值是1.43V,Avg_Slope=4.3mv/℃;
2.内部温度传感器配置步骤:
ADC相关库函数在stm32f10x_adc.c和stm32f10x_adc.h文件中;
- 初始化ADC_IN16相关参数,开启内部温度传感器:ADC_TempSensorVrefintCmd(ENABLE);
- 读取ADC_IN16 AD值,将其转换为对应温度;
3.内部温度传感器实验:
功能实现:通过芯片内部温度传感器读取温度,将读取的温度数据通过串口打印出来,LED0指示灯闪烁提示系统正常运行。
(1)主函数:
#include "delay.h"
#include "led.h"
#include "usart1.h"
#include "inner_temp.h"
int main(){
u8 i=0;
int temp=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置分组
delay_init(); //延时初始化
LED_Init();
usart1_Init(9600); //串口通信初始化
ADC_TEMP_Init(); //内部温度传感器初始化
while(1)
{
i++;
if(i%20==0)
{
LED0=!LED0;
}
delay_ms(10);
if(i%100==0) //1s
{
temp=Get_Temperture(); //读取温度
if(temp>=0) //温度为正
{
printf("内部温度传感器检测值:+");
}
else if(temp<0) //温度为负
{
printf("内部温度传感器检测值:-");
}
printf("%.2f ℃\r\n",(float)temp/100); //温度的值
printf("\r\n");
}
}
}
(2)头文件:
#ifndef __INNER_TEMP_H
#define __INNER_TEMP_H
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
void ADC_TEMP_Init(void); //初始化内部温度传感器
u16 Get_ADC_Temp_Value(u8 ch,u8 times); //读取ADC的电压值
int Get_Temperture(void); //读取温度
#endif
(3)内部温湿度传感器功能函数:
#include "stm32f10x.h"
#include "delay.h"
#include "inner_temp.h"
/*
功能:内部温度传感器初始化
变量:无
返回值:无
*/
void ADC_TEMP_Init(void)
{
ADC_InitTypeDef ADC_InitStruct;
//1.使能ADC时钟;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
//2.设置ADC的分频因子
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
//3.开启内部温度传感器
ADC_TempSensorVrefintCmd(ENABLE);
//4.初始化ADC参数
ADC_InitStruct.ADC_ContinuousConvMode=DISABLE; //不连续转换
ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right; //对齐方式->右对齐
ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None; //不使用外部触发,使用软件触发
ADC_InitStruct.ADC_Mode=ADC_Mode_Independent; //独立模式
ADC_InitStruct.ADC_NbrOfChannel=1; //通道数量->1
ADC_InitStruct.ADC_ScanConvMode=DISABLE; //不扫描
ADC_Init(ADC1,&ADC_InitStruct);
//5.使能ADC校准
ADC_Cmd(ADC1,ENABLE); //使能ADC1
ADC_ResetCalibration(ADC1); //开启复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); //判断复位校准是否完成,完成则结束循环
ADC_StartCalibration(ADC1); //开启校准
while(ADC_GetCalibrationStatus(ADC1)); //判断开启校准是否完成,完成则结束循环
//6.开启软件触发
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
}
/*
功能:读取ADC的电压值
变量:ch:通道 times:采集次数
*/
u16 Get_ADC_Temp_Value(u8 ch,u8 times)
{
u8 i=0;
u16 temp_val=0;
//设置ADC规则通道
ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5); //ADC选择、通道、通道数量、采样周期
//读取ADC的值
for(i=0;i<times;i++)
{
ADC_SoftwareStartConvCmd(ADC1,ENABLE); //开启软件触发,因为使用的是单次转换因此每次转换都需要开启
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)); //判断规则组是否转换完成
temp_val+=ADC_GetConversionValue(ADC1);
delay_ms(10);
}
return temp_val/times; //对返回的数据进行滤波
}
/*
功能:读取温度
变量:无
返回值:读取的温度
*/
int Get_Temperture()
{
u16 adc_value=0; //存储获取到的ADC值
float temp_val=0.0f; //存储电压值
float temperture=0.0f; //
int temp=0;
adc_value=Get_ADC_Temp_Value(ADC_Channel_16,20); //获取ADC的值
temp_val=(float)adc_value*(3.3/4096); //将ADC值转换为电压值
temperture=(1.43-temp_val)/0.0043+25; //将电压值转换为温度值
temp=temperture*100; //将温度放大100倍
return temp;
}
(4)实验结果: