• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ESP8266 вопросы по ADC

NStorm

New member
Раньше на ESP не юзал АЦП толком. Везде пишут, что на "голом модуле/чипе" вроде ESP-12F диапазон напряжений АЦП 0-1В. Без объяснений нормальных. Откуда такое берется? Я бы предположил, что ИОН - бандгап на 1.1В, что как бы более распространенное значение, но подтверждения этому не нашел. Опять же, неужели за Vref взять Vcc нельзя и использовать диапазон 0-3.3В? Вот тут вроде как написано, что можно: https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/api-reference/peripherals/adc.html но как-то смутно написано.
Вопросы:
1. Так можно или нет?
2. Есть ли всё-таки ИОН и сколько он, когда выбран НЕ Vcc в кач-ве Vref? Ну т.е. насколько он стабилен? Бандгап там или всё-таки ограничение АЦП 0-1В откуда-то из другого места растет?
3. Как-то калибровать можно/нужно АЦП под свой БП? Или ИОН стабилен в независимости от Vcc?
 

NStorm

New member
Погуглил подробнее, нашел в общем некоторые доводы, выглядящие более-менее достоверно. ИОН есть, около 1В и правда он там. Относительно стабилен. Брать Vcc в кач-ве опорного нельзя. Точность АЦП так себе, вайфай сильно влияет на работу. Видимо нужна некая цифровая фильтрация для повышения точности.

EDIT: Первое, что мне нужно от АЦП сейчас - замеры сетевого напряжения. Для этого есть трансформаторный модуль ZMPT101B. Надо или его выход подстроить, чтобы в пределах 0-1В выход выдавал, или делитель добавить. Т.к. мне по факту в этой задаче нужен только RMS, думаю как-то так фильтровать:
Код:
#define INITIAL 512  /* Initial value of the filter memory. */
#define SAMPLES 512

uint16_t rms_filter(uint16_t sample)
{
    static uint16_t rms = INITIAL;
    static uint32_t sum_squares = 1UL * SAMPLES * INITIAL * INITIAL;

    sum_squares -= sum_squares / SAMPLES;
    sum_squares += (uint32_t) sample * sample;
    if (rms == 0) rms = 1;    /* do not divide by zero */
    rms = (rms + sum_squares / SAMPLES / rms) / 2;
    return rms;
}
(источник функции приближения RMS)

Что думаете?
 
Сверху Снизу