数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 30|回复: 1

《DNESP32S3使用指南-IDF版_V1.6》第二十八章 内部温度传感器实验

[复制链接]
发表于 昨天 09:30 | 显示全部楼层 |阅读模式
第二十八章 内部温度传感器实验

本章,我们将介绍ESP32-S3的内部温度传感器并使用它来读取温度值,然后在LCD模块上显示出来。本章分为如下几个小节:
28.1 IIC简介
28.2 硬件设计
28.3 程序设计
28.4 下载验证


28.1 内部温度传感器简介
温度传感器生成一个随温度变化的电压。内部ADC将传感器电压转化为一个数字量。温度传感器的测量范围为–20 °C 110 °C。温度传感器适用于监测芯片内部温度的变化,该温度值会随着微控制器时钟频率或IO负载的变化而变化。一般来讲,芯片内部温度会高于外部温度。ESP32-S3温度传感器相关内容,请看《esp32-s3_technical_reference_manual_cn.pdf技术手册39.4章节。
温度传感器的输出值需要使用转换公式转换成实际的温度值 (°C)。转换公式如下:
T(°C) = 0.4386 * VALUE –27.88 * offset –20.52
其中 VALUE 即温度传感器的输出值,offset 由温度偏移决定。温度传感器在不同的实际使用环境(测量温度范围)下,温度偏移不同,见下表所示。
测量范围(°C
温度偏移(°C
50 ~ 110
-2
20 ~ 100
-1
-10 ~ 80
0
-15 ~ 50
1
-20 ~ 20
2
表28.1.1 温度传感器的温度偏移
28.2 硬件设计
28.2.1 例程功能
本章实验功能简介:通过ADC的通道读取ESP32-S3内部温度传感器的电压值,并将其转换为温度值,显示在SPILCD屏上。
28.2.2 硬件资源
1. XL9555
IIC_SDA-IO41
IIC_SCL-IO42
2. SPILCD
CS-IO21
SCK-IO12
SDA-IO11
DC-IO40(在P5端口,使用跳线帽将IO_SETLCD_DC相连)
PWR- IO1_3XL9555)
RST- IO1_2XL9555)
3. 内部温度传感器
28.2.3 原理图
本章实验使用的ADCESP32-S3的片上资源,因此并没有相应的连接原理图。
28.3 程序设计
28.3.1 程序流程图
程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图:
28.3.1.1 温度传感器实验程序流程图
28.3.2 内部温度传感器函数解析
ESP-IDF提供了一套API来配置温度传感器。要使用此功能,需要导入必要的头文件:
#include "driver/temperature_sensor.h"
接下来,作者将介绍一些常用的ESP32-S3中的温度传感器函数,这些函数的描述及其作用如下:
1,设置测试温度的最大与最小值
该函数用于配置测试温度的大小范围,其函数原型如下:
esp_err_t temperature_sensor_install(const temperature_sensor_config_t             *tsens_config,
           temperature_sensor_handle_t              *ret_tsens);
该函数的形参描述,如下表所示:
形参
描述
tsens_config
指向温度配置结构的指针
ret_tsens
返回温度传感器句柄的指针
28.3.2.1 函数temperature_sensor_install()形参描述
该函数的返回值描述,如下表所示:
返回值
描述
ESP_OK
返回:0,表示配置成功
28.3.2.2 函数temperature_sensor_install()返回值描述
该函数使用temperature_sensor_config_t类型的结构体变量传入,该结构体的定义如下:
结构体
成员变量
可选参数
temperature_sensor_config_t
range_min
要测试的温度的最小值
例程设置了20
range_max
要测试的温度的最大值
例程设置了50
28.3.2.3 temperature_sensor_config_t结构体参数值描述
完成上述结构体参数配置之后,可以将结构传递给 temperature_sensor_install () 函数,用以实例化温度传感器
2使能温度传感器
该函数用于使能温度传感器,其函数原型如下:
esp_err_t temperature_sensor_enable(temperature_sensor_handle_t tsens);
该函数的形参描述,如下表所示:
形参
描述
tsens
temperature_sensor_install()创建的句柄
28.3.2.3 函数temperature_sensor_enable ()形参描述
该函数的返回值描述,如下表所示:
返回值
描述
ESP_OK
返回:0,表示配置成功
ESP_ERR_INVALID_STATE
如果温度传感器已经使能
28.3.2.4 函数temperature_sensor_enable ()返回值描述
3获取传输的传感器数据
该函数用于获取传输的传感器数据,其函数原型如下:
esp_err_t temperature_sensor_get_celsius(temperature_sensor_handle_t tsens,              float *out_celsius);
该函数的形参描述,如下表所示:
形参
描述
tsens
temperature_sensor_install()创建的句柄
out_celsius
度量值输出值
28.3.2.5 函数temperature_sensor_get_celsius ()形参描述
该函数的返回值描述,如下表所示:
返回值
描述
ESP_OK
返回:0,配置成功
ESP_ERR_NOT_STATE
温度传感器未使能
28.3.2.6 函数temperature_sensor_get_celsius ()返回值描述
4失能温度传感器
该函数用于获取传输的传感器数据,其函数原型如下:
esp_err_t temperature_sensor_disable(temperature_sensor_handle_t tsens);
该函数的形参描述,如下表所示:
形参
描述
tsens
temperature_sensor_install()创建的句柄
28.3.2.7 函数temperature_sensor_disable ()形参描述
该函数的返回值描述,如下表所示:
返回值
描述
ESP_OK
返回:0,配置成功
ESP_ERR_NOT_STATE
温度传感器未使能
28.3.2.8 函数temperature_sensor_disable ()返回值描述
28.3.3 内部温度传感器驱动解析
IDF18_internal_Temperature例程中,作者在18_internal_Temperature\components\BSP路径下新增了一个SENSOR文件夹,分别用于存放sensor.csensor.h这两个文件。其中,sensor.h文件负责声明温度传感器相关的函数和变量,而sensor.c文件则实现了温度传感器的驱动代码。下面,我们将详细解析这两个文件的实现内容。
1sensor.h文件
/* 参数定义 */
#define SENSOR_RANGE_MIN    20      /* 要测试温度的最小值 */
#define SENSOR_RANGE_MAX    50      /* 要测试温度的最大值 */
2sensor.c文件
在上述sensor.h文件中我们通过宏定义的方式定义了待测试温度的最大与最小值,该值在不超过理论值的基础上,开发者可以自行定义。
esp_err_t rev_flag;
temperature_sensor_handle_t temp_handle = NULL; /* 温度传感器句柄 */
/**
* @brief       初始化内部温度传感器
* @param      
* @retval      
*/
void temperature_sensor_init(void)
{
    temperature_sensor_config_t temp_sensor;
   
    temp_sensor.range_min = SENSOR_RANGE_MIN;   /* 要测试温度的最小值 */
    temp_sensor.range_max = SENSOR_RANGE_MAX;   /* 要测试温度的最大值 */
    rev_flag |= temperature_sensor_install(&temp_sensor, &temp_handle);
    ESP_ERROR_CHECK(rev_flag);
}
/**
* @brief       获取内部温度传感器温度值
* @param      
* @retval      返回内部温度值
*/
short sensor_get_temperature(void)
{
    float temp;
    /* 启用温度传感器 */
    rev_flag |= temperature_sensor_enable(temp_handle);
    /* 获取传输的传感器数据 */
    rev_flag |= temperature_sensor_get_celsius(temp_handle, &temp);
    /* 温度传感器使用完毕后,禁用温度传感器,节约功耗 */
    rev_flag |= temperature_sensor_disable(temp_handle);
    ESP_ERROR_CHECK(rev_flag);
return temp;
}
初始化内部温度传感器后,再将温度传感器使能以获取传感器数据,最终以返回值的形式将数据返回到数据处理的函数。
28.3.4 CMakeLists.txt文件
打开本实验BSP下的CMakeLists.txt文件,其内容如下所示:
set(src_dirs
            IIC
            LCD
            LED
            SENSOR
            SPI
            XL9555)
set(include_dirs
            IIC
            LCD
            LED
            SENSOR
            SPI
            XL9555)
set(requires
            driver)
idf_component_register(SRC_DIRS ${src_dirs}
INCLUDE_DIRS ${include_dirs} REQUIRES ${requires})
component_compile_options(-ffast-math -O3 -Wno-error=format=-Wno-format)
上述的红色SENSOR驱动需要由开发者自行添加,以确保温度传感器驱动能够顺利集成到构建系统中。这一步骤是必不可少的,它确保了温度传感器驱动的正确性和可用性,为后续的开发工作提供了坚实的基础。
28.3.5 实验应用代码
打开main/main.c文件,该文件定义了工程入口函数,名为app_main。该函数代码如下。
i2c_obj_t i2c0_master;
/**
* @brief       程序入口
* @param      
* @retval      
*/
void app_main(void)
{
    int16_t temp;
    esp_err_t ret;
    /* 初始化NVS */
    ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES ||ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
    {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }
    /* 初始化LED */
    led_init();
   
    /* 初始化IIC0 */
    i2c0_master = iic_init(I2C_NUM_0);
   
    /* 初始化SPI2 */
    spi2_init();
   
    /* 初始化XL9555 */
    xl9555_init(i2c0_master);
   
    /* 初始化LCD */
    lcd_init();
   
    /* 初始化内部温度传感器 */
    temperature_sensor_init();                                                  
   
    lcd_show_string(30, 50, 200, 16, 16, "ESP32", RED);
    lcd_show_string(30, 70, 200, 16, 16, "Temperature TEST", RED);
    lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
    lcd_show_string(30, 120, 200, 16, 16, "TEMPERATE: 00.00C", BLUE);
    while(1)
    {
        /* 得到温度值 */
        temp = sensor_get_temperature();
        if (temp < 0)
        {
            temp = -temp;
            
            /* 显示符号 */
            lcd_show_string(30 + 10 * 8, 120, 16, 16, 16, "-", BLUE);
        }
        else
        {
            /* 无符号 */
            lcd_show_string(30 + 10 * 8, 120, 16, 16, 16, " ", BLUE);
        }
        
        /* 显示整数部分 */
        lcd_show_xnum(30 + 11 * 8, 120, temp, 2, 16, 0, BLUE);
        
        /* 显示小数部分 */
        lcd_show_xnum(30 + 14 * 8, 120, temp * 100 % 100, 2, 16, 0x80, BLUE);
        
        /* LED闪烁,提示程序运行 */
        LED_TOGGLE();
        vTaskDelay(250);
    }
}
main函数代码比较简单,主要是通过sensor_get_temperature()函数读取ESP32-S3内部温度值,最后在SPILCD上显示
28.4 下载验证
将程序下载到开发板后,LCD显示的内容如下图所示:
图28.5.1 内部温度传感器实验测试图
大家可以看看你的温度值与实际是否相符合(因为芯片会发热,所以一般会比实际温度偏高)?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
发表于 昨天 21:07 | 显示全部楼层
我来参观学习。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-16 05:13 , Processed in 0.109200 second(s), 10 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表