糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > STM32芯片内部温度监控调试记录

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

时间:2019-12-22 00:11:44

相关推荐

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

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;//PA1RCC->APB2ENR|=1<<9; //ADC1 RCC->APB2RSTR|=1<<9; //ADC1RCC->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 ͨµÀchADC1->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时钟为12M72/6ADC_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);//使能ADC1ADC_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转换出来的值,单位是mVfloat Current_Temp;ADC_ConvertedValue = (int)T_Get_ADC_Average(20); //20次取平均ADC_ConvertedValue = (ADC_ConvertedValue*825)>>10;//(ADC_ConvertedValue*825)>>10 表示 ADC_ConvertedValue*3300/4096Current_Temp = (((1370-ADC_ConvertedValue)/4.35)+25); //转换为温度值return Current_Temp;}

4.实验结果

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

如果觉得《STM32芯片内部温度监控调试记录》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。