内部温度传感器框图
具体介绍:
1、STM32F40X有一个内部的温度传感器,可以用来测量CPU及周围的温度(TA)。
2、该温度传感器在内部和ADCx_IN16(F40xx/F41xx)或者ADCx_IN18(F42xx/F43xx)输入通道相连接,此通道把传感器输出的电压转换成数字值。
3、温度传感器模拟输入推荐采样时间是17.1μs。
4、STM32的内部温度传感器支持的温度范围为:-40~125°C。精度比较差,为±1.5°C左右。
内部温度传感器更适合于检测温度的变化,而不是测量绝对温度。如果需要测量绝对温度,应该使用一个外部温度传感器。(主要是测量温度变化,而不是准确的温度值)
内部温度传感器使用注意事项:
第一个地方,我们要使用STM32F4的内部温度传感器,必须先激活ADC的内部通道,这里通过ADC_CCR的TSVREFE位(bit32)设置。设置该位为1,则启用内部温度传感器。
第二个地方,STM32F407的内部温度传感器固定的连接在ADC通道16上,所以,我们在设置好ADC之后只要读取通道16的值,就是温度传感器返回来的电压值。根据这个值,我们可以计算当前的温度。计算公式如下:
上式中:
V25=Vsense在25度时的数值(典型值为:0.76)。
Avg_Alope=温度与Vsense曲线的平均斜率(单位为mv/°C或uv/°C)(典型值为2.5Mv/°C)。
利用以上公式,我们就可以方便的计算出当前温度传感器的温度。
内部温度传感器温度和电压关系图
开启内部温度传感器步骤:
1、选择ADC_IN16或者ADC_IN16输入通道。
2、设置采样时间大于17.1μs。
3、设置ADC_CCR的TSVREFE位,打开内部温度传感器。
4、设置ADC_CR2的SWATART位启动转换。
5、读取ADC结果。
6、计算。
为巩固基础,再写一遍ADC初始化代码文章来源:https://www.toymoban.com/news/detail-535073.html
void Adc_Init(void)
{
GPIO_InitTypeDef GPIO_InitABC;
//GPIO初始化
GPIO_InitABC.GPIO_Pin=GPIO_Pin_5;
GPIO_InitABC.GPIO_Mode=GPIO_Mode_AN;//模拟输入
GPIO_InitABC.GPIO_PuPd=GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOA,&GPIO_InitABC);//初始化
//时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//使能ADC1时钟
ADC_CommonlnitTypeDef ADC_CommonlnitABC;
ADC_InitTypeDef ADC_InitABC;
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);//ADC1复位
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);//复位结束
ADC_TempSensorVrefintCmd(ENABLE);//使能内部温度传感器
ADC_CommonlnitABC.ADC_Mode=ADC_Mode_Independent;//独立模式
ADC_CommonlnitABC.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles;//采样五个周期
ADC_CommonlnitABC.ADC_DMAAccessMode=ADC_DMAAccessMode_Disable;//DMA失能
ADC_CommonlnitABC.ADC_Prescaler=ADC_Prescaler_Div4;//分频系数为4,不要超过36M
ADC_Commonlnit(&ADC_CommonlnitABC);
ADC_InitABC.ADC_Resolution=ADC_Resolution_12b;//12位分辨率
ADC_InitABC.ADC_ScanConvMode=DISABLE;//非扫描模式
ADC_InitABC.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_None;//禁止触发检测,使用软件触发
ADC_InitABC.ADC_DataAlign=ADC_DataAlign_Right;//右对齐
ADC_InitABC.ADC_NbrOfConversion=1;//1个转换在规则序列中
ADC_Init(ADC1,&ADC_InitABC);
ADC_RegularChannelConfig(ADC1,ADC_Channel_5,1,ADC_SampleTime_480Cycles);//ADC5,ADC通道,4801个周期
ADC_RegularChannelConfig(ADC1,ADC_Channel_16,1,ADC_SampleTime_480Cycles);//ADC16,ADC通道,480个周期
ADC_Cmd(ADC1,ENABLE);//开启AD转换器
}
//获取ADC值的函数
u16 Get_Adc(u8 ch)
{
//设置指定ADC的规则组通道,一个序列,采样时间
ADC_RegualrChannelConfig(ADC1,ch,1,ADC_SampleTime_480Cycles);//ADC1,ADC通道,480个周期
ADC_SoftwareStartConv(ADC1);//使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//等待转换结束
return ADC_GetConversionValue(ADC1);//返回最近一次ADC1规则组的转换结果
}
//多次获取ADC通道的值,并求平均值以提高精度
u16 Get_Adc_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val+=Get_Adc(ch);//获取通道转换值
delays_ms(5);
}
return temp_val/times;
}
//得到温度值,返回温度值
short Get_Temprate(void)
{
u32 adcx;
short result;
double temperate;
adcx=Get_Adc_Average(ADC_Channel_16,10);//读取通道16内部温度传感器通道,10次取平均值
temperate=(float)adcx*(3.3/4096);//电压值
temperate=(temperate-0.76)/0.0025+25;//转换为温度值
result=temperate*=100;//扩大100倍
return result;
}
对于STM32F40X系列使用的温度传感器内部通道1~16文章来源地址https://www.toymoban.com/news/detail-535073.html
到了这里,关于STM32——内部温度传感器实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!