Перейти к содержанию

Какое напряжение может измерить АЦП ESP32-C3?

Обновлено Редакция GAW

У ESP32-C3 два 12-битных АЦП, но пользоваться удобно одним — ADC1 на выводах GPIO0–GPIO4. Входной диапазон задаёт ослабление (attenuation): чем оно больше, тем шире диапазон и тем больше ошибка. Данные — по таблице 5-6 даташита Espressif, после калибровки:

ОслаблениеДиапазонОшибка
ATTEN00–750 мВ±10 мВ
ATTEN10–1050 мВ±10 мВ
ATTEN20–1300 мВ±10 мВ
ATTEN3 (ADC_11db в Arduino, по умолчанию)0–2500 мВ±35 мВ

Наш расчёт: ±35 мВ на 2500 мВ — 1,4 % шкалы, ±10 мВ на 750 мВ — 1,3 %. Чем ближе сигнал к верху своего диапазона, тем меньше относительная ошибка, поэтому ослабление выбирают по максимуму сигнала.

Каналы

АЦПКаналыВыводыКалибровка
ADC15GPIO0–GPIO4заводская
ADC21GPIO5нет; на части ревизий не работает

GPIO0 и GPIO1 заодно служат выводами часового кварца 32 кГц: если он стоит на плате, под АЦП остаются GPIO2–GPIO4. Ограничения остальных выводов — на странице ESP32-C3.

Как получить точность

  • Делитель для напряжений выше 2,5 В — сопротивления подберёт калькулятор делителя.
  • Конденсатор 100 нФ на входе: в таких условиях Espressif измерял нелинейность АЦП.
  • Калиброванный результат, а не «сырой» код: в Arduino это analogReadMilliVolts(), в ESP-IDF — драйвер калибровки, как описано в статье «АЦП ESP32». Перевести код в напряжение для разных ослаблений поможет калькулятор АЦП ESP32.

Похожие вопросы

Можно ли пользоваться ADC2 на GPIO5?

Даташит не советует на него рассчитывать: ADC2 у ESP32-C3 — один канал без заводской калибровки, а у части ревизий чипа он вовсе неработоспособен (Espressif отсылает к errata). Для измерений берите ADC1 на GPIO0–GPIO4.

Как измерить напряжение аккумулятора 4,2 В?

Через делитель, который опускает 4,2 В ниже 2,5 В. Наш расчёт: делитель 100 кОм + 100 кОм даёт 2,1 В — в пределах ATTEN3 с запасом; конденсатор 100 нФ на входе АЦП, как в условиях измерения даташита, сгладит выборку. Делитель постоянно разряжает аккумулятор током 21 мкА.

Почему без делителя на 3,3 В АЦП показывает максимум?

Потому что 3,3 В выше диапазона 0–2500 мВ при наибольшем ослаблении: всё, что выше, АЦП не различает. Для измерения таких напряжений нужен делитель.

Источники

  1. Espressif. ESP32-C3 Series Datasheet v2.4 — разд. 4.2.2.1: два 12-битных SAR АЦП; ADC1 — 5 каналов, откалиброван на заводе; ADC2 — 1 канал, без заводской калибровки, на некоторых ревизиях чипа неработоспособен (см. errata); IO MUX: ADC1_CH0–CH4 — GPIO0–GPIO4, ADC2_CH0 — GPIO5; табл. 5-5: DNL ±7 LSB, INL ±12 LSB с конденсатором 100 нФ на входе, постоянным сигналом, при 25 °C и выключенном Wi-Fi, до 100 тыс. выборок/с; табл. 5-6: после калибровки ATTEN0 0–750 мВ ±10 мВ, ATTEN1 0–1050 мВ ±10 мВ, ATTEN2 0–1300 мВ ±10 мВ, ATTEN3 0–2500 мВ ±35 мВ
  2. Espressif. Arduino-ESP32 Documentation: ADC; arduino-esp32 3.3.12, cores/esp32/esp32-hal-adc.c — analogRead — некалиброванный код, analogReadMilliVolts — калиброванные милливольты; разрешение по умолчанию 12 бит; таблица ослаблений для ESP32-C3: ADC_0db 0–750 мВ, ADC_2_5db 0–1050 мВ, ADC_6db 0–1300 мВ, ADC_11db 0–2500 мВ; по умолчанию в ядре — ADC_11db (cores/esp32/esp32-hal-adc.c тега 3.3.12: static uint8_t __analogAttenuation = ADC_11db)

Нашли ошибку?