От переводчика. В этой статье автор исследует тему снижения тока потребления беспроводной LoRa ноды при помощи использования специализированных микросхем семейства нано-потребляющих таймеров TPL5010/TPL5110. Плюс затрагивает вопрос влияния Arduino загрузчика на время жизни батарейных сенсоров. Статья будет интересна тем, кто интересуется методами снижения энергопотребления батарейных устройств.

Ноды с очень низким энергопотреблением


Снижению потребления тока в режиме сна LoRa узлов уделяется большое внимание, очевидно, чем оно меньше, тем лучше, но является ли сам по себе уровень потребления тока в режиме сна определяющим фактором?

При работе типовой ноды на базе микроконтроллера ATmgea328P или 1284P и LoRa модулем в режиме глубокого сна, ток потребления ноды составляет около 0,2 мкА (пробуждение происходит по прерыванию). Если для питания ноды использовать LDO регулятор, например MCP1700 и специализированную микросхему TPL5010 в качестве Watchdog и таймера пробуждения по прерываниям, то общий ток потребления ноды в режиме сна составит около 1,5 мкА.

Примечание переводчика. Для справки ниже представлена типовая схема включения нано-потребляющего таймера с функцией Watchdog TPL5010.


Популярной альтернативой использованию режима глубокого сна является применение специализированной микросхемы TPL5110, которая позволяет полностью отключать питание ноды на время от нескольких секунд до двух часов, ток потребления в этом случае составляет менее 0,1 мкА. На первый взгляд, это значительно лучше по сравнению с 1,5 мкА в случае ATmega328 в режиме глубокого сна, но так ли это? Является ли концепция использования глубокого сна наилучшим способом снижения общего энергопотребления ноды?

Взгляните на график ниже, он показывает (верхний график) подачу питания на GPS-трекер, сделанный на базе Arduino Pro Mini. Нижняя кривая показывает установку GPIO в высокий уровень в тот момент, когда программное обеспечение трекера инициировало отправку LoRa пакета, поэтому разница обусловлена в основном временем пробуждения MCU. Задержка по времени от момента включения питания трекера до готовности к отправке пакета составила 1512 мс, в основном из-за задержки загрузчика Arduino. Потребляемая мощность системы в течение 1512 мс составила 5,42 мА.

Задержка из-за загрузчика Arduino

Примечание переводчика. Тут ещё нужно не забывать, что кроме собственно потребления нодой в режиме сна есть ещё энергетические затраты на передачу LoRa пакетов, что, в зависимости от настроек LoRa и интенсивности беспроводной работы может составлять значительную долю энергозатрат.

Теперь сравните аналогичную ситуацию, когда нода трекера переводится в глубокий сон и просыпается по прерыванию от таймера, например TPL5010. «Голый» Arduino контроллер (aka доработанный Arduino Pro Mini) с приличным LDO регулятором питания и LoRa модулем имеет ток глубокого сна около 1,5 мкА. Обратите внимание на время, необходимое для пробуждения от глубокого сна и готовности отправки LoRa пакета в этом случае.

Пробуждение из состояния глубокого сна

Здесь верхний график показывает как прерывание выводит трекер из глубокого сна, а нижний — готовность ноды к отправке LoRa пакета. В этом случае задержка составляет мизерные 4,5 мс.

Таким образом, пробуждение из состояния глубокого сна происходит намного быстрее (4,5 мс против 1512 мс), но экономит ли энергию более быстрое время загрузки?

Здесь проще считать цифры в мкА/с, а не в мАч, и смотреть на цифры за день. Предположим, что наш трекер отправляет данные каждые 10 минут или 144 раза в день.

Нода с отключением питания на TPL5110


Узел, оснащенный микросхемой TPL5110, имеет ток потребления во время сна примерно 0,1 мкА, поэтому за день в этом режиме он использует 0,1 x 60 x 60 x 24 = 8640 мкА/с.

При каждом пробуждении он использует 1,512 x 5420 = 8185 мкА/с за пробуждение.

Таких передач 144, то есть это 1180086 мкА/с в день.

Всего наш узел на TPL5110 использует 8640 + 1180086 = 1188726 мкА/с в день во время сна и пробуждения, или 0,33 мАч в день.

Нода с пробуждением от глубокого сна на TPL5010


Узел, оборудованный TPL5010, имеет ток сна 1,5 мкА, поэтому за день в этом режиме он потребляет 1,5 x 60 x 60 x 24 = 129600 мкА/с.

При каждом пробуждении он использует 0,0045 x 5420 = 24,4 мкА/с за пробуждение.

Таких передач 144, то есть 3513 мкА/с в день.

Таким образом, узел использует 129600 + 3513 = 133113 мкА/с в день во время сна и пробуждения, или 0,037 мАч в день.

Загрузчик Arduino


Разумеется, нам не обязательно использовать Arduino bootloader для загрузки скетчей, мы можем напрямую использовать ISP программатор, хотя это и менее удобно.

Включение ноды без загрузчика Arduino

Здесь задержка между подачей питания на контроллер и готовностью к отправке пакета намного меньше: 120 мс (а не 1512 мс).

Другие преимущества TPL5010


TPL5010 можно задействовать и как сторожевое устройство (Watchdog): если ваш микроконтроллер перестанет посылать контрольные импульсы, то произойдет его автоматическая перезагрузка, что является полезной защитой от сбоев программного обеспечения или ошибок, вызванных проблемами с питанием.

Еще одно преимущество использования TPL5010 заключается в быстром выходе микроконтроллера из глубокого сна. При 4,5 мс становится возможным, например, настроить TPL5010 на одноминутный интервал пробуждения микроконтроллера, а затем просто подсчитать прерывания, чтобы получить программируемое время пробуждения. Например, цикл в 10 прерываний даст вам 10-минутное пробуждение без необходимости замены времязадающего резистора TPL5010.

Примечание переводчика. Здесь нужно учитывать, что номинал времязадающего резистора имеет свою погрешность и при помощи него невозможно выставить точный временной интервал срабатывания TPL5010 (до миллисекунд и микросекунд). Поэтому подобный псевдотаймер будет постоянно накапливать ошибку отсчёта времени.

Заключение


При использовании TPL5110 для выключения питания (в случае контроллера с Arduino загрузчиком) нода совокупно потребляет 0,33 мАч в день, а при использовании TPL5010 и режима прерываний, нода потребляет только 0,037 мАч в день. Таким образом, можно добиться значительной экономии энергии, используя (доработанную Pro Mini) Arduino и TPL5010 в качестве таймера пробуждения. Если вы не будете использовать Arduino загрузчик, то выбор между этими двумя методами будет невелик, хотя TPL5010 обеспечивает ещё и дополнительные возможности (функцию сторожевого таймера для ваших устройств).

Комментарии (18)


  1. Indemsys
    15.10.2023 08:41

    Что-то не так с этим ардуино.
    У микроконтроллеров на ARM-Cortex M время стабилизации генератора не больше сотни микросекунд, стабилизация PLL в пределах сотни микросекунд. Итого не более двух сотен микросекунд до готовности к передаче. Допустим передатчик LoRa тактируется от генератора микроконтроллера, и его разгон не учитываем.
    Совсем другие цифры получатся.
    А если взять часы AB18X5 вместо TPL5110, то получим прецизионные моменты пробуждения даже раз в год и еще меньший средний ток.


    1. smart_alex Автор
      15.10.2023 08:41
      +1

      Так в статье идёт речь про ATmgea328P (1284P) плюс TPL5010 имеет дополнительную функцию Watchdog (внешнего по отношению к контроллеру).


    1. slog2
      15.10.2023 08:41
      +4

      В ардуино много чего не так. В данном случае проблема не из-за времени пробуждения микроконтроллера, а из-за програмного загрузчика, которому после каждого пробуждения передаётся управление, и который тупо ждёт больше секунды в надежде что ему пошлют новую прошивку. Если не дождётся то передает управление основной программе.


      1. Indemsys
        15.10.2023 08:41

        Проблема видится более фундаментальной.
        В ATmega328P в принципе нельзя выйти из Power-down быстрее 4.1 мс. Там такая задержка хардварно выполнена. Она не зависит от того как быстро стартует кварц и от загрузчика.

        Просто ATmega328P плохой выбор если нужно экономить потребление.


        1. smart_alex Автор
          15.10.2023 08:41
          +2

          Ну, 4.1 мс — это не 1512 мс и даже не 120 мс. На практике беспроводные датчики на Atmega328P + nRF24 (LoRa) работают годами от батареек (зависит от типа датчика и режима работы).


    1. REPISOT
      15.10.2023 08:41

      Так после стабилизации PLL после отключения питания еще программа выполняется. Сколько она там чего делает до момента готовности к передаче?
      А при выходе из сна сразу переходит к нужному прерыванию.


  1. Dark_Purple
    15.10.2023 08:41

    Хаха, можно взять комп на виде и героически преодолевать время её загрузки, только зачем ????
    Нужно микропотребление так используйте подходящие компоненты!


  1. zzyxy
    15.10.2023 08:41
    +2

    1,512 x 5420 = 8185 мкА/с

    Умножая микроамперы на секунды, мы получаем мкА*с (т.е. энергию) а не мкА/с(скорость нарастания импульса тока?)


    1. LordCarCar
      15.10.2023 08:41

      Тоже удивился:

      1188726 мкА/с в день во время сна и пробуждения, или 0,33 мАч в день.

      Похоже у компаний не хватает денег на грамотных копипастеров... У частников много-много меньше ошибок/описок.


      1. smart_alex Автор
        15.10.2023 08:41
        +1

        Не понял в чём ошибка. В оригинале:

        1188726uA/Seconds per day sleeping and waking up, or 0.33mAhr per day.

        Переведено:

        1188726 мкА/с в день во время сна и пробуждения, или 0,33 мАч в день.

        Что переведено неправильно? Или это претензия к автору оригинала?


        1. eurol
          15.10.2023 08:41

          Так вам уже выше написали, что делить мкА на секунды вообще неправильно в данном случае. Умножать.

          А лично меня не устраивает тот факт, что расчеты приведены только для двух случаев, а третий (при отсутствии загрузчика ардуино) почему-то обойден стороной.


          1. smart_alex Автор
            15.10.2023 08:41

            Я всего лишь перевёл то, что написал Stuart Robinson, почему он не рассмотрел прочие случаи я не знаю, вероятно потому, что посчитал двух случаев достаточно для иллюстрации своей идеи.


        1. LordCarCar
          15.10.2023 08:41

          Я думаю, такое нужно исправить и указать, что в оригинале ошибка.

          Все-таки технический текст.


  1. sav13
    15.10.2023 08:41

    Думал такое к ESP32 Прикрутить с его мегоптреблением.

    Решение довольно ограниченное.

    В режиме сна у МК сохраняется значение ОЗУ. регистров, некоторой периферии. Внешний таймер делает жесткий ресет и все это теряется.

    Мало того, что на начальную инициализацию тратится гораздо больше времени, чем на пробуждения от сна, так еще и предыдущее состояние недоступно, что значительно снижает функционал.

    Есть конечно вариант, перед "засыпанием" некоторые переменные в EEPROM/FLASH сохранять. Тоже не быстрая операция и у многих МК довольно ограниченное количество циклов записи в ПЗУ.

    Здесь полностью согласен с предыдущими ораторами - лучше найти МК с нанопотреблением

    А иногда и батарейку проще поставить побольше


  1. nikolz
    15.10.2023 08:41

    Делал ровно так для ESP8266 8 лет назад.

    При этом управление просыпанием делал через CH_EN, а не RST.


  1. RV3EFE
    15.10.2023 08:41

    Микросхема была бы чуть более лучше, если бы имела вход EN, или что то, что могло отключать её. Например при изготовлении серии приборов, которые на производстве прошивать загрузчиком или прошивкой нужно, а микросхема настроена на время сброса меньшее. Это создаёт проблемы.


    1. smart_alex Автор
      15.10.2023 08:41

      Эти таймеры могут использоваться в «более хитрых» схемах, чем просто сброс по ресету. Например, у меня скоро выйдет статья про контроллер в котором TPL5010 используется для управления питанием ESP32 — и в этой схеме переходник USB-UART блокирует работу Watchdog на время своего подключения — программируй сколько хочешь.

      Также никто не мешает поставить на плате перемычку блокировки Watchdog.


      1. RV3EFE
        15.10.2023 08:41

        Я тоже делал их блок от программатора, но вот иметь пин для этого было бы просто удобнее. Перемычку на серии в 300 плат не очень удобно ставит