锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

STM32芯片内部温度监控调试记录

时间:2022-08-25 09:00:00 传感器监控芯片

1.前言

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

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

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

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

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

(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) {         //?è3?è3?ê??ˉ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)    {     //éè???×a??DòáD                ADC1->SQR3&=0XFFFFFFE0;//1??òDòáD1 í¨μàch     ADC1->SQR3|=ch;                          ADC1->CR2|=1<<22;       //???ˉ1??ò×a??í¨μà      while(!(ADC1->SR&1<<1));//μè′y×a???áê?              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时钟为12M72/6 ADC_DeInit(ADC1);  ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//ADC工作模式:ADC在独立模式下工作 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);//复位ADC校准寄存器1 while(ADC_GetResetCalibrationStatus(ADC1);//等待ADC校准寄存器1复位  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>10;//(ADC_ConvertedValue*825)>>10 表示 ADC_ConvertedValue*3300/4096
    Current_Temp = (((1370-ADC_ConvertedValue)/4.35)+25);   //转换为温度值     
    return Current_Temp;
}

4.实验结果

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

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章