• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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)

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