19.内部温度传感器

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文件中;
  1. 初始化ADC_IN16相关参数,开启内部温度传感器:ADC_TempSensorVrefintCmd(ENABLE);
  2. 读取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)实验结果:

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jhan&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值