文章目录
- 一、内部温度传感器
-
- [ 1、内部温度传感器](# 1、内部温度传感器)
- [ 2、注意事项](# 2、注意事项)
- 二、结构原理
-
- [ 1、结构框图](# 1、结构框图)
- [ 2、ANALOG 模拟部分(XPD_SAR_POWER_DOMAIN 电源域)](# 2、ANALOG 模拟部分(XPD_SAR_POWER_DOMAIN 电源域))
- [ 3、Tsensor_cntl(数字控制器)](# 3、Tsensor_cntl(数字控制器))
- [ 4、RTC_REG_FILE](# 4、RTC_REG_FILE)
- [ 5、ULP(ULP‑RISC‑V 协处理器)](# 5、ULP(ULP‑RISC‑V 协处理器))
- 三、API
-
- [ 1、头文件/组件](# 1、头文件/组件)
- [ 2、句柄类型](# 2、句柄类型)
- [ 3、结构体](# 3、结构体)
- [ 4、API](# 4、API)
-
- [ 1.temperature_sensor_install:安装驱动,生成句柄](# 1.temperature_sensor_install:安装驱动,生成句柄)
- [ 2.temperature_sensor_uninstall:卸载驱动,释放资源](# 2.temperature_sensor_uninstall:卸载驱动,释放资源)
- [ 3.temperature_sensor_enable:使能温度传感器硬件](# 3.temperature_sensor_enable:使能温度传感器硬件)
- [ 4.temperature_sensor_disable:关闭温度传感器硬件](# 4.temperature_sensor_disable:关闭温度传感器硬件)
- [ 5.temperature_sensor_get_celsius:读取温度(摄氏度),禁止在中断内调用](# 5.temperature_sensor_get_celsius:读取温度(摄氏度),禁止在中断内调用)
- 四、示例代码
-
- [ 1、读取芯片内部温度](# 1、读取芯片内部温度)
-
- [ 1.示例代码](# 1.示例代码)
- [ 2.执行结果](# 2.执行结果)
一、内部温度传感器
1、内部温度传感器
ESP32‑S3 内置 SAR ADC2 的内部温度传感器,读取芯片内部 die 温度(芯片本体温度,不是环境温度)。
2、注意事项
1. 测的是芯片内核温度,不是空气环境温度;芯片跑 WiFi、PWM、LED 时会明显偏高。
2. 温度传感器复用 ADC2 外设,WiFi 启用时 ADC2 会被占用,开 WiFi 时内部温度传感器不可用!
二、结构原理
1、结构框图

2、ANALOG 模拟部分(XPD_SAR_POWER_DOMAIN 电源域)
Tsensor:模拟温度传感单元,位于 SAR‑ADC2 电源域。
该模块和 ADC2 共用电源域,WiFi 开启时会把该电源域断电,温度传感器就失效,对应文档里 WiFi 互斥的根源。
信号交互:
tsens_xpd / tsens_clk:电源使能、时钟,来自Tsensor_cntl控制器,控制模拟传感器上电、时钟。
parameter:DAC 偏移配置参数(对应代码中dac_offset L0~L4 档位)。
tsens_data:温度原始采样数据,输出给数字控制器。
3、Tsensor_cntl(数字控制器)
位于 RTC 域,负责:
接收 RTC 寄存器 / ULP 的控制信号;
输出控制信号给模拟 Tsensor;
接收模拟采样数据,做处理;
输出状态信号:SENS_TSENS_OUT7:0原始 8bit 温度数据、SENS_TSENS_READY采样完成标志。
多路选择器 0/1:选择控制来源:
0:来自 ULP 协处理器;
1:来自 RTC_REG_FILE(RTC 寄存器)。
说明:温度传感器可以被 ULP‑RISC‑V 直接驱动,在主 CPU 休眠低功耗模式下持续测温,不需要唤醒主 CPU。
控制寄存器信号:
SENS_TSENS_POWER_UP_FORCE:强制上电;
SENS_TSENS_POWER_UP:传感器上电;
SENS_TSENS_DUMP_OUT:读出采样结果;
SENS_TSENS_IN_INV:输入反向配置。
4、RTC_REG_FILE
RTC 寄存器堆,主 CPU 通过寄存器配置温度传感器,存放配置参数、读取采样结果。
5、ULP(ULP‑RISC‑V 协处理器)
RTC 域的低功耗小核。 可以独立操作温度传感器:休眠模式下,主 CPU 睡眠,ULP 周期性读取芯片温度,温度超标再唤醒主 CPU,做过热保护,非常适合低功耗场景。
三、API
1、头文件/组件
头文件:
#include "driver/temperature_sensor.h"
组件:
PRIV_REQUIRES esp_driver_tsens
2、句柄类型
//温度传感器句柄
typedef struct temperature_sensor_obj_t* temperature_sensor_handle_t;
3、结构体
配置结构体 temperature_sensor_config_t:
c
typedef struct {
int range_min; //预设测量温度下限(℃)
int range_max; //预设测量温度上限(℃)
temperature_sensor_clk_src_t clk_src; //时钟源
struct {
uint32_t allow_pd; //置1:睡眠时允许关闭传感器电源域,驱动自动备份恢复寄存器
} flags;
} temperature_sensor_config_t;
快速初始化宏:
TEMPERATURE_SENSOR_CONFIG_DEFAULT(min, max);
4、API
1.temperature_sensor_install:安装驱动,生成句柄
esp_err_t temperature_sensor_install(const temperature_sensor_config_t *tsens_config, temperature_sensor_handle_t *ret_tsens);
参数:
tsens_config:配置结构体指针。
ret_tsens:输出得到传感器句柄。
返回:ESP_OK成功。
2.temperature_sensor_uninstall:卸载驱动,释放资源
esp_err_t temperature_sensor_uninstall(temperature_sensor_handle_t tsens);
参数:tsens 由 install 生成的句柄。
返回:ESP_OK成功。
3.temperature_sensor_enable:使能温度传感器硬件
esp_err_t temperature_sensor_enable(temperature_sensor_handle_t tsens);
返回:
ESP_OK成功。
ESP_ERR_INVALID_STATE:已经处于使能状态。
4.temperature_sensor_disable:关闭温度传感器硬件
esp_err_t temperature_sensor_disable(temperature_sensor_handle_t tsens);
返回:
ESP_OK成功。
ESP_ERR_INVALID_STATE:尚未使能。
5.temperature_sensor_get_celsius:读取温度(摄氏度),禁止在中断内调用
esp_err_t temperature_sensor_get_celsius(temperature_sensor_handle_t tsens, float *out_celsius);
参数:
tsens:传感器句柄。
out_celsius:输出温度浮点数指针。
返回码:
ESP_OK:读取成功。
ESP_ERR_INVALID_ARG:参数非法。
ESP_ERR_INVALID_STATE:传感器未使能。
ESP_FAIL:解析失败,数值超出量程。
四、示例代码
1、读取芯片内部温度
1.示例代码
c
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/temperature_sensor.h"
void app_main(void)
{
temperature_sensor_handle_t temp_handle = NULL;
//配置测量区间 20~50℃
temperature_sensor_config_t tsens_cfg = TEMPERATURE_SENSOR_CONFIG_DEFAULT(20, 50);
ESP_ERROR_CHECK(temperature_sensor_install(&tsens_cfg, &temp_handle));
ESP_ERROR_CHECK(temperature_sensor_enable(temp_handle));
float temp_val;
while(1)
{
esp_err_t ret = temperature_sensor_get_celsius(temp_handle, &temp_val);
if(ret == ESP_OK)
{
printf("Chip temperature: %.2f °C\n", temp_val);
}
else
{
printf("read temp fail, ret:%d\n", ret);
}
vTaskDelay(pdMS_TO_TICKS(1000));
}
//不会执行到这里
ESP_ERROR_CHECK(temperature_sensor_disable(temp_handle));
ESP_ERROR_CHECK(temperature_sensor_uninstall(temp_handle));
}
2.执行结果
