模数转换器

  • adc
  • ADC

ESP32 ADC 有几个通道?采样率和有效位数是多少?

  • ESP32 的 ADC 共有 18 个通道。
  • 在停⽌ Wi-Fi 的情况且使用 ADC DMA 的情况下,采样率理论不超过 2 MHz。但实际建议使用更小的采样率。
  • 在 Wi-Fi 正常⼯作的情况下,能达到每秒 1000 次。
  • ADC 内部有效位数为 12 位。

悬空 ADC 引脚,打印出 VDD3P3 的值为 65535,那么 VDD3P3 的电压就是 65535/1024 ≈ 63 V。这个电压值不符,是什么原因?

ADC 输入范围需要大于 0 V 小于 3.3 V(不同型号芯片上限不同),悬空测量为未定义状态。

ESP32 ADC 的输入电阻是多少?

ADC 是电容性的,可以认为电阻很大

使用 ESP32 的 ADC 来检测电源电压,是否需要进行分压?

ESP32 的 ADC 参考电压为 1100 mV,可以通过配置内部衰减来增大 ADC 量程,量程范围可参考芯片手册 ADC 章节 如量程无法满足需求,可使用外部分压电路。

ESP32 芯片 ADC DMA 模式最高支持多大的采样频率?

理论最高支持 2 MHz 的采样频率。

ESP32 是否支持 ADC2 与蓝牙同时使用?

支持。

ESP32-S2 芯片 ADC DMA 模式支持的采样率范围是多大?

频率限制:611 Hz ~ 83333 Hz。

ESP32 的 ADC 支持多通道同时采样吗?

ESP32 的 ADC 不支持多通道同时采样,若使用 ADC 多通道采样,需采取轮询采样的方式来实现。

ESP32 芯片的 ADC 之间的测量误差是多大?

默认情况下,ESP32 芯片 ADC 之间的测量差异是 ±6%,可参考 《ESP32 技术规格书》

ESP32 能同时用两个 ADC 通道来测量不同的数据吗?比如电流和电压?

使用一个 ADC 无法做到同一时刻读取多个 ADC 通道的值,可以依次轮询读取两个 ADC 通道的数据。

ESP32-S3 ADC 配置为 ADC_ATTEN_DB_12 时,为何测量电压无法达到标称 3100 mV?

ESP32-S3 ADC1 或 ADC2 配置为 ADC_ATTEN_DB_12 时,测量电压范围为 0 ~ 3100 mV,但部分芯片最大电压测量值小于 3100 mV,可使用以下两种方法来解决这个问题:

  • 方案 1:避开使用边界电压值,可通过外部分压电路将输入电压维持在中间电压值附近,以获得更高的精度和一致性。
  • 方案 2:使用软件 ADC 扩展量程方案 ,将最大测量电压扩展到 3300 mV。 该方案已经在 IDF v4.4.8 与 v5.3.1 中支持 ESP32-S2 与 ESP32-S3 芯片,可基于该方案在其他 IDF 版本上进行移植。

使用 ESP-IDF v5.1 基于 ESP32-S3-WROOM-1 模组测试 ADC2,当 GPIO12 输入 3.3 V 电压时,读出的电压为 5 V,为什么?

I (455346) EXAMPLE: ADC2 Channel[1] Raw Data: 4095
I (455346) EXAMPLE: ADC2 Channel[1] Cali Voltage: 4985 mV
I (456346) EXAMPLE: ADC2 Channel[1] Raw Data: 4095
I (456346) EXAMPLE: ADC2 Channel[1] Cali Voltage: 4985 mV

使用 ESP32,在 esp_wifi_start() 和 esp_wifi_stop() 之间读取 adc2_get_raw() 操作失败,是什么原因?

由于 Wi-Fi 也需要使用 ADC2, 且 Wi-Fi 具有更高的访问优先级。因此,在 Wi-Fi 工作期间,应用程序使用 adc2_get_raw() 可能读取失败,建议检测该函数的返回值, 失败后重新进行一次测量。

ESP32 如何使用 ADC 两点校准方案?

ESP32 芯片出厂默认使用参考电压进行 ADC 校准,如果希望提高 ADC 测量的一致性,您可以修改 eFuse 中的校准方案为两点校准方案,但 eFuse 的更改是不可逆的,请谨慎操作。同时,推荐使用软件 ADC 两点校准方案:adc_tp_calibration

ESP32 模组的 ADC 采样误差应该如何计算?

以下以采样电池电压为例说明:

  1. 先计算模组 ADC 引脚实际检测到的电压:

$$ V_{\text{adc}} = 3.7\text{V} \cdot \frac{R_2}{R_1 + R_2} $$
将计算得到的 $V_{\text{adc}}$ 对照规格书中的 ADC 误差表,得到该输入电压下的 ADC 测量误差 $\mathrm{Atten}(V_{\text{adc}})$。

  1. 应用程序最终往往需要将 ADC 引脚测得的电压换算回电池电压:

$$ V_{\text{bat}} = \frac{V_{\text{adc}}}{R_2 / (R_1 + R_2)} $$

如果 $V_{\text{bat}} / V_{\text{adc}} = 4$,说明是 $1/4$ 分压,则 ADC 误差需要乘以 $4$,即:

$$ \mathrm{Atten} = \mathrm{Atten}(V_{\text{adc}}) \cdot 4 $$

如果 $V_{\text{bat}} / V_{\text{adc}} = 2$,说明是 $1/2$ 分压,则 ADC 误差需要乘以 $2$,即:

$$ \mathrm{Atten} = \mathrm{Atten}(V_{\text{adc}}) \cdot 2 $$

使用 ESP32-C3 的 ADC1 且衰减设置为 “ADC_ATTEN_DB_12” 时,不同芯片测得的上限电压不一致,这种现象正常吗?

这是正常现象。资料中提到的 0 ~ 2500 mV 是推荐的有效测量范围,并不是硬性上限。

这里的 0 ~ 2500 mV 指的是在硬件与软件校准后,官方保证测量精度的工作区间,并不代表超过 2500 mV 后 ADC 一定无法读取,或者一定会立刻饱和;超过该范围后,只是进入“未定义或不保证精度”的区域,因此不同芯片之间可能会出现一定差异,例如有的接近 2.9 V,有的只有 2.7 V 多。

如果需要测量 3.3 V,建议通过外部分压将输入电压降到 0 ~ 2.5 V 范围内,再配合衰减与校准驱动进行读取。