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 输出变化小,测量结果更加准确。
三:软件代码:// ESP32-S3 直接读取 ADXL354CZ 三轴模拟输出
// 传感器连接的 ADC 引脚
#define PIN_X 4 // GPIO1 (ADC1_CH3)
#define PIN_Y 5 // GPIO2 (ADC1_CH4)
#define PIN_Z 6 // GPIO3 (ADC1_CH5)
// ADXL354CZ 灵敏度 (根据 RANGE 跳线设置选择)
// ±2g 量程: 400 mV/g (典型值)
// ±8g 量程: 100 mV/g (典型值)
#define SENSITIVITY_MV_PER_G 400.0
// ESP32-S3 ADC 参考电压 (典型值 1100 mV)
#define VREF_MV 1100.0
void setup() {
Serial.begin(115200);
while (!Serial) delay(10);
// 设置 ADC 分辨率 (ESP32-S3 默认 13 位,可设为 12 位以兼容常见习惯)
analogReadResolution(12);
// 设置衰减,使输入范围覆盖 0~2500mV 左右
// ADC_ATTEN_DB_11 对应约 0~2500mV (取决于芯片)
analogSetAttenuation(ADC_ATTENDB_MAX);
Serial.println("ESP32-S3 ADC 读取 ADXL354CZ 开始...");
Serial.println("Sensitivity: " + String(SENSITIVITY_MV_PER_G) + " mV/g");
}
void loop() {
// 读取原始 ADC 值 (0~4095,12位分辨率下)
int rawX = analogRead(PIN_X);
int rawY = analogRead(PIN_Y);
int rawZ = analogRead(PIN_Z);
// 使用 analogReadMilliVolts 直接获取校准后的电压值 (单位 mV)
float mvX = analogReadMilliVolts(PIN_X);
float mvY = analogReadMilliVolts(PIN_Y);
float mvZ = analogReadMilliVolts(PIN_Z);
// 转换为加速度 (g)
float gX = mvX / SENSITIVITY_MV_PER_G;
float gY = mvY / SENSITIVITY_MV_PER_G;
float gZ = mvZ / SENSITIVITY_MV_PER_G;
// 串口输出
Serial.print("Raw: ");
Serial.print(rawX); Serial.print(", ");
Serial.print(rawY); Serial.print(", ");
Serial.print(rawZ);
Serial.print(" | mV: ");
Serial.print(mvX, 1); Serial.print(", ");
Serial.print(mvY, 1); Serial.print(", ");
Serial.print(mvZ, 1);
Serial.print(" | g: ");
Serial.print(gX, 4); Serial.print(", ");
Serial.print(gY, 4); Serial.print(", ");
Serial.print(gZ, 4);
Serial.println();
delay(1000);
}四:实物验证:
我要赚赏金
