24- ESP32S3 内部温度传感器

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 版

### ESP32-C6 LM75 I2C 新项目配置选项详解 在基于 VSCode 和 ESP-IDF 创建新项目时,针对 ESP32-C6 使用 LM75 温度传感器并通过 I2C 接口通信,需关注以下几个关键配置项。 --- #### 1. **目标芯片选择** 在创建新项目时,确保正确选择了目标芯片型号。对于 ESP32-C6,应在 `sdkconfig` 文件中启用以下选项: - `CONFIG_IDF_TARGET_ESP32C6=y` 这一步骤决定了后续编译过程中使用的具体硬件资源和驱动程序[^1]。 --- #### 2. **I2C 配置选项** ESP-IDF 提供了丰富的配置选项来支持 I2C 功能。以下是几个重要的配置点: - **总线编号**:ESP32-C6 支持多路 I2C 总线,默认使用 `I2C_NUM_0` 或 `I2C_NUM_1`。 - **引脚分配**:默认情况下,SCL 和 SDA 分别映射至 GPIO9 和 GPIO8。如果需要自定义引脚,则可以在代码中动态指定。 - **波特率设置**:标准模式下建议设置为 `100 kHz`,快速模式可提升至 `400 kHz`。 这些参数通常通过修改项目的 CMakeLists.txt 或 sdkconfig 文件完成设定[^2]。 --- #### 3. **LM75 地址与寄存器交互** LM75 的 I2C 地址范围由 A0-A2 引脚决定,默认地址为 `0x48`。主要寄存器及其用途如下: - **温度寄存器 (Address: 0x00)**:存储当前测得的温度值。 - **配置寄存器 (Address: 0x01)**:控制工作模式(如连续监测或关机模式)。 - **THYST 寄存器 (Address: 0x02)**:设定触发阈值下限。 - **TOS 寄存器 (Address: 0x03)**:设定触发阈值上限。 初始化 LM75 时应先确认其处于正常工作状态,并验证读取到的温度数据是否合理[^3]。 --- #### 4. **VSCode 和 ESP-IDF 集成环境配置** 为了顺利开发基于 ESP32-C6 和 LM75 的应用,需确保以下几点已妥善配置: - **安装扩展插件**:在 VSCode 中安装官方提供的 "Espressif IDF" 插件。 - **路径变量设置**:将 ESP-IDF 路径加入系统环境变量中以便工具链能够被识别。 - **构建工具绑定**:通过命令行执行 `idf.py set-target esp32c6` 来锁定目标平台。 - **调试支持**:借助 OpenOCD 实现在线调试功能,便于排查潜在问题[^4]。 --- #### 5. **示例代码结构化展示** 下面给出一段完整的代码框架用于演示如何结合上述要点实现 LM75 数据采集: ```c #include "driver/i2c.h" #include <stdio.h> #define I2C_MASTER_SCL_IO 9 // 定义 SCL 引脚为 GPIO9 #define I2C_MASTER_SDA_IO 8 // 定义 SDA 引脚为 GPIO8 #define I2C_MASTER_NUM I2C_NUM_0 // 使用 I2C 总线号 0 #define I2C_MASTER_FREQ_HZ 100000 // 设置频率为 100kHz #define LM75_ADDR 0x48 // 默认 LM75 地址 void i2c_master_init() { int i2c_master_port = I2C_MASTER_NUM; i2c_config_t conf = { .mode = I2C_MODE_MASTER, .sda_io_num = I2C_MASTER_SDA_IO, .scl_io_num = I2C_MASTER_SCL_IO, .sda_pullup_en = GPIO_PULLUP_ENABLE, .scl_pullup_en = GPIO_PULLUP_ENABLE, .master.clk_speed = I2C_MASTER_FREQ_HZ }; i2c_param_config(i2c_master_port, &conf); i2c_driver_install(i2c_master_port, conf.mode, 0, 0, 0); } float read_lm75_temperature() { uint8_t data[2]; i2c_cmd_handle_t cmd = i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, (LM75_ADDR << 1) | WRITE_BIT, ACK_CHECK_EN); i2c_master_write_byte(cmd, 0x00, ACK_CHECK_EN); i2c_master_start(cmd); i2c_master_write_byte(cmd, (LM75_ADDR << 1) | READ_BIT, ACK_CHECK_EN); i2c_master_read(cmd, data, sizeof(data), I2C_MASTER_LAST_NACK); i2c_master_stop(cmd); i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, pdMS_TO_TICKS(10)); i2c_cmd_link_delete(cmd); float temp = ((data[0] << 8) | data[1]) / 256.0f; return temp; } void app_main(void){ i2c_master_init(); while(true){ float temperature = read_lm75_temperature(); printf("Temperature: %.2f°C\n", temperature); vTaskDelay(pdMS_TO_TICKS(1000)); // 每秒刷新一次 } } ``` 此代码片段涵盖了从硬件初始化到周期性获取温度信息的整体流程[^5]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宁子希

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值