ESP32S3 内部温度传感器

ESP32S3 内置了一个温度传感器。这个传感器可以用来测量芯片的内部温度,对于一些需要监控系统温度的应用来说非常有用。

1. 温度传感器概述

ESP32S3 的内部温度传感器是一个模拟电路,它可以测量芯片的内部温度。这个传感器的输出是一个模拟电压,这个电压与芯片的温度成正比。我们可以通过读取这个模拟电压来获取芯片的温度。

温度传感器的输出值需要使用转换公式转换成实际的温度值 (°C)。转换公式如下:
T ( ° C ) = 0.4386 ∗ V A L U E – 27.88 ∗ o f f s e t – 20.52 T(°C) = 0.4386 * VALUE –27.88 * offset –20.52 T(°C)=0.4386VALUE–27.88offset–20.52
其中 VALUE 即温度传感器的输出值,offset 由温度偏移决定。

由于硬件限制,温度传感器存在预定义的测量范围及其对应误差,详见下表:

预定义测量范围 (°C)测量误差 (°C)
-40 ~ 20< 3
-30 ~ 50< 2
-10 ~ 80< 1
20 ~ 100< 2
50 ~ 125< 3

2. 读取温度值

1️⃣评估测量范围(设置测试温度的最大与最小值)

esp_err_t temperature_sensor_install(const temperature_sensor_config_t *tsens_config, temperature_sensor_handle_t *ret_tsens);

功能: 配置测试温度的范围。

形参描述:

  • tsens_config: 指向temperature_sensor_config_t结构体的指针,用于设置温度范围。

  • ret_tsens: 返回温度传感器句柄的指针。

使用示例

#include "driver/gpio.h"

void example_fun(void)
{
    esp_err_t rev_flag;
    temperature_sensor_config_t temp_sensor;

    // 设置测试温度范围
    temp_sensor.range_min = SENSOR_RANGE_MIN;   // 测试温度的最小值
    temp_sensor.range_max = SENSOR_RANGE_MAX;   // 测试温度的最大值
	
	temperature_sensor_handle_t temp_handle = NULL; // 温度传感器句柄初始化
	
    // 安装温度传感器配置并检查返回值
    rev_flag = temperature_sensor_install(&temp_sensor, &temp_handle);
    ESP_ERROR_CHECK(rev_flag);
}

以下是整理后的格式,包括修正了描述中的错误(将temperature_sensor_install更正为temperature_sensor_enable):

2️⃣使能温度传感器

esp_err_t temperature_sensor_enable(temperature_sensor_handle_t tsens);

功能: 使能温度传感器。

形参描述:

  • tsens: 由temperature_sensor_install()函数创建的温度传感器句柄。

返回值描述:

  • ESP_OK: 返回0,表示使能成功。
  • ESP_ERR_INVALID_STATE: 如果温度传感器已经处于使能状态。
#include "driver/gpio.h"

void example_fun(void)
{
    
    // 试图使能温度传感器
    esp_err_t enable_status = temperature_sensor_enable(temp_handle);
    if (enable_status != ESP_OK) {
        // 处理错误情况
        printf("Temperature sensor enable failed: %d\n", enable_status);
    }
}

根据您提供的信息,我整理了关于temperature_sensor_get_celsius函数的详细说明和使用示例,以更清晰的格式展示如下:

3️⃣获取传输的传感器数据

esp_err_t temperature_sensor_get_celsius(temperature_sensor_handle_t tsens, float *out_celsius);

功能: 获取传输的传感器数据。

形参描述

形参描述
tsenstemperature_sensor_install() 创建的传感器句柄
out_celsius用于存储温度读数(摄氏度)的指针

使用示例

#include "driver/temperature_sensor.h" // 确保包含正确的头文件

void example_function(void)
{
    float temperature; // 用于存储读取到的温度值

    // 省略在此处之已调用temperature_sensor_install()并成功获取句柄

    // 获取温度传感器的当前温度读数
    esp_err_t result = temperature_sensor_get_celsius(temp_handle, &temperature);

    if (result == ESP_OK) {
        printf("Current temperature: %.2f Celsius\n", temperature);
    } else {
        printf("Failed to get temperature: %d\n", result);
    }
}

看起来这里存在一些混淆,您提供的函数原型和描述实际上与“失能温度传感器”操作不符。根据您的意图,应该是描述如何禁用或失能温度传感器的功能。因此,我将基于您的需求重新整理这部分内容,假设存在一个用于失能温度传感器的函数,并按照正确的格式进行整理。

4️⃣失能温度传感器

esp_err_t temperature_sensor_disable(temperature_sensor_handle_t tsens);

功能: 失能温度传感器。

形参描述

形参描述
tsenstemperature_sensor_install() 创建的温度传感器句柄

使用示例

#include "driver/temperature_sensor.h" // 确保包含正确的头文件

void example_function(void)
{
    temperature_sensor_handle_t sensor_handle = NULL; // 温度传感器句柄

    // 假设在此处之前已调用temperature_sensor_install()并成功获取句柄

    // 失能温度传感器
    esp_err_t result = temperature_sensor_disable(temp_handle);

    if (result == ESP_OK) {
        printf("Temperature sensor disabled successfully.\n");
    } else {
        printf("Failed to disable temperature sensor: %d\n", result);
    }
}

3. 程序设计

获取芯片温度并打到串口上

#include <stdio.h>
#include "driver/gpio.h"
#include "driver/temperature_sensor.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#define SENSOR_RANGE_MIN    20      //要测试温度的最小值
#define SENSOR_RANGE_MAX    50      //要测试温度的最大值

void app_main(void){

    float temperature; // 用于存储读取到的温度值

    esp_err_t rev_flag;
    temperature_sensor_config_t temp_sensor;

    // 设置测试温度范围
    temp_sensor.range_min = SENSOR_RANGE_MIN;   // 测试温度的最小值
    temp_sensor.range_max = SENSOR_RANGE_MAX;   // 测试温度的最大值
	
	temperature_sensor_handle_t temp_handle = NULL; // 温度传感器句柄初始化
	
    // 安装温度传感器配置并检查返回值
    rev_flag = temperature_sensor_install(&temp_sensor, &temp_handle);
    ESP_ERROR_CHECK(rev_flag);

    // 使能温度传感器
    ESP_ERROR_CHECK(temperature_sensor_enable(temp_handle));


    // 获取温度传感器的当前温度读数
    ESP_ERROR_CHECK(temperature_sensor_get_celsius(temp_handle, &temperature));

    while(1){

        // 获取温度传感器的当前温度读数
        ESP_ERROR_CHECK(temperature_sensor_get_celsius(temp_handle, &temperature));
        printf("温度值: %f\n",temperature);

        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

在这里插入图片描述

4. 结论

ESP32S3 的内部温度传感器是一个有用的功能,它可以帮助我们监控芯片的温度。虽然它不能替代外部的温度传感器,但是在许多应用中,它都可以提供足够的温度信息。

参考资料
ESP32-IDF编程指南
正点原子DNESP32S3 开发板教程-IDF 版

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐