技术专栏
获取STM32芯片内部的温度来监控设备状态
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.实验结果
这样得到当前的温度数据,
可以通过温度数据大致判断设备运行情况
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包
93
收藏
评论
打赏
- 分享
- 举报
评论
0个
手气红包
暂无数据
相关专栏
-
浏览量:2952次2022-08-04 15:07:03
-
浏览量:1978次2020-08-03 11:21:38
-
2020-08-11 11:58:23
-
浏览量:9840次2020-11-25 11:41:22
-
浏览量:11707次2020-11-19 14:50:49
-
浏览量:1857次2020-08-03 11:18:53
-
浏览量:2992次2020-11-21 16:48:04
-
浏览量:1155次2023-07-14 21:50:29
-
2020-07-11 17:58:22
-
浏览量:2944次2020-11-16 09:27:48
-
浏览量:2025次2019-11-18 14:31:41
-
浏览量:3058次2020-11-19 09:43:25
-
浏览量:4963次2021-08-06 11:11:40
-
浏览量:694次2023-04-20 08:54:12
-
浏览量:659次2023-12-11 16:42:16
-
浏览量:1773次2019-06-27 15:56:35
-
浏览量:1683次2020-11-12 10:53:19
-
浏览量:2137次2024-01-26 14:25:57
-
浏览量:2628次2022-11-10 10:02:57
置顶时间设置
结束时间
删除原因
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
打赏作者
free-jdx
您的支持将鼓励我继续创作!
打赏金额:
¥1
¥5
¥10
¥50
¥100
支付方式:
微信支付
打赏成功!
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
审核成功
发布时间设置
发布时间:
请选择发布时间设置
是否关联周任务-专栏模块
审核失败
失败原因
请选择失败原因
备注
请输入备注