技术专栏
获取STM32芯片内部的温度来监控设备状态
1.前言
2.查询手册找到ADC采集通道
3.程序实现
4.实验结果
- 1
- 2
- 3
- 4
- 5
- 6
- 7
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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
<
4.实验结果
这样得到当前的温度数据,
可以通过温度数据大致判断设备运行情况
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包
93
收藏
评论
打赏
- 分享
- 举报
评论
0个
手气红包

相关专栏
-
浏览量:3107次2022-08-04 15:07:03
-
浏览量:2127次2020-08-03 11:21:38
-
2020-08-11 11:58:23
-
浏览量:11969次2020-11-19 14:50:49
-
浏览量:9997次2020-11-25 11:41:22
-
浏览量:1981次2020-08-03 11:18:53
-
浏览量:3136次2020-11-21 16:48:04
-
浏览量:1349次2023-07-14 21:50:29
-
2020-07-11 17:58:22
-
浏览量:3066次2020-11-16 09:27:48
-
浏览量:2205次2019-11-18 14:31:41
-
浏览量:5083次2021-08-06 11:11:40
-
浏览量:3164次2020-11-19 09:43:25
-
浏览量:851次2023-04-20 08:54:12
-
浏览量:817次2023-12-11 16:42:16
-
浏览量:1779次2020-11-12 10:53:19
-
浏览量:1891次2019-06-27 15:56:35
-
浏览量:3135次2024-01-26 14:25:57
-
浏览量:2475次2019-11-11 10:00:06
置顶时间设置
结束时间
删除原因
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
打赏作者
free-jdx
您的支持将鼓励我继续创作!
打赏金额:
¥1

¥5

¥10

¥50

¥100

支付方式:

举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
审核成功
发布时间设置
发布时间:
请选择发布时间设置
是否关联周任务-专栏模块
审核失败
失败原因
请选择失败原因
备注
请输入备注