一:ESP32S3的ADC知识
ESP32-S3 集成了两个 12 位 SAR ADC,每个ADC有10个通道,共支持 20 个模拟通道输入,可测量最多来自 20 个管脚的模拟信号以及内部电压等内部信号。其中,为了实现更低功耗,ESP32-S3 的 ULP 协处理器也可以在睡眠方式下测量电压,此时,可通过设置阈值或其他触发方式唤醒 CPU。
ADC可以转换的电压范围由VREF决定,对于ESP32-S3通常是0到3.3V,但需要注意的是,ESP32具体的最大额定输入电压可能略有不同,检查相应数据手册的具体信息非常重要,通常会建议使用衰减器(Attenuation)功能或者额外的硬件如电压分压器来保证输入电压在规定范围内。
ESP32-S3内部还带了一个温度传感器,用于生成一个随温度变化的电压。内部 ADC 将传感器电压转化为一个数字量,温度传感器的测量范围为–20 °C 到 110 °C。温度传感器适用于监测芯片内部温度的变化,该温度值会随着微控制器时钟频率或 IO 负载的变化而变化。一般来讲,芯片内部温度会高于外部温度。二:ADC的基本参数
ADC 的基本参数通常包括以下几个:
通道和引脚: 不是所有的GPIO都可以用于ADC读取,需要查看ESP32S3的引脚图来确定哪些引脚支持ADC功能。
分辨率:指 ADC 的数字输出位数,也称为量化位数。例如,12 位 ADC 具有 4096 个离散的数字输出。
采样速率:指 ADC 可以进行采样的最大速率。对于 ESP32-S3,最大采样速率为 2.5 MS/s。
输入范围:指 ADC 可以测量输入信号的电压范围。对于 ESP32-S3,输入范围为 0-3.3V。
噪声:指 ADC 在采集时分辨率的误差和干扰的影响。噪声越小,ADC 测量结果越精准。
稳定性:指 ADC 输出的稳定性。稳定性好的 ADC 输出变化小,测量结果更加准确。
三:软件代码
#include "driver/temperature_sensor.h"
#include <Arduino.h>
// 引入ESP32-S3温度传感器所需的IDF驱动头文件
extern "C" {
#include "driver/temperature_sensor.h"
}
// 定义测量范围。设置得越接近实际工作温度,精度越高,这里设置20~50℃适用于大多数室温场景[citation:4][citation:10]
#define TEMP_RANGE_MIN 20
#define TEMP_RANGE_MAX 50
temperature_sensor_handle_t temp_handle = NULL;
void setup() {
Serial.begin(115200);
Serial.println("ESP32-S3 内部温度传感器准备就绪");
// 1. 配置传感器参数
temperature_sensor_config_t temp_sensor_config = {
.range_min = TEMP_RANGE_MIN,
.range_max = TEMP_RANGE_MAX,
};
// 2. 安装传感器驱动
esp_err_t ret = temperature_sensor_install(&temp_sensor_config, &temp_handle);
if (ret == ESP_OK) {
Serial.println("温度传感器初始化成功");
} else {
Serial.println("传感器初始化失败,请检查配置");
return;
}
// 3. 使能传感器,开始工作
temperature_sensor_enable(temp_handle);
}
void loop() {
float temperature_celsius = 0.0;
// 4. 读取温度数据,单位为摄氏度
esp_err_t ret = temperature_sensor_get_celsius(temp_handle, &temperature_celsius);
if (ret == ESP_OK) {
Serial.print("芯片内部温度: ");
Serial.print(temperature_celsius);
Serial.println(" °C");
} else {
Serial.println("读取温度失败");
}
delay(1000); // 每秒读取一次
}头文件引入方式:由于这是Arduino项目,直接包含IDF头文件会报错,必须使用 extern "C" {} 包裹,告诉编译器按C语言的方式去链接函数。
数据类型与API:代码中使用的 temperature_sensor_handle_t 、temperature_sensor_config_t 等类型和函数,与ESP-IDF编程中的用法完全一致,这也是官方推荐的操作方式。
关于测量范围 (range_min /range_max):这个设置非常重要。ESP32-S3的内部传感器在不同温度区间有不同的校准曲线,将范围设置得越窄、越贴近实际工作温度,读出的数据就越准。如果只是放在室温下测,设为 20,50比设为 -10,80更准确。
功耗优化:如果不需要连续监控,可以在读完温度后调用 temperature_sensor_disable 关闭传感器以节省电量,下次读取前再调用temperature_sensor_enable即可。
核心提醒:这是芯片内部的温度,读数值通常会高于环境气温,别把它当成室温计用。四:实物验证:
软件截图如下所示:

我要赚赏金
