Почему АЦП ESP32 неточно измеряет напряжение?
Обновлено Редакция GAW
АЦП ESP32 — 12-разрядный, но по даташиту его реальная точность заметно хуже 1/4096. Ошибку дают три вещи: разброс внутреннего опорного между экземплярами, нелинейность и края шкалы.
Без калибровки
Espressif прямо пишет: результаты измерений у разных чипов по умолчанию отличаются на ±6 %. Наш расчёт: напряжение 1,5 В разные платы покажут в пределах примерно от 1,41 до 1,59 В. Поэтому «сырой» код analogRead, пересчитанный простой пропорцией, для измерений не годится.
С калибровкой ESP-IDF
ESP-IDF умеет переводить код в милливольты с калибровкой по значению опорного, записанному в eFuse на заводе. Даташит даёт для неё полную ошибку:
| Ослабление | Нормированный диапазон | Полная ошибка | Относительная ошибка у верхнего края (наш расчёт) |
|---|---|---|---|
| 0 | 100–950 мВ | ±23 мВ | ±2,4 % |
| 1 | 100–1250 мВ | ±30 мВ | ±2,4 % |
| 2 | 150–1750 мВ | ±40 мВ | ±2,3 % |
| 3 | 150–2450 мВ | ±60 мВ | ±2,4 % |
Вне этих диапазонов ошибка не нормирована: ниже 100–150 мВ точность не гарантирована, а при ослаблении 3 выше кода 3000 (около 2450 мВ) точность хуже табличной.
Нелинейность
Интегральная и дифференциальная нелинейность — до ±12 и ±7 младших разрядов, причём даташит нормирует их при выключенных Wi-Fi и Bluetooth, с конденсатором 100 нФ на входе и при 25 °C. Дифференциальную нелинейность Espressif советует сглаживать усреднением.
Как получить точнее
- Калибровка ESP-IDF вместо пересчёта пропорцией.
- Сигнал внутри диапазона — делителем или смещением загнать его в 150–2450 мВ, а лучше в более узкий диапазон с меньшей ошибкой.
- Конденсатор 100 нФ на входе и измерения при выключенном радио, если это возможно.
- Калибровка по двум точкам на своей плате (убирает смещение и наклон), по нескольким — против нелинейности, или внешний АЦП.
Делитель и ослабление под нужный диапазон подберёт калькулятор АЦП 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. Против погрешности опорного и интегральной нелинейности — нет: они одинаковы в каждом измерении. Смещение и наклон убирает калибровка по двум точкам, нелинейность — только по нескольким известным напряжениям; другой путь — внешний АЦП.
Источники
- 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 мВ
- Espressif. ESP-IDF Programming Guide (stable), ESP32: ADC, ADC Oneshot Mode Driver, ADC Calibration Driver — драйвер однократного преобразования и драйвер калибровки, переводящий код АЦП в милливольты
Нашли ошибку?
Смотрите также
- АЦП ESP32: ослабление и делительОслабление по напряжению, делитель, погрешность на входе, код Arduino и ESP-IDF
- ESP32: выводы и GPIO34 GPIO: функции, свободные выводы, только входы, флеш-память, strapping, JTAG, токи
- INL и DNLНелинейность АЦП: неравные ступени и изгиб характеристики, пропущенные коды
- С какой точностью Arduino измеряет напряжение?АЦП — около 0,2 %, опорное — до 7–9 % без калибровки