STM32. Практика похудания или диета для контроллера

в 12:51, , рубрики: cubemx, low power, nucleo, stm32, измерения, программирование микроконтроллеров, схемотехника, энергопотребление

STM32. Практика похудания или диета для контроллера - 1

Что за бред, наверняка подумают некоторые читатели, увидев заголовок публикации. Не ошибся ли автор ресурсом? Или разместить это планировалось в хабе «Здоровье гика»? И будут отчасти правы, но лишь отчасти… Под катом речь пойдет о методике снижения-оптимизации энергопотребления электронных устройств.

Некоторое время назад попала мне в руки плата X-NUCLEO-LPM01A, которая до поры до времени лежала без дела, пока я не решил заняться исследованием энергопотребления одного проектируемого устройства с автономным питанием.

STM32. Практика похудания или диета для контроллера - 2

Данная плата разработана STMicroelectronics и позиционируется как «Power shield, Nucleo expansion board for power consumption measurement». Толкового русскоязычного описания в сети по работе с этим девкитом я не нашел и решил разобраться сам, а заодно поделиться информацией с уважаемым хабро-сообществом.

Если выделить основное, то плата расширения является программируемым источником питания от 1.8 до 3.3 вольт с возможностью в real-time измерять ток нагрузки (в динамическом режиме до
50 мА) с частотой дискретизации до 100 КГц. Устройство может работать как автономно, так и в составе программно-аппаратного комплекса. Для графического отображения измеряемых значений используется утилита STM32Cube MonitorPower. Данное ПО позволяет так-же задавать все необходимые параметры и осуществлять обработку по возникновению события (триггерный запуск). X-NUCLEO-LPM01A заточена для работы с платами Nucleo-32 (64, 144), Arduino Nano (Uno), для этого на ней размещены соответствующие шилды, но есть возможность работы и c произвольными платами. На фото ниже изображено подключение исследуемого нами устройства к одному из разъемов платы.

STM32. Практика похудания или диета для контроллера - 3

Кроме прикладного ПО, X-NUCLEO-LPM01A поддерживает командный режим, для работы в котором должна подойти любая терминальная программа. (Здесь я кажется несколько погорячился, HTerm завелся с пол-пинка, а вот с любимым мною ZOC пришлось немного пошаманить). Причем, судя по описанию, за счет использования драйвера VCP, устройство может сыпать данные в COM порт со скоростью до 3686400 бод. Столь высокая скорость обеспечивается в частности передачей бинарного потока данных (для частот дискретизации свыше 50 КГц), для ASCII символов скорость несколько ниже.

Более конкретно, задача, которую я попытаюсь решить с помощью X-NUCLEO-LPM01A, это:

  1. Получить информацию по динамическому энергопотреблению интересующих узлов проектируемого изделия, используя триггерный запуск X-NUCLEO-LPM01A в исследуемых местах программного кода.

  2. В процессе непрерывной работы устройства организовать накопление нужных фрагментов для последующего обобщенного анализа.

На скриншоте ниже показан лог потребления тока SD картой во время записи данных.

STM32. Практика похудания или диета для контроллера - 4

STM32Cube MonitorPower позволяет не только качественно, но и количественно оценить энергопотребление исследуемого устройства. В нижней части картинки приводятся минимальное, максимальное, среднее значения потребляемого тока и интегрированное значение энергии. Такие данные доступны как для всего замера так и для выделенного фрагмента.

В User manual отмечается, что триггерный запуск измерения осуществляется импульсом на ноге D7 ардуино шилда. Как оказалось, работает только однократный запуск процесса с последующей непрерывной записью. Попытка-же организовать старт-стопный режим регистрации тока (по обоим фронтам импульса) не увенчалась успехом. То есть единожды начав запись в нужном месте по нарастающему фронту, не получается тормознуть процесс спадающим фронтом импульса. И это не совсем то, что я ожидал получить от данного устройства.

Полностью управляемый старт-стопный режим можно задать, используя последовательность команд из терминальной программы

команда

описание

htc

захват управления хостом

volt 3300-03

напряжение питания по измеряемому каналу 3300 мВольт

acqtime 0

непрерывный замер без ограничения по времени

freq 10000

частота сэмплирования 10 КГц

start

начало замера

...

замер (данные сыпятся в терминалку)

stop

окончание замера

Проблема в том, что это ручное управление, не синхронизированное с событиями в целевом контроллере. Можно конечно попытаться формировать указанную последовательность команд на стороне исследуемого устройства, а не хоста, но тогда и поток вывода данных с X-NUCLEO-LPM01A тоже посыпется в контроллер и что с ними делать непонятно, а перенаправление вывода "куда_нибудь_в_другое_место" тоже не доступно, (хотя на плате есть пины UART Tx, Rx, но в мануале значатся как "reserved" и, вероятно, в текущей версии прошивки никак не задействованы). Выкрутился я из этой ситуации следующим образом:

На стороне хоста (компьютера) формируется следующая последовательность команд

команда

описание

htc

захват управления хостом

volt 3300-03

напряжение питания по измеряемому каналу 3300 мВольт

acqtime 1

длительность замера
(можно использовать диапазон от 10 мксек до 10 сек )

trigsrc d7

синхронизация начала замера с нарастающим фронтом
импульса на pin D7

freq 10000

частота сэмплирования 10 КГц

start

начало замера

...

замер (данные стартуют по фронту импульса и прекращают
сыпаться по истечению времени, указанному в acqtime)

Теперь данные будут фиксироваться "пачками", а не непрерывным потоком. Указанный подход позволяет исследовать потребление схемы в разных местах программы и в различные промежутки времени, которые находятся достаточно далеко друг от друга. То есть, если есть необходимость собрать инфу по энергопотреблению девайса, работающего час (день, неделю) не нужно писать непрерывный поток, да еще с максимальной частотой дискретизации и потом разбираться в этой каше, а достаточно лишь обеспечить вышеописанный алгоритм работы. А если терминальная программа будет писать time markers в свой лог, как изображено на картинке ниже, то распарсить хронологию событий по такому файлу будет совсем просто.

STM32. Практика похудания или диета для контроллера - 5

Это как видеорегистратор с записью по детектору движения и временными отметками.

Приведу еще пару скриншотов, полученных с помощью X-NUCLEO-LPM01A. На первом — энергопотребление контроллером во время считывания данных со встроенного ADC. 32 значения считываются по таймерному прерыванию с частотой 4 КГц и складываются в память.

STM32. Практика похудания или диета для контроллера - 6

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

STM32. Практика похудания или диета для контроллера - 7

Сразу-же заметна существенная дельта в потреблении тока во время замера, ~6 мА. Эти два примера не претендуют на оптимизацию энергопотребления low-power устройств, а лишь демонстрируют возможности X-NUCLEO-LPM01A, которая способна измерять токи от 1 нА.

В заключение скажу, что, по моему скромному мнению, этот девкит представляется вполне годным инструментом, который может занять достойное место рядом с осциллографом и логическим анализатором сигналов на столе эмбеддера. А использование описанного подхода позволит не только "умерить аппетиты контроллера" при разработке критичных по питанию девайсов, но и лучше понять динамику процессов, в многообразных режимах энергосбережения, активно используемых разработчиками современных электронных устройств.

Несколько омрачает радужность картинки стоимость платы — более 7000 руб, но разве такая, ничтожная по нынешним временам, сумма сможет остановить настоящего гика от возможности обладания этим чудесным девкитом?

P.S. Несмотря на указание в UM, что UART зарезервирован для будущих применений, я все-же сунулся на него и обнаружил, что он живет как второй интерфейс (ввод-вывод дублируется с VCP) на скорости 921600 8N1 и его можно использовать как командный, формируя start и stop для начала — окончания замера. Минусом такого подхода будет являться обязательное наличие свободного UART на стороне исследуемого контроллера, не говоря уже о том, что 921600 бод зачастую невозможно при низких тактовых частотах.

P.P.S. Уже после написания статьи заметил разницу на последних картинках ~2 мА при входе в измерение и по его окончанию. Вероятно я не отключил тактирование ADC, или оставил работать таймер, но это уже, как любит говорить Леонид Каневский: "совсем другая история"...

Автор: Олег

Источник


* - обязательные к заполнению поля