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.实验结果
这样得到当前的温度数据, 可以通过温度数据大致判断设备运行情况