STM32:探索内部温度传感器实验

内部温度传感器框图

具体介绍:

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初始化代码

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

物联沃分享整理
物联沃-IOTWORD物联网 » STM32:探索内部温度传感器实验

发表评论