13. 内部温度传感器

news/2025/3/21 22:30:57/文章来源:https://www.cnblogs.com/FlurryHeart/p/18785951

一、内部温度传感器简介

  温度传感器生成一个随温度变化的电压。内部 ADC 将传感器电压转化为一个数字量。温度传感器的测量范围为 –20 °C 到 110 °C。温度传感器适用于监测芯片内部温度的变化,该温度值会随着微控制器时钟频率或 IO 负载的变化而变化。一般来讲,芯片内部温度会高于外部温度。

  温度传感器的输出值需要使用转换公式转换成实际的温度值(℃)。转换公式如下:

\[T(℃) = 0.4386 * VALUE - 27.88 * offset - 20.52 \]

  其中 VALUE温度传感器的输出值offset温度偏移 决定。温度传感器在不同的实际使用环境(测量温度范围)下,温度偏移不同,见下表所示。

测量范围(℃) 温度偏移(℃)
50 ~ 110 -2
20 ~ 100 -1
-10 ~ 80 0
-15 ~ 50 1
-20 ~ 20 2

二、内部温度传感器常用函数

  ESP IDF 提供了一套 API 来配置温度传感器。要使用此功能,需要导入必要的头文件:

#include "driver/temperature_sensor.h"

2.1、设置测试温度的最大与最小值

  我们可以使用 temperature_sensor_install() 函数 设置测试温度的最大与最小值,它的函数原型如下:

/*** @brief 设置测试温度的最大与最小值* * @param tsens_config 内部温度传感器配置结构体* @param ret_tsens 内部温度传感器句柄* @return esp_err_t ESP_OK表示配置成功,其它表示配置失败*/
esp_err_t temperature_sensor_install(const temperature_sensor_config_t *tsens_config, temperature_sensor_handle_t *ret_tsens);

  形参 tsens_config内部温度传感器配置结构体,它的定义如下:

typedef struct 
{int range_min;                              // 温度范围最小值int range_max;                              // 温度范围最大值temperature_sensor_clk_src_t clk_src;       // 温度传感器时钟源struct {uint32_t allow_pd;                      // 如果设置,驱动程序将在进入/存在睡眠模式之前/之后备份/恢复温度传感器寄存器。} flags;                                    // 温度传感器配置标志} temperature_sensor_config_t;

  形参 tsens_config 的成员 clk_src温度传感器时钟源,它的取值如下:

typedef enum 
{TEMPERATURE_SENSOR_CLK_SRC_RC_FAST = SOC_MOD_CLK_TEMP_SENSOR,   // Select RC_FAST as the source clockTEMPERATURE_SENSOR_CLK_SRC_DEFAULT = SOC_MOD_CLK_TEMP_SENSOR,   // Select RC_FAST as the default choice
} soc_periph_temperature_sensor_clk_src_t;

2.2、使能温度传感器

  我们可以使用 temperature_sensor_enable() 函数 使能温度传感器,它的函数原型如下:

/*** @brief 使能内部温度传感器* * @param tsens 内部温度传感器句柄* @return esp_err_t ESP_OK表示使能成功,其它表示使能失败*/
esp_err_t temperature_sensor_enable(temperature_sensor_handle_t tsens);

2.3、获取内部温度传感器的数据

  我们可以使用 temperature_sensor_get_celsius() 函数 获取内部温度传感器的数据,它的函数原型如下:

/*** @brief 获取内部温度传感器的数据* * @param tsens 内部温度传感器句柄* @param out_celsius 获取到的传感器数据* @return esp_err_t ESP_OK表示获取成功,其它表示获取失败*/
esp_err_t temperature_sensor_get_celsius(temperature_sensor_handle_t tsens, float *out_celsius);

2.4、失能温度传感器

  我们可以使用 temperature_sensor_disable() 函数 失能温度传感器,它的函数原型如下:

/*** @brief 失能温度传感器* * @param tsens 内部温度传感器句柄* @return esp_err_t ESP_OK表示失能成功,其它表示失能失败*/
esp_err_t temperature_sensor_disable(temperature_sensor_handle_t tsens);

三、实验例程

  这里,我们在【components】文件夹下的【peripheral】文件夹下的【inc】文件夹(用来存放头文件)新建一个 bsp_temperature_sensor.h 文件,在【components】文件夹下的【peripheral】文件夹下的【src】文件夹(用来存放源文件)新建一个 bsp_temperature_sensor.c 文件。

#ifndef __BSP_TEMPERATURE_SENSOR_H__
#define __BSP_TEMPERATURE_SENSOR_H__#include "driver/temperature_sensor.h"extern temperature_sensor_handle_t g_temperature_sensor_handle;void bsp_temperature_sensor_init(temperature_sensor_handle_t *handle, int min, int max);
float bsp_temperature_sensor_get_temperature(temperature_sensor_handle_t handle);#endif // !__BSP_TEMPERATURE_SENSOR_H__
#include "bsp_temperature_sensor.h"temperature_sensor_handle_t g_temperature_sensor_handle;/*** @brief 初始化内部温度传感器* * @param handle 内部温度传感器句柄* @param min 温度范围的最小值* @param max 温度范围的最大值*/
void bsp_temperature_sensor_init(temperature_sensor_handle_t *handle, int min, int max)
{temperature_sensor_config_t temperature_sensor_config = {0};temperature_sensor_config.clk_src = TEMPERATURE_SENSOR_CLK_SRC_DEFAULT;     // 时钟源temperature_sensor_config.range_min = min;                                  // 温度范围的最小值temperature_sensor_config.range_max = max;                                  // 温度范围的最大值temperature_sensor_install(&temperature_sensor_config, handle);
}/*** @brief 获取内部温度传感器的当前数据* * @param handle 内部温度传感器句柄* @return float 内部温度传感器的当前数据*/
float bsp_temperature_sensor_get_temperature(temperature_sensor_handle_t handle)
{float temperature = 0;temperature_sensor_enable(handle);                                          // 使能温度传感器temperature_sensor_get_celsius(handle, &temperature);                       // 获取传输的传感器数据temperature_sensor_disable(handle);                                         // 禁用温度传感器,节约功耗return temperature;
}

  修改【main】文件夹下的 main.c 文件。

#include <stdio.h>#include "freertos/FreeRTOS.h"#include "bsp_temperature_sensor.h"// app_main()函数是ESP32的入口函数,它是FreRTOS的一个任务,任务优先级是1
// main()函数是C语言入口函数,它会在编译过程中插入到二进制文件中的
void app_main(void)
{bsp_temperature_sensor_init(&g_temperature_sensor_handle, 20, 50);while (1){float temperature = bsp_temperature_sensor_get_temperature(g_temperature_sensor_handle);printf("temperature: %f\n", temperature);// 将一个任务延迟给定的滴答数,IDF中提供pdMS_TO_TICKS可以将指定的ms转换为对应的tick数vTaskDelay(pdMS_TO_TICKS(1000));}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/902682.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学嵌入式C语言,看这一篇就够了(6)

C语言的语句和块 C语言标准中一共提供6种语句 注意:C语言中的语句要指明执行的操作,并且没有特殊情况,语句是按照顺序执行的一般把实现某些功能的语句整合在一起,构成一个语法单元,C语言标准的语法单元也被称为块,也被称为块语句 复合语句 复合语句可以限制语句的作用范围…

P3375 【模板】KMP

P3375 【模板】KMP 题目描述 给出两个字符串 \(s_1\) 和 \(s_2\),若 \(s_1\) 的区间 \([l, r]\) 子串与 \(s_2\) 完全相同,则称 \(s_2\) 在 \(s_1\) 中出现了,其出现位置为 \(l\)。 现在请你求出 \(s_2\) 在 \(s_1\) 中所有出现的位置。 定义一个字符串 \(s\) 的 border 为 …

Cursor 使用教程

目录核心功能TabAICHATCOMPOSER@DocsWebGitNotepadCodebase技巧和思路如果Cursor乱改代码怎么办? 核心功能 Tab 这个是Cursor最为强大的功能,使用也很简单,在编写代码的时候,如果出现了灰色的提示词,直接按Tab就可以自动补全了最后的灰色的就是提示词 Cursor的光标预测也很…

C语言学习打卡第二天(2025.3.21)

时间有点少,今天也没学多少,只把指针基础概念学了一下(例如指针变量,下标法等),题也只做了三道。

3.21 学习记录

设计科技查询手机端系统,实现了政策关键字进行模糊匹配查询,点击下方的政策名称,可以打开新窗口,显示政策全文,实现分页查询,分类查询 采用springboot+vue3实现

P8436 【模板】边双连通分量

P8436 【模板】边双连通分量 题目描述 对于一个 \(n\) 个节点 \(m\) 条无向边的图,请输出其边双连通分量的个数,并且输出每个边双连通分量。 输入格式 第一行,两个整数 \(n\) 和 \(m\)。 接下来 \(m\) 行,每行两个整数 \(u, v\),表示一条无向边。 不保证图为简单图,图中可…

SvelteKit 最新中文文档教程(8)—— 部署 Node 服务端

前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1:Svelte 以其独特的编译时优化机制著称,具有轻量级、高性能、易上手等特性,非常适合构…

第四篇:本地私有化部署大模型(Ollama、vLLM、LMDeploy)

魔塔社区平台介绍 量化:将高精度数值转换成低精度表示的过程(通常用于减少模型的内存和提高推理速度) Ollama部署大模型 linux安装miniconda# 下载 Miniconda 安装脚本 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh # 运行安装脚本 bash…

用Adobe Illustrator编辑ArcGIS地图的方法

本文介绍在ArcGIS下属的ArcMap软件中,将绘制好的地图导出为.ai或者.eps格式文件,并在Adobe Illustrator软件中进一步编辑地图,并最终导出为图片格式的结果文件的方法~本文介绍在ArcGIS下属的ArcMap软件中,将绘制好的地图导出为.ai或者.eps格式文件,并在Adobe Illustrator软…

协议版iM蓝号检测,批量筛选iMessages数据,无痕检测是否开启iMessage服务

一、实现iMessage数据检测的两种方式:1.人工筛选,将要验证的号码输出到文件中,以逗号分隔。再将文件中的号码粘贴到iMessage客户端的地址栏,iMessage客户端会自动逐个检验该号码是否为iMessage账号,检验速度视网速而定。红色表示不是iMessage账号,蓝色表示iMessage账号。2…

记录项目调用链路

记录项目调用链路 内容 要理清项目中执行链路的调用关系,可以通过以下工具分类实现,涵盖从代码静态分析到运行时动态追踪的全链路管理:一、代码层调用关系分析 1. 静态代码分析工具PyCallGraph(Python) 生成代码调用关系图,直观展示函数调用链路。 pip install pycallgra…

部署kibana

获取kibana安装包 [root@elk1 ~]# wget https://artifacts.elastic.co/downloads/kibana/kibana-7.17.28-amd64.deb[root@elk1 ~]# ls kibana-7.17.28-amd64.deb kibana-7.17.28-amd64.deb# 安装kibana [root@elk1 ~]# dpkg -i kibana-7.17.28-amd64.deb 配置kibana [root@elk…