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.实验结果
这样得到当前的温度数据, 可以通过温度数据大致判断设备运行情况
免责声明:文章内容来自互联网,本站不对其真实性负责,也不承担任何法律责任,如有侵权等情况,请与本站联系删除。
转载请注明出处:获取STM32芯片内部的温度来监控设备状态 https://www.yhzz.com.cn/a/11733.html