Высокое потребление 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 может отключаться не до конца. Достаточно малых уровней для неполной отработки КМОП входа...
Это надо проверять, а не на обум.
 
Сверху Снизу