stm32内部温度传感器显示温度
stm32内部温度传感器显示温度
更多
在 STM32 微控制器中读取并显示内部温度传感器的温度,通常需要以下步骤(以标准外设库或 HAL 库为例)。请注意,这个传感器主要用于监测芯片结温的变化趋势,精度有限(典型误差在 ±1°C 到 ±5°C 之间),不适合做精确的温度测量。
以下是实现步骤和关键代码示例(使用 HAL 库):
-
使能相关时钟和功能:
- 使能 ADC 时钟。
- 使能内部温度传感器通道(通常连接到特定的 ADC 通道,如
ADC_CHANNEL_TEMPSENSOR或ADC_CHANNEL_16/ADC_CHANNEL_18,具体取决于系列)。 - 使能内部参考电压通道(
VREFINT,用于提高精度,可选但推荐)。
-
配置 ADC:
- 初始化 ADC 参数(分辨率、扫描模式、连续转换模式、触发源、数据对齐等)。
- 配置 ADC 通道。将温度传感器通道和(可选的)
VREFINT参考电压通道添加到 ADC 的转换序列中。 - 设置采样时间。温度传感器通道需要较长的采样时间(查阅芯片数据手册中的
t<sub>SAMP</sub>ST参数,通常建议 >= 10us)。对于VREFINT也建议较长的采样时间。
-
校准 ADC:
- 执行 ADC 校准(线性校准和偏移校准)。
-
启动 ADC 和温度传感器:
- 启动 ADC。
- 在 ADC 初始化后,需要单独启用内部温度传感器(通过设置
ADC_CCR寄存器中的TSVREFE位)。HAL库通常有对应的函数(如HAL_ADCEx_EnableVREFINT()或__HAL_ADC_ENABLE_TEMPSENSOR())。
-
读取 ADC 值:
- 启动 ADC 转换(单次或连续模式)。
- 等待转换完成标志。
- 读取温度传感器通道的原始 ADC 值 (
ADC_Value_Temp)。 - (可选)读取
VREFINT通道的原始 ADC 值 (ADC_Value_Vrefint)。
-
计算温度:
- STM32 数据手册会提供计算温度的公式和参数(通常在电气特性章节)。通用公式如下:
T (°C) = ((V<sub>SENSE</sub> - V<sub>25</sub>) / Avg_Slope) + 25V<sub>SENSE</sub>:温度传感器在实测温度下的电压值。V<sub>25</sub>:温度传感器在 25°C 时的电压值(典型值,单位:伏特 V)。Avg_Slope:温度传感器输出电压随温度变化的平均斜率(典型值,单位:mV/°C 或 V/°C)。
- 需要将读取到的原始 ADC 值转换为电压值:
V<sub>SENSE</sub> = (ADC_Value_Temp * V<sub>REF+</sub>) / ADC_ResolutionV<sub>REF+</sub>:ADC 的参考电压(通常等于VDDA引脚电压)。ADC_Resolution:ADC 的最大数值(例如,12位 ADC 是 4095,10位是 1023)。
- 关键点:
V<sub>REF+</sub>通常未知且可能波动。强烈推荐使用内部参考电压VREFINT来推算实际的V<sub>REF+</sub>:V<sub>REF+</sub> = (VREFINT_CAL * ADC_Resolution) / ADC_Value_VrefintVREFINT_CAL:芯片出厂时存储在系统存储器(特定地址)的VREFINT在 3.3V 和 30°C 下的校准值(单位:ADC 码值)。这个地址在数据手册或芯片头文件(如stm32f4xx.h中的VREFINT_CAL_ADDR)中定义。ADC_Value_Vrefint:实际读取到的VREFINT通道的 ADC 值。
- 最终计算步骤:
- 用
VREFINT计算实际V<sub>REF+</sub>。 - 用计算出的
V<sub>REF+</sub>将ADC_Value_Temp转换为V<sub>SENSE</sub>。 - 将
V<sub>SENSE</sub>、V<sub>25</sub>和Avg_Slope代入温度公式计算温度。
- 用
- 简化(如果 VDDA 稳定且已知,如 3.3V): 可以跳过
VREFINT测量,直接用设定的V<sub>REF+</sub>(如 3.3V)计算V<sub>SENSE</sub>,但精度会受VDDA波动影响。
- STM32 数据手册会提供计算温度的公式和参数(通常在电气特性章节)。通用公式如下:
-
显示温度:
- 将计算得到的浮点数温度值
T通过你选择的输出方式显示出来:- 串口 (UART): 使用
printf通过串口发送到 PC 终端(需要重定向_write函数)。 - 显示屏 (LCD/OLED): 调用相应的显示屏驱动库函数显示数值。
- 其他外设。
- 串口 (UART): 使用
- 将计算得到的浮点数温度值
重要提示:
- 查阅文档: 务必查阅你所使用的 具体 STM32 型号的数据手册 (Datasheet) 和 参考手册 (Reference Manual)。不同系列(F0, F1, F3, F4, F7, H7, L0, L1, L4, G0, G4 等)和型号的内部温度传感器参数(
V<sub>25</sub>,Avg_Slope)、连接的 ADC 通道号、启用方式(TSVREFE位)、VREFINT校准值地址等可能不同。 - 参数值:
V<sub>25</sub>和Avg_Slope是典型值,每个芯片有差异。如果需要更高精度,可能需要在已知温度下进行校准。 - 采样时间: 确保为温度传感器通道设置足够长的采样时间。
- 启用传感器: 不要忘记在 ADC 初始化后启用温度传感器(设置
TSVREFE位)。 VREFINT使用: 使用VREFINT来推算V<sub>REF+</sub>是提高测量精度的关键步骤。- 滤波: 对 ADC 值进行软件滤波(如多次采样取平均)可以降低噪声影响。
简化示例代码片段 (HAL库, 使用VREFINT, 概念性):
// 1. 已配置好ADC基本参数 (hadc1), 时钟, GPIO等...
// 2. 添加通道到ADC序列 (Rank 1: VREFINT, Rank 2: TempSensor)
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL_VREFINT; // 内部参考电压通道
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES; // 使用长采样时间
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) {
Error_Handler();
}
sConfig.Channel = ADC_CHANNEL_TEMPSENSOR; // 内部温度传感器通道
sConfig.Rank = 2;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) {
Error_Handler();
}
// 3. 校准ADC
if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED) != HAL_OK) {
Error_Handler();
}
// 4. 启用内部温度传感器和VREFINT测量 (设置TSVREFE位)
// 对于很多HAL库版本,启用VREFINT通常也同时启用温度传感器通道
HAL_ADCEx_EnableVREFINT(); // 或者 __HAL_ADC_ENABLE_TEMPSENSOR();
// 5. 启动ADC
if (HAL_ADC_Start(&hadc1) != HAL_OK) {
Error_Handler();
}
// ... (在主循环或定时器中)
// 6. 读取两个通道的值
uint32_t adc_value_vrefint = 0, adc_value_temp = 0;
// 启动转换并等待完成 (这里假设是单次模式,需要每次启动)
if (HAL_ADC_Start(&hadc1) == HAL_OK) {
if (HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY) == HAL_OK) {
adc_value_vrefint = HAL_ADC_GetValue(&hadc1); // 读取Rank1 (VREFINT)
}
if (HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY) == HAL_OK) {
adc_value_temp = HAL_ADC_GetValue(&hadc1); // 读取Rank2 (Temp)
}
HAL_ADC_Stop(&hadc1);
}
// 7. 计算实际VDDA (VREF+)
// 获取存储在Flash中的VREFINT校准值 (地址需根据芯片型号查)
#define VREFINT_CAL_ADDR (0x1FFF7A2A) // 示例地址,F4系列常见值,务必查手册确认!
uint16_t vrefint_cal = *((uint16_t *)VREFINT_CAL_ADDR);
// 计算 (假设12位ADC, Resolution = 4095)
float vdda = (3.3f * vrefint_cal) / adc_value_vrefint; // 3.3V是VREFINT校准时的电压
// 8. 计算温度传感器电压Vsense
float vsense = (adc_value_temp * vdda) / 4095.0f; // 12位ADC
// 9. 计算温度 (使用数据手册提供的典型参数, 例如F4系列)
float v25 = 0.76f; // F4典型值: 0.76V @ 25°C
float avg_slope = 0.0025f; // F4典型值: 2.5 mV/°C = 0.0025 V/°C
float temperature = ((vsense - v25) / avg_slope) + 25.0f;
// 10. 显示温度 (例如通过串口)
printf("Temperature: %.2f °C\n", temperature);
// 或者发送到显示屏...
请务必:
- 将
VREFINT_CAL_ADDR替换为你芯片型号对应的正确地址。 - 将
V<sub>25</sub>和Avg_Slope替换为你芯片数据手册中提供的典型值。 - 根据你的 ADC 分辨率(12位、10位等)调整
ADC_Resolution(4095, 1023)。 - 根据你的库和芯片调整启用温度传感器/VREFINT的函数调用。
- 添加适当的错误处理和滤波。
通过以上步骤和代码框架,你就可以在 STM32 上读取并显示其芯片内部的温度了。记得核心是查阅你所使用芯片的官方文档获取精确参数和配置细节。
stm32CubeMx ADC多通道扫描模式DMA + 采集STM32内部温度传感器的值
项目简介任务:通过CubeMx实现ADC多通道扫描采集DMA方式(无中断) 采集内部温度传感器的
资料下载
佚名
2021-12-08 21:06:22
使用1602LCD显示DS18B20数字温度传感器的温度值程序免费下载
本文档的主要内容详细介绍的是使用1602LCD显示DS18B20数字温度传感器的温度
资料下载
佚名
2019-09-20 17:19:00
7天热门专题
换一换
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- dtmb信号覆盖城市查询
- EDA是什么?有什么作用?
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- amoled屏幕和oled区别
- 单片机和嵌入式的区别是什么
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机
- 元宇宙概念龙头股一览