• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Высокое потребление ESP при EN=LOW

Evgeny D

Member
Подскажите, сколько должен потреблять модуль ESP8266-01 при EN=LOW после сеанса работы? У меня жрет 10 мкА, но я встречал экземпляры которые потребляли 0 мкА. Мне нужно, чтобы у всех было около 0 мкА.

Алгоритм:
ESP включает подачей HIGH на пин CHIP_EN микроконтроллер attiny85. После взаимодействия по i2c (attiny85 slave, ESP master), attiny85 получает команду на сон от ESP и через 25 мс CHIP_EN переводит в LOW.

Еще одна проблема, которая может быть связана: светодиод после выключения остается тускло светиться потребляя 3-4мкА...

Итого мы имеем 10 мкА жрет недовыключенный ESP или его память + 5мкА утекает через TX пина ESP.

Опытным путем установлено, что модули с памятью cFeon потребляют 0 мкА.

Электрическая схема:
scheme (1).png

Код ESP:
void loop()
{
... // цикл связи
masterI2C.sendCmd('Z'); // готов спать, attiny
ESP.deepSleep(0, RF_DEFAULT);
}

Что пытался сделать и НЕ ПОМОГЛО:
1. Увеличивал время до выключения ESP до 100мс.

2. Вручную отключал подтягивающие резисторы после i2c у attiny85 (в tinycore была до 2020г ошибка - оставались INPUT_PULLUP)

3. Вручную переводил RX, TX, 0, 2 у ESP в INPUT.

4. Мне рассказали, что неплохо бы соблюдать тайминги ESP:
Добавил конденсаторы 0.1 мкФ между CHIP_EN-GND и 0.033 между RESET-GND.
Убрал конденсатор 1мкФ между RESET-GND на самом модуле ESP-01S.

Screenshot at Mar 27 16-10-26.png

Железо:

1. ESP01-S
память:
DP2016
25V080ASIG
P2B285A

ток 10 мкА + светодиод TX 5 мкА

2. ESP01-S
память
HB2035
25V080ASIG
P2F117A

ток 10 мкА + светодиод TX 5 мкА

3. ESP01-S
память:
cFeon
080B-104HIP
K80HL09
1940HKY

ток почти 0 мкА + тусклое свечение светодиода 5 мкА


4. ESP01
память
T25S80
PQ19t2
P24049

ток то 6 мкА, то 15 мкА
 

pvvx

Активный участник сообщества
Подскажите, сколько должен потреблять модуль ESP8266-01 при EN=LOW после сеанса работы?
У меня жрет 10 мкА, но я встречал экземпляры которые потребляли 0 мкА. Мне нужно, чтобы у всех было около 0 мкА.
Модуль с Flash не может потреблять 0 мкА, если не отключено питание.
4. ESP01 память T25S80
ток то 6 мкА, то 15 мкА
в доке значится такое потребление:
Типичное - 13, макс 25 мкА при бездействии.
Если -же дали команду deep-sleep, то 2..5 мкА плюс ваш светодиод.
 

pvvx

Активный участник сообщества
У вас ещё MCP1700 будет кушать не менее 2-х мкА. Тем более она не потянет даже малую передачу ESP8266 без емкости от сотен мФ в питании, а они все с утечкой и хорошей.
Так что о никаких менее пары мкА и говорить нечего.
 

pvvx

Активный участник сообщества
Что пытался сделать и НЕ ПОМОГЛО:
1. Увеличивал время до выключения ESP до 100мс.
В старых SDK по команде deep-sleep закрываются все соединения, заряжается софт-таймер на 100 мс. По срабатыванию таймера отключается всё остальное, а команда deep-sleep для Flash передается в самом конце, в процедуре находящейся в IRAM вызываемой как call() из Flash, затем выключается питание CPU через регистры RTC, но это происходит медленно, с тактом у RTC в несколько мкс и проц успевает выполнить стоящую за выводом в регистры RTC команду ret, вернуться в место вызова из уже выключенной Flash и "кэш", нарваться на exсeption и прописать код exсeption в "EEPROM", благополучно затерев ID кода завершения указывающий что по старту надо восстановление после deep-sleep...
В новых версиях SDK наверно всё ещё ужаснее...
2. Вручную отключал подтягивающие резисторы после i2c у attiny85 (в tinycore была до 2020г ошибка - оставались INPUT_PULLUP)
А зачем у вас вообще резисторы на шине I2C между контролерами с вашей программой? :oops:

3. Вручную переводил RX, TX, 0, 2 у ESP в INPUT.
А у неё есть другие регистры где назначается состояние пинов в спящих режимах...
И не понятно зачем вы это делали - вы же отключаете чипу внутренний ключ питания входом CHIP_EN.
4. Мне рассказали, что неплохо бы соблюдать тайминги ESP:
Глупости какие-то вам выдумали. Кондеры нужны - иначе ESP будет ловить любые помехи...
 

Evgeny D

Member
У вас ещё MCP1700 будет кушать не менее 2-х мкА.
Да, я писал цифры без MCP1700 и attiny.
ESP + attiny + MCP1700 у меня прыгает 19-25мкА. И это плохо. Хочется 6-11мкА:

Без ESP мультиметр прыгает 6-11мкА, а если подключить измеритель потребления, то будет такой график: MCP1700 + attiny считающий импульсы:
photo_2021-03-28_11-43-25.jpg

В старых SDK по команде deep-sleep закрываются все соединения, заряжается софт-таймер на 100 мс. По срабатыванию таймера отключается всё остальное, а команда deep-sleep для Flash передается в самом конце, в процедуре находящейся в IRAM вызываемой как call() из Flash, затем выключается питание CPU через регистры RTC, но это происходит медленно, с тактом у RTC в несколько мкс и проц успевает выполнить стоящую за выводом в регистры RTC команду ret, вернуться в место вызова из уже выключенной Flash и "кэш", нарваться на exсeption и прописать код exсeption в "EEPROM", благополучно затерев ID кода завершения указывающий что по старту надо восстановление после deep-sleep...
В новых версиях SDK наверно всё ещё ужаснее...
Вот это крутая информация! А Flash выключатся какой-то командой по SPI? А это одна команда для всех моделей Flash или ESP знает производителей и шлет персональные команды каждому.

А зачем у вас вообще резисторы на шине I2C между контролерами с вашей программой?
ээээ i2c же нужны подтягивающие резисторы? Или можно внутренние резисторы использовать? (facepalm)

А у неё есть другие регистры где назначается состояние пинов в спящих режимах...
ушел гуглить

И не понятно зачем вы это делали - вы же отключаете чипу внутренний ключ питания входом CHIP_EN.
Потому что надо всё попробовать... (Поиск ключей не там где потерял, а под фонарем.)

Глупости какие-то вам выдумали. Кондеры нужны - иначе ESP будет ловить любые помехи...
у ESP есть кондер 1мкФ на reset. Вопрос, нужен ли кондер на EN.


Мне не понятно, почему с моей проблемой никто не столкнулся. Не найду информацию в интернете. Я делаю что-то из ряда вон выходящее?
 

pvvx

Активный участник сообщества
А Flash выключатся какой-то командой по SPI? А это одна команда для всех моделей Flash или ESP знает производителей и шлет персональные команды каждому.
Обычно стандартная, но бывают исключения. Смотрите PDF на Flash.
ээээ i2c же нужны подтягивающие резисторы? Или можно внутренние резисторы использовать? (facepalm)
У ESP8266 нет контроллера I2C. Ногодрыг.
И зачем связывать два MCU через I2C? UART в данном случае проще.
Потому что надо всё попробовать...
По CHIP_EN самое минимальное потребление у ESP8266.
у ESP есть кондер 1мкФ на reset. Вопрос, нужен ли кондер на EN.
На Reset и около десятки нФ предостаточно. Главное сгладить возможную импульсную помеху типа ЭМИ, если провода/кнопки и резисторы в беспорядке... При большей емкости при отключении питания она будет разряжаться через пин Reset :)
Вам то кондеры зачем, если все ноги включены к выходам другого MCU?
Мне не понятно, почему с моей проблемой никто не столкнулся. Не найду информацию в интернете. Я делаю что-то из ряда вон выходящее?
Ваша схема имеется в массе детских "проектов" счетчиков импульсов для подсчета расхода воды...
Любой BLE чип справляется с такой задачей от CR2032 с периодом замены более года. 1 деталька (модуль) и батарейка.
 

pvvx

Активный участник сообщества
Нет никакого смысла что-то оптимизировать в схеме, если используется Arduino и WiFi.
При связи раз в сутки у вас на одну сессию соединения с роутером уйдет от 5 до 7 секунд в Arduino при хорошей связи. И это при среднем токе у ESP порядка 100 мА.
В сутках 24*60*60=86400 секунд. Если размазать сессию соединения на них, то получим средний ток за сутки 7*100/(86400-7) = 0.00810 мА. Т.е. уже более 8 мкА.
Вот это и требуется оптимизировать. Т.е. в первую очередь выкидывать Arduino и писать на модернизированном SDK...
 

Evgeny D

Member
Это офигенно, огромное спасибо @pvvx!
Стал выключить ESP через 50 мс после ESP.deepSleep(0, RF_DEFAULT); и потребление снизилось на 7мкА!!

Узнал еще о команде system_deep_sleep_instant (deepSleepInstant) которая уменьшает уход в сон на 92мс. Но она не оказала влияние на потребление после сна. И для нее почему то тоже задержки в 50 мс оказалось достаточно. Пробовал увеличивать задержку до 300мс - нет разницы.

Итак было:
20-25мкА
после задержки стало
13-18мкА
Остается проблема со светодиодом, который жрет 4мкА и еще какие-то 2мкА...

Со светодиодом не понятно.

Не помогло:
1. очистка буфера:
SET_PERI_REG_MASK(UART_CONF0(0), UART_TXFIFO_RST); //RESET FIFO
CLEAR_PERI_REG_MASK(UART_CONF0(0), UART_TXFIFO_RST);

2. Удаление подтягивающего резистора с RX.

3. выключение лога в моей программе (думаю, потому что при загрузке ESP пишет служебную информацию 74400. т.е. пин инициализируется).

4. отпаивание светодиода совсем тоже не привело к результату - потребление осталось 13-18мкА. Замыкание TX на GND уменьшает потребление на 4мкА...
Измерение тока между TX и GND действует аналогично замыканию - сбрасывает 4мкА.

Очень интересно, что при выключенном логировании в программе светодиод горит при BOOT, потом тухнет в 0 пока программа работает, а включается тусклым ТОЛЬКО в deepSleep!
 

pvvx

Активный участник сообщества
Стал выключить ESP через 50 мс после ESP.deepSleep(0, RF_DEFAULT); и потребление снизилось на 7мкА!!
Поставьте микросхему ключа на питание ESP модуля со всеми его причиндалами. Или отдельный стабилизатор с ногой 'Enable'.
ESP8266 без дополнительных костылей - это не рабочее решение. Для приведения к минимальным нормам к ESP8266 необходимо прикручивать костыли со стоимостью в несколько раз превышающую сам модуль c ESP8266.
 

Evgeny D

Member
Поставьте микросхему ключа на питание ESP модуля со всеми его причиндалами. Или отдельный стабилизатор с ногой 'Enable'.
ESP8266 без дополнительных костылей - это не рабочее решение. Для приведения к минимальным нормам к ESP8266 необходимо прикручивать костыли со стоимостью в несколько раз превышающую сам модуль c ESP8266.
Вы мне про Фому, а я вам про Ерему. Есть текущая схема и я, благодаря вам, всего в 1м шаге от того, чтобы полностью потушить ESP. Я знаю, можно сделать на ключе, но сейчас так. Вы мастер кунфу ESP и его регистров и возможно сможете помочь и со светодиодом. Вы же с полпинка решили проблему, которая 2 года висит в паблике.
Я готов отблагодарить не только словами вашу помочь в этом вопросе.

Я записал на видео, как ведет себя светодиод:
 

pvvx

Активный участник сообщества
У вас к чипу включены резисторы на +3.3В, а светодиод на GND. Если CHIP_EN отключает внутреннюю шину питания, то через защитные диоды у GPIO с резисторами к +3.3В туда идет напряжение и проходит на светодиод. Это одна из версий. Так происходит на множестве других SoC.

И проверьте биты PullUp:
1617114859845.png
Описание в корне сайта -> Скачать ESP8266 Pin List 05.11.2014 в формате XLSX
Или тут:

Замените светодиод на синий или ещё какой, которому надо больше напряжение для начала свечения.
 

pvvx

Активный участник сообщества
На CH_PD у вас стоит резистор на GND. Я не измерял ток утечки этого входа, т.к. подключал либо к выходу другого MCU дающего нормальный "0" или к кнопке.
Если вы просто бросаете этот вход с резистором, то неизвестно будет ли там "0". Это тоже стоит проверить.
 

Evgeny D

Member
На CH_PD у вас стоит резистор на GND. Я не измерял ток утечки этого входа, т.к. подключал либо к выходу другого MCU дающего нормальный "0" или к кнопке.
Если вы просто бросаете этот вход с резистором, то неизвестно будет ли там "0". Это тоже стоит проверить.
CH_PD у меня к выходу Attiny подключен. Может я зря в INPUT его перевожу?
C:
digitalWrite(power_pin, LOW);
pinMode(power_pin, INPUT);  // снижаем потребление  (?)
 

pvvx

Активный участник сообщества
pinMode(power_pin, INPUT); // снижаем потребление (?)
Каким образом это снизит потребление? Вывод и так притянут к GND резистором, а если у него утечка в ESP, то ESP может отключаться не до конца. Достаточно малых уровней для неполной отработки КМОП входа...
Это надо проверять, а не на обум.
 
Сверху Снизу