Pull to refresh

Comments 25

У EFM32 в спячке меньше и более продуманные.
У вас энергопотребление довольно высокое, а вот будете работать с очень долгоживущими — годы на батарейке — устройствами, столкнётесь с ещё одной вещью, которая тривиальна, но про неё при этом говорят хорошо если в одном случае из десяти.

Это GPIO.

Они по умолчанию сконфигурированы как цифровые входы с триггером Шмитта. Если ножка висит в воздухе, у неё на входе шум, триггер Шмитта от этого шума дёргается туда-сюда. И жрёт. Потерять таким образом полсотни микроампер — как нефиг делать, при собственном потреблении МК в STOP + RTC в районе 1,5 мкА.

Иногда советуют перевести все входы в состояние AIN — те же входы, но без триггера Шмитта.

Так вот, это совет правильный, но только наполовину.

Вторая половина заключается в том, что при наличии внешней цифровой периферии с входами, подключённым к GPIO МК, при переводе последних в AIN… оказавшись фактически в воздухе, жрать начинают уже входы периферии. Если это вход, от которого тактируется какой-нибудь SPI — там можно легко влететь уже в сотни микроампер.

Поэтому:
1) GPIO, работающие выходом на цифровую периферию и не имеющие внешней подтяжки, перед уходом в сон ставятся в состояние входа с подтяжкой или выхода, уровень соответствует неактивному состоянию периферии (SPI CS = 1, UART TX = 1 и т.п.)

2) Остальные GPIO отправляются в AIN

По этой же причине в Standby можно влететь в нехилое такое «мусорное» потребление периферии, если не предусмотреть на всех исходящих сигнала МК внешнюю подтяжку.
Вообще, для действительно низкопотребляющих случаев такие проблемы лучше решать на уровне топологии ПП.
Повесить на уровне топологии ПП на все шины внешние подтягивающие резисторы — очень так себе решение в качестве замены нескольких строчек кода.
Отличное решение.
1) подтяжка внешняя может быть меньше внутренней и находиться до стабилизатора напряжения
2) несколько строчек кода это 5-15 тактов, которые ядро могло бы и проспать.
Если подтяжка будет до стабилизатора, то будет фигня и перетекание тока куда не положено. Уменьшенная подтяжка просто не имеет смысла — когда она нужна она находится в неактивном состоянии — по подтяжке ток не течет и нет разницы сильная она или слабая, вот если что-то будет тянуть подтяжку в другую сторону, тогда надо думать. Кроме того слабая подтяжка уменьшит помехозащищённость(проверьте идею абсурдным увеличением подтягивающего резистора до величины в 1ГОм).

Если 5-15 тактов настолько критичны к энергопотреблению, тогда зачем тактирование в 72Мгц? У вас там рабочий цикл измеряется в сотнях тысяч тактов… 15 тактов — это экономия на блохах.
1) подтяжка внешняя может быть меньше внутренней


Не играет никакой роли. В STM32 внутренняя подтяжка — 50 кОм, если вам этого много, поставьте во сне ножку в выход, будет подтяжка нулевого сопротивления.

2) несколько строчек кода это 5-15 тактов, которые ядро могло бы и проспать.


И ровно эти же нановатты вы и потеряете потом в работе на внешних подтяжках на интерфейсах, которые их не требуют.

Не говоря уже про место на плате и число компонентов.
Можно взять измеритель тока (100nA — 50mA) и посмотреть реальное потребление устройства во всех режимах.
Я смотрел осциллографом падение напряжения на 1Ом резисторе. Метод вполне себе достоверный. Как упоминалось в статье, основная проблема это карта памяти, которая потребляет весьма неравномерно, иногда это короткие импульсы, а иногда прямо жрачка на несколько десятков миллисекунд.
Не могли бы вы привести свои данные по карточкам, которые вы использовали/замеряли потребление тока? По моим сведениям карты памяти от 40 до 150 мА могут кушать при записи. От производителя зависит. Заранее спасибо.
Спасибо за статью.
Если не секрет, то какой Bluetooth вы использовали в этом проекте?
Использовался RN4678, потому что нужен был Dual mode и переконфигурация на ходу. Кроме того, он может работать на скорости 460800. Однако, модуль очень сырой, чтобы он завелся пришлось очень очень долго долбить Microchip.
Кстати, ничего не сказано про измерительные каналы. Если они на операционниках, то там ещё и инвертор напряжения должен стоять и сами ОУ потреблять будут. Если не секрет, что измеряете?
У меня почему-то с L4 постоянные проблемы, то Куб забудет закинуть часть исходников для сборки (FatFS например), то до какого-то момента все глобальные переменные всегда были равны 0 даже при явном ненулевом определении (использую связку: Куб, arm-none-eabi-gcc, makefile и VSCode).
А почему используется батарейка, а не аккумулятор?
так пожелал заказчик
10 мА — не low-power

— Bluetooth
— SD карта
— OLED дисплей 128х64
— это тоже не low-power.

Количество данных настолько огромное что нужна жирная uSD — флешка? Нельзя было обойтись SPI low-power флэшкой?
Где схемотехника? В низкопотребляющих устройствах она не меньше важна чем софт.
В статье все написано, получаемый поток 6.5кБайт в секунду, за сутки 6.5*60*60*24 ~ 500мб.

я бы тогда сделал так: простой промежуточный буфер на SPI low-power флэшке на 1-2 мб, тогда SD карту как конечное хранилище пришлось бы включать очень редко. SD на низких скоростях весьма прожорливы (по сравнению с таким хорошим МК и прочей переферией).

Есть SPI-SRAM. Или SPI-FRAM использовать, но цены на них пока ещё кусаются. На жалкие 32кБ FRAM-чипа можно взять флешку на 4...8Гб.
А эту мелкую флешку-буффер таким использованием можно затереть до дыр очень быстро.
UFO just landed and posted this here
Я правильно понял, что на входе у вас стоит step up импульcник и постоянно молотит. Он же тоже потребляет. Да не много, но постоянно. Не измеряли сколько оно ест во время сна контроллера?

Молотит постоянно, оба питальника вместе потребляли 200мкА.
Low power — это потребление в микроамперах и работами годами на круглой плоской батарейке.
Sign up to leave a comment.

Articles