博客 / 詳情

返回

《ESP32-S3使用指南—IDF版 V1.6》第二十八章 內部温度傳感器實驗

第二十八章 內部温度傳感器實驗

1)實驗平台:正點原子DNESP32S3開發板

2)章節摘自【正點原子】ESP32-S3使用指南—IDF版 V1.6

3)購買鏈接:https://detail.tmall.com/item.htm?&id=768499342659

4)全套實驗源碼+手冊+視頻下載地址:http://www.openedv.com/docs/boards/esp32/ATK-DNESP32S3.html

5)正點原子官方B站:https://space.bilibili.com/394620890

6)正點原子DNESP32S3開發板技術交流羣:132780729

本章,我們將介紹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 由温度偏移決定。温度傳感器在不同的實際使用環境(測量温度範圍)下,温度偏移不同,見下表所示。


表28.1.1 温度傳感器的温度偏移

28.2 硬件設計

28.2.1 例程功能

本章實驗功能簡介:通過ADC的通道讀取ESP32-S3內部温度傳感器的電壓值,並將其轉換為温度值,顯示在SPILCD屏上。

28.2.2 硬件資源

  1. XL9555

IIC_SDA-IO41

IIC_SCL-IO42

  1. SPILCD

CS-IO21

SCK-IO12

SDA-IO11

DC-IO40(在P5端口,使用跳線帽將IO_SET和LCD_DC相連)

PWR- IO1_3(XL9555)

RST- IO1_2(XL9555)

  1. 內部温度傳感器

28.2.3 原理圖

本章實驗使用的ADC為ESP32-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);

該函數的形參描述,如下表所示:

表28.3.2.1 函數temperature_sensor_install()形參描述

該函數的返回值描述,如下表所示:

表28.3.2.2 函數temperature_sensor_install()返回值描述

該函數使用temperature_sensor_config_t類型的結構體變量傳入,該結構體的定義如下:

表28.3.2.3temperature_sensor_config_t結構體參數值描述

完成上述結構體參數配置之後,可以將結構傳遞給 temperature_sensor_install() 函數,用以實例化温度傳感器。

2,使能温度傳感器

該函數用於使能温度傳感器,其函數原型如下:

esp_err_t temperature_sensor_enable(temperature_sensor_handle_ttsens);

該函數的形參描述,如下表所示:

表28.3.2.3 函數temperature_sensor_enable ()形參描述

該函數的返回值描述,如下表所示:

表28.3.2.4 函數temperature_sensor_enable ()返回值描述

3,獲取傳輸的傳感器數據

該函數用於獲取傳輸的傳感器數據,其函數原型如下:

esp_err_t temperature_sensor_get_celsius(temperature_sensor_handle_ttsens,                                              float *out_celsius);

該函數的形參描述,如下表所示:

表28.3.2.5 函數temperature_sensor_get_celsius ()形參描述

該函數的返回值描述,如下表所示:

表28.3.2.6 函數temperature_sensor_get_celsius ()返回值描述

4,失能温度傳感器

該函數用於獲取傳輸的傳感器數據,其函數原型如下:

esp_err_t temperature_sensor_disable(temperature_sensor_handle_ttsens);

該函數的形參描述,如下表所示:

表28.3.2.7 函數temperature_sensor_disable ()形參描述

該函數的返回值描述,如下表所示:

表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文件


/* 參數定義 */

#define SENSOR_RANGE_MIN    20     /* 要測試温度的最小值 */

#define SENSOR_RANGE_MAX    50     /* 要測試温度的最大值 */

2,sensor.c文件

在上述sensor.h文件中我們通過宏定義的方式定義了待測試温度的最大與最小值,該值在不超過理論值的基礎上,開發者可以自行定義。

esp_err_t rev_flag;

temperature_sensor_handle_t temp_handle = NULL; /* 温度傳感器句柄 */

/**

* @brief       初始化內部温度傳感器

* @param無

* @retval      無

*/

voidtemperature_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      返回內部温度值

*/

shortsensor_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 內部温度傳感器實驗測試圖

大家可以看看你的温度值與實際是否相符合(因為芯片會發熱,所以一般會比實際温度偏高)?

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.