获取STM32芯片内部的温度来监控设备状态

free-jdx 2021-08-06 10:08:01 4937

1.前言

2.查询手册找到ADC采集通道

3.程序实现

4.实验结果
1.前言

一般用MCU开发产品时
MCU设备运行状态与之温度有一定的关联

像我们常用的STM32系列的单片机
内部都自带一个温度测试功能
可以测试芯片当前的温度
也可以用它来测量芯片周围的温度

今天通过串口把MCU的温度数据打印的电脑上
实际上STM32F103内部的温度传感器,
是通过ADC采集一个热敏电阻来计算当前温度

2.查询手册找到ADC采集通道

(1)该温度传感器在MCU内部实际与ADCx_IN16输入通道相连接

(2)STM32的内部温度传感器支持的温度范围为:-40~125度。精度比较差,为±1.5℃左右

(3)该温度传感器实际产生是一个随温度线性变化的电压,转换范围在2V < VDDA < 3.6V之间,与实际温度通过公式进行换算

3.程序实现
/*STM32内部温度传感器实验,芯片温度通过上位机串口软件显示*/
#include"stm32f10x.h"
#include"sys.h"
#include"usart.h"
#include"adc_temp.h"
void SysTick_Init(u8 SYSCLK); //SysTick初始化函数声明
void delay_ms(u16 nms);      //自定义的延时毫秒函数声明
u8 fac_us=0;
u16 fac_ms=0;

void RCC_Configuration(void);  //时钟配置函数声明
void GPIO_Configuration(void); //GPIO端口初始化函数声明
void USART_Configuration(void);//串口初始化函数声明

int main(void)
{
       
        float temp=0;
        SysTick_Init(72);  // 调用SysTick初始化函数
         RCC_Configuration();

        GPIO_Configuration();
        USART_Configuration();
         ADC_Temp_Init();

  while(1)
        { temp=Get_Temperture();
                printf ("温度值 %.6f °C\r\n",((float)temp/100));
                delay_ms(1000);
       
         }

}

void  Adc_Init(void)
{    
    //Ïȳõʼ»¯IO¿Ú
    RCC->APB2ENR|=1<<2;   
    GPIOA->CRL&=0XFFFFFF0F;//PA1
    RCC->APB2ENR|=1<<9;    //ADC1  
    RCC->APB2RSTR|=1<<9;   //ADC1
    RCC->APB2RSTR&=~(1<<9);    
    RCC->CFGR&=~(3<<14);  
    RCC->CFGR|=2<<14;        
    ADC1->CR1&=0XF0FFFF;   //
    ADC1->CR1|=0<<16;      //
    ADC1->CR1&=~(1<<8);      
    ADC1->CR2&=~(1<<1);   
    ADC1->CR2&=~(7<<17);       
    ADC1->CR2|=7<<17;     
    ADC1->CR2|=1<<20;    
    ADC1->CR2&=~(1<<11);  
    ADC1->CR2|=1<<23;     
    ADC1->SQR1&=~(0XF<<20);
    ADC1->SQR1|=0<<20;         
    ADC1->SMPR2&=~(3*1); 
    ADC1->SMPR2|=7<<(3*1);
ADC1->SMPR1&=~(7<<3*6); 
    ADC1->SMPR1|=7<<(3*6); 
    ADC1->CR2|=1<<0;      
    ADC1->CR2|=1<<3;      
    while(ADC1->CR2&1<<3);               
    ADC1->CR2|=1<<2;        
    while(ADC1->CR2&1<<2); 
}                 

u16 Get_Adc(u8 ch)   
{
    //ÉèÖÃת»»ÐòÁÐ           
    ADC1->SQR3&=0XFFFFFFE0;//¹æÔòÐòÁÐ1 ͨµÀch
    ADC1->SQR3|=ch;                     
    ADC1->CR2|=1<<22;       //Æô¶¯¹æÔòת»»Í¨µÀ 
    while(!(ADC1->SR&1<<1));//µÈ´ýת»»½áÊø         
    return ADC1->DR;        //·µ»ØadcÖµ 
}

void ADC_Temp_Init()
{ 
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//使能ADC1时钟

RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置ADC时钟为12M  72/6
ADC_DeInit(ADC1);

ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//ADC工作模式:ADC1工作在独立模式
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数据右对齐
ADC_InitStructure.ADC_NbrOfChannel=1;//顺序进行规则转换的ADC通道的数目

ADC_Init(ADC1,&ADC_InitStructure);        //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器

       
       
        ADC_TempSensorVrefintCmd(ENABLE);
        ADC_Cmd(ADC1,ENABLE);//使能ADC1

ADC_ResetCalibration(ADC1);//复位ADC1的校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1的校准寄存器复位

ADC_StartCalibration(ADC1);//开始ADC1自校准
while(ADC_GetCalibrationStatus(ADC1));//等待ADC1自校准完成

}

u16 Get_ADC_Temp_Value(u8 ch,u8 times)
{ u8 t;
  u32 temp_val=0;
  ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5);
   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(20);
  }
        return temp_val/times;//返回AD转换的平均值
       
}
float Get_Temperate(void)   //获取内部温度传感器温度值
{
    int ADC_ConvertedValue;//用来存储ADC转换出来的值,单位是mV
    float Current_Temp;
    ADC_ConvertedValue = (int)T_Get_ADC_Average(20);    //20次取平均
    ADC_ConvertedValue = (ADC_ConvertedValue*825)>>10;//(ADC_ConvertedValue*825)>>10 表示 ADC_ConvertedValue*3300/4096
    Current_Temp = (((1370-ADC_ConvertedValue)/4.35)+25);   //转换为温度值     
    return Current_Temp;
}
4.实验结果

这样得到当前的温度数据,
可以通过温度数据大致判断设备运行情况

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
free-jdx
红包 93 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
free-jdx
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区