搜索
bottom↓
回复: 0

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

[复制链接]

出0入234汤圆

发表于 前天 09:50 | 显示全部楼层 |阅读模式
本帖最后由 正点原子 于 2024-7-25 09:50 编辑

2.jpg
1)实验平台:正点原子ESP32S3开发板
2)购买链接:https://detail.tmall.com/item.htm?id=768499342659
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-347618-1-1.html
4)正点原子官方B站:https://space.bilibili.com/394620890
5)正点原子手把手教你学ESP32S3快速入门视频教程:https://www.bilibili.com/video/BV1sH4y1W7Tc
6)正点原子FPGA交流群:132780729
1.png
3.png

第二十八章 内部温度传感器实验


       本章,我们将介绍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 由温度偏移决定。温度传感器在不同的实际使用环境(测量温度范围)下,温度偏移不同,见下表所示。

1.png
表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_SET和LCD_DC相连)
              PWR- IO1_3(XL9555)
              RST- IO1_2(XL9555)

       3. 内部温度传感器

       28.2.3 原理图
       本章实验使用的ADC为ESP32-S3的片上资源,因此并没有相应的连接原理图。

       28.3 程序设计

       28.3.1 程序流程图
       程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图:

第二十八章 内部温度传感器实验1018.png
图28.3.1.1 温度传感器实验程序流程图

       28.3.2 内部温度传感器函数解析
       ESP-IDF提供了一套API来配置温度传感器。要使用此功能,需要导入必要的头文件:
  1. #include "driver/temperature_sensor.h"
复制代码
       接下来,作者将介绍一些常用的ESP32-S3中的温度传感器函数,这些函数的描述及其作用如下:

       1,设置测试温度的最大与最小值
       该函数用于配置测试温度的大小范围,其函数原型如下:
  1. esp_err_t temperature_sensor_install(const temperature_sensor_config_t                                                                                                        *tsens_config,
  2.                                                                                         temperature_sensor_handle_t                                                                                                         *ret_tsens);
复制代码
       该函数的形参描述,如下表所示:

2.png
表28.3.2.1 函数temperature_sensor_install()形参描述

       该函数的返回值描述,如下表所示:

3.png
表28.3.2.2 函数temperature_sensor_install()返回值描述

       该函数使用temperature_sensor_config_t类型的结构体变量传入,该结构体的定义如下:

4.png
表28.3.2.3 temperature_sensor_config_t结构体参数值描述

       完成上述结构体参数配置之后,可以将结构传递给 temperature_sensor_install () 函数,用以实例化温度传感器。

       2,使能温度传感器
       该函数用于使能温度传感器,其函数原型如下:
  1. esp_err_t temperature_sensor_enable(temperature_sensor_handle_t tsens);
复制代码
       该函数的形参描述,如下表所示:

5.png
表28.3.2.3 函数temperature_sensor_enable ()形参描述

       该函数的返回值描述,如下表所示:

6.png
表28.3.2.4 函数temperature_sensor_enable ()返回值描述

       3,获取传输的传感器数据
       该函数用于获取传输的传感器数据,其函数原型如下:
  1. esp_err_t temperature_sensor_get_celsius(temperature_sensor_handle_t tsens,                                                                                           float *out_celsius);
复制代码
       该函数的形参描述,如下表所示:

7.png
表28.3.2.5 函数temperature_sensor_get_celsius ()形参描述

       该函数的返回值描述,如下表所示:

8.png
表28.3.2.6 函数temperature_sensor_get_celsius ()返回值描述

       4,失能温度传感器
       该函数用于获取传输的传感器数据,其函数原型如下:
  1. esp_err_t temperature_sensor_disable(temperature_sensor_handle_t tsens);
复制代码
       该函数的形参描述,如下表所示:

9.png
表28.3.2.7 函数temperature_sensor_disable ()形参描述

       该函数的返回值描述,如下表所示:

10.png
表28.3.2.8 函数temperature_sensor_disable ()返回值描述

       28.3.3 内部温度传感器驱动解析
       在IDF版18_internal_Temperature例程中,作者在18_internal_Temperature\components\BSP路径下新增了一个SENSOR文件夹,分别用于存放sensor.c、sensor.h这两个文件。其中,sensor.h文件负责声明温度传感器相关的函数和变量,而sensor.c文件则实现了温度传感器的驱动代码。下面,我们将详细解析这两个文件的实现内容。

       1,sensor.h文件
  1. /* 参数定义 */
  2. #define SENSOR_RANGE_MIN    20      /* 要测试温度的最小值 */
  3. #define SENSOR_RANGE_MAX    50      /* 要测试温度的最大值 */
复制代码

       2,sensor.c文件
       在上述sensor.h文件中我们通过宏定义的方式定义了待测试温度的最大与最小值,该值在不超过理论值的基础上,开发者可以自行定义。
  1. esp_err_t rev_flag;
  2. temperature_sensor_handle_t temp_handle = NULL; /* 温度传感器句柄 */

  3. /**
  4. * @brief       初始化内部温度传感器
  5. * @param       无
  6. * @retval      无
  7. */
  8. void temperature_sensor_init(void)
  9. {
  10.     temperature_sensor_config_t temp_sensor;
  11.    
  12.     temp_sensor.range_min = SENSOR_RANGE_MIN;   /* 要测试温度的最小值 */
  13.     temp_sensor.range_max = SENSOR_RANGE_MAX;   /* 要测试温度的最大值 */

  14.     rev_flag |= temperature_sensor_install(&temp_sensor, &temp_handle);
  15.     ESP_ERROR_CHECK(rev_flag);
  16. }

  17. /**
  18. * @brief       获取内部温度传感器温度值
  19. * @param       无
  20. * @retval      返回内部温度值
  21. */
  22. short sensor_get_temperature(void)
  23. {
  24.     float temp;

  25.     /* 启用温度传感器 */
  26.     rev_flag |= temperature_sensor_enable(temp_handle);

  27.     /* 获取传输的传感器数据 */
  28.     rev_flag |= temperature_sensor_get_celsius(temp_handle, &temp);

  29.     /* 温度传感器使用完毕后,禁用温度传感器,节约功耗 */
  30.     rev_flag |= temperature_sensor_disable(temp_handle);
  31.     ESP_ERROR_CHECK(rev_flag);

  32. return temp;
  33. }
复制代码
       初始化内部温度传感器后,再将温度传感器使能以获取传感器数据,最终以返回值的形式将数据返回到数据处理的函数。

       28.3.4 CMakeLists.txt文件
       打开本实验BSP下的CMakeLists.txt文件,其内容如下所示:
  1. set(src_dirs
  2.             IIC
  3.             LCD
  4.             LED
  5.             SENSOR
  6.             SPI
  7.             XL9555)

  8. set(include_dirs
  9.             IIC
  10.             LCD
  11.             LED
  12.             SENSOR
  13.             SPI
  14.             XL9555)

  15. set(requires
  16.             driver)

  17. idf_component_register(SRC_DIRS ${src_dirs}
  18. INCLUDE_DIRS ${include_dirs} REQUIRES ${requires})

  19. component_compile_options(-ffast-math -O3 -Wno-error=format=-Wno-format)
复制代码
       上述的红色SENSOR驱动需要由开发者自行添加,以确保温度传感器驱动能够顺利集成到构建系统中。这一步骤是必不可少的,它确保了温度传感器驱动的正确性和可用性,为后续的开发工作提供了坚实的基础。

       28.3.5 实验应用代码
       打开main/main.c文件,该文件定义了工程入口函数,名为app_main。该函数代码如下。
  1. i2c_obj_t i2c0_master;

  2. /**
  3. * @brief       程序入口
  4. * @param       无
  5. * @retval      无
  6. */
  7. void app_main(void)
  8. {
  9.     int16_t temp;
  10.     esp_err_t ret;

  11.     /* 初始化NVS */
  12.     ret = nvs_flash_init();

  13.     if (ret == ESP_ERR_NVS_NO_FREE_PAGES ||ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
  14.     {
  15.         ESP_ERROR_CHECK(nvs_flash_erase());
  16.         ret = nvs_flash_init();
  17.     }

  18.     /* 初始化LED */
  19.     led_init();
  20.    
  21.     /* 初始化IIC0 */
  22.     i2c0_master = iic_init(I2C_NUM_0);
  23.    
  24.     /* 初始化SPI2 */
  25.     spi2_init();
  26.    
  27.     /* 初始化XL9555 */
  28.     xl9555_init(i2c0_master);
  29.    
  30.     /* 初始化LCD */
  31.     lcd_init();
  32.    
  33.     /* 初始化内部温度传感器 */
  34.     temperature_sensor_init();                                                  
  35.    
  36.     lcd_show_string(30, 50, 200, 16, 16, "ESP32", RED);
  37.     lcd_show_string(30, 70, 200, 16, 16, "Temperature TEST", RED);
  38.     lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
  39.     lcd_show_string(30, 120, 200, 16, 16, "TEMPERATE: 00.00C", BLUE);

  40.     while(1)
  41.     {
  42.         /* 得到温度值 */
  43.         temp = sensor_get_temperature();

  44.         if (temp < 0)
  45.         {
  46.             temp = -temp;
  47.             
  48.             /* 显示符号 */
  49.             lcd_show_string(30 + 10 * 8, 120, 16, 16, 16, "-", BLUE);
  50.         }
  51.         else
  52.         {
  53.             /* 无符号 */
  54.             lcd_show_string(30 + 10 * 8, 120, 16, 16, 16, " ", BLUE);
  55.         }
  56.         
  57.         /* 显示整数部分 */
  58.         lcd_show_xnum(30 + 11 * 8, 120, temp, 2, 16, 0, BLUE);
  59.         
  60.         /* 显示小数部分 */
  61.         lcd_show_xnum(30 + 14 * 8, 120, temp * 100 % 100, 2, 16, 0x80, BLUE);
  62.         
  63.         /* LED闪烁,提示程序运行 */
  64.         LED_TOGGLE();
  65.         vTaskDelay(250);
  66.     }
  67. }
复制代码
       main函数代码比较简单,主要是通过sensor_get_temperature()函数读取ESP32-S3内部温度值,最后在SPILCD上显示。

       28.4 下载验证
       将程序下载到开发板后,LCD显示的内容如下图所示:

第二十八章 内部温度传感器实验6952.png
图28.5.1 内部温度传感器实验测试图

       大家可以看看你的温度值与实际是否相符合(因为芯片会发热,所以一般会比实际温度偏高)?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-27 20:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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