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

Почему АЦП ESP32 неточно измеряет напряжение?

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

АЦП ESP32 — 12-разрядный, но по даташиту его реальная точность заметно хуже 1/4096. Ошибку дают три вещи: разброс внутреннего опорного между экземплярами, нелинейность и края шкалы.

Без калибровки

Espressif прямо пишет: результаты измерений у разных чипов по умолчанию отличаются на ±6 %. Наш расчёт: напряжение 1,5 В разные платы покажут в пределах примерно от 1,41 до 1,59 В. Поэтому «сырой» код analogRead, пересчитанный простой пропорцией, для измерений не годится.

С калибровкой ESP-IDF

ESP-IDF умеет переводить код в милливольты с калибровкой по значению опорного, записанному в eFuse на заводе. Даташит даёт для неё полную ошибку:

ОслаблениеНормированный диапазонПолная ошибкаОтносительная ошибка у верхнего края (наш расчёт)
0100–950 мВ±23 мВ±2,4 %
1100–1250 мВ±30 мВ±2,4 %
2150–1750 мВ±40 мВ±2,3 %
3150–2450 мВ±60 мВ±2,4 %

Вне этих диапазонов ошибка не нормирована: ниже 100–150 мВ точность не гарантирована, а при ослаблении 3 выше кода 3000 (около 2450 мВ) точность хуже табличной.

Нелинейность

Интегральная и дифференциальная нелинейность — до ±12 и ±7 младших разрядов, причём даташит нормирует их при выключенных Wi-Fi и Bluetooth, с конденсатором 100 нФ на входе и при 25 °C. Дифференциальную нелинейность Espressif советует сглаживать усреднением.

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

  1. Калибровка ESP-IDF вместо пересчёта пропорцией.
  2. Сигнал внутри диапазона — делителем или смещением загнать его в 150–2450 мВ, а лучше в более узкий диапазон с меньшей ошибкой.
  3. Конденсатор 100 нФ на входе и измерения при выключенном радио, если это возможно.
  4. Калибровка по двум точкам на своей плате (убирает смещение и наклон), по нескольким — против нелинейности, или внешний АЦП.

Делитель и ослабление под нужный диапазон подберёт калькулятор АЦП ESP32, выводы АЦП — на странице ESP32. Для сравнения: у Arduino UNO главная ошибка — опорное напряжение, см. «С какой точностью Arduino измеряет напряжение?».

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

Почему ESP32 плохо измеряет напряжения в десятки милливольт?

Даташит нормирует ошибку только в рабочих диапазонах, которые начинаются от 100 мВ при ослаблении 0 и 1 и от 150 мВ при ослаблении 2 и 3. Ниже этого точность не гарантирована, поэтому малые напряжения поднимают смещением или усилителем, чтобы они попали в рабочий диапазон.

Можно ли измерить 3,3 В без делителя?

При ослаблении 3 нормированный диапазон заканчивается на 2450 мВ, а выше кода 3000 Espressif прямо предупреждает о худшей точности. Поэтому 3,3 В подают через делитель, например 1:2, чтобы напряжение на выводе оставалось внутри 150–2450 мВ.

Помогает ли усреднение?

Против шума и дифференциальной нелинейности — да, это советует и Espressif. Против погрешности опорного и интегральной нелинейности — нет: они одинаковы в каждом измерении. Смещение и наклон убирает калибровка по двум точкам, нелинейность — только по нескольким известным напряжениям; другой путь — внешний АЦП.

Источники

  1. Espressif. ESP32 Series Datasheet v5.3 — разд. 4.9.1, табл. 4-3 — DNL ±7 LSB, INL ±12 LSB (контроллер RTC, внешний конденсатор 100 нФ, постоянный сигнал, 25 °C, Wi-Fi и Bluetooth выключены); при ослаблении 3 и коде выше 3000 (около 2450 мВ) точность хуже; для лучшего DNL — усреднение; без калибровки результаты разных чипов отличаются на ±6 %; табл. 4-4 — полная ошибка после калибровки по Vref из eFuse: ослабление 0 — 100–950 мВ, ±23 мВ; 1 — 100–1250 мВ, ±30 мВ; 2 — 150–1750 мВ, ±40 мВ; 3 — 150–2450 мВ, ±60 мВ
  2. Espressif. ESP-IDF Programming Guide (stable), ESP32: ADC, ADC Oneshot Mode Driver, ADC Calibration Driver — драйвер однократного преобразования и драйвер калибровки, переводящий код АЦП в милливольты

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