Friday, December 28, 2012

Portable console on STM32F407. Part 2. Battery.

На столе система работает замечательно. Но когда дело заходит о портативном устройстве, которое должно питаться от батареи, приходиться задумываться о том, что бы батареи хватало на длительный промежуток времени. Для этого нужно организовать режим сна, в котором контроллер будет как можно более экономичным. Эта статья будет посвящена тому, как я работал над переходом моей консоли в режим низкого энергопотребления, а так же расскажу про режим низкого энергопотребления в STM32. В моем проекте эту часть можно было реализовать аппаратно, поставив банальный выключатель или сделать систему на трех транзисторах, которая задействует две ножки контроллера и к тому же не очень надежна. Но что бы не вносить изменения в схему устройства, пришлось реализовывать все это программно. К счастью в STM32 есть 3 режима низкого энергопотребления, у каждого есть свои плюсы и минусы.
  • Sleep. Первая ступень экономичной работы.
    По умолчанию, после выполнения процессором Cortex инструкции WFE или WFI, отключается внутренняя синхронизация и прекращается выполнение кода программы. В режиме SLEEP, остальная часть STM32 продолжает работу. Выход из режима SLEEP происходит, когда УВВ (Устройство ввода-вывода) генерирует прерывание. Если STM32 синхр
    онизируется блоком ФАПЧ (Фазовая автоподстройка частоты) и HSE-генератором частотой 72 МГц и использует все УВВ, то при переходе в режим SLEEP потребляемый ток снизится до приблизительно 14.4мА. Тем не менее, если выполнить специальную подготовку STM32 к переходу в экономичный режим, отключив синхронизацию всех УВВ, кроме тех, что используются для возобновления работы процессора Cortex, и переключившись на синхронизацию от HSI-генератора (частоту которого можно снизить до 1 МГц и даже менее), можно добиться снижения потребляемого тока до приблизительно 0.5 мА.
    Потребляемый ток можно так же снизить до 0.14 мА
  • Stop. Вторая ступень экономичной работы. 
    Для этого необходимо установить бит SLEEPDEEP в регистре управления энергопотреблением ядра Cortex и сбросить бит Power Down Deep Sleep (PDDS) в регистре управления энергопотреблением STM32.
    После завершения конфигурации режима STOP, выполнение инструкции WFI или WFE приведет к остановке процессора Cortex и отключению HSI- и HSE-генераторов. Флэш-память, статическое ОЗУ и УВВ остаются запитанными, поэтому, состояние STM32 сберегается. Также как и в случае с режимом SLEEP, выход из режима STOP возможен путем генерации прерывания УВВ. Однако в режиме STOP синхронизация всех УВВ отключена, за исключением контроллера внешних прерываний. Таким образом, выход из режима STOP возможен при изменении состояния любой из линии ввода-вывода. Кроме того, у контроллера внешних прерываний имеется одна линия, которая может, как запрашивать, так и генерировать прерывание по достижении заданного времени часами реального времени. Поскольку у часов реального времени имеется отдельный генератор (LSI или LSE), то они могут использоваться для генерации периодических прерываний для вывода STM32 из режима STOP.
    После перехода STM32 в режим STOP его потребляемый ток снижается с миллиампер, потребляемых в режиме RUN, до приблизительно 24 мкА. Дальнейшего снижения энергопотребления можно добиться переводом внутреннего генератора в специальный экономичный режим работы. Для этого необходимо установить бит LPDS в регистре управления энергопотреблением STM32. Если при переходе в режим STOP данный бит был установлен, то потребляемый ток снизится до 14 мкА. Если используются часы реального времени, то потребляемый ток увеличится на 1.4 мкА.
  • StandBy. Третья ступень экономичной работы. STM32 можно настроить на работу в режиме STANDBY, если установить бит SLEEPDEEP в регистре управления энергопотреблением ядра Cortex и установить бит Power Down Deep Sleep в одноименном регистре STM32. После этого, выполнение инструкции WFI или WFE приведет к переводу STM32 в режим с наименьшим энергопотреблением. В режиме STANDBY STM32 абсолютно полностью бездействует. Отключены внутренний стабилизатор напряжения и HSE- и HSI-генераторы. В этом режиме STM32 потребляет ток всего лишь 2 мкА.
    В режиме STANDBY потребляемый ток равен 2 мкА, а задержка возобновления составляет 50 мкс. Выход из режима STANDBY возможен по прерыванию часов реального времени (достижение заданного времени) точно также как и при выходе из режима STOP. Кроме того, возобновление возможно через внешний вывод сброса STM32 или с помощью независимого сторожевого таймера. Выход из режима STANDBY также возможен по нарастающему фронту на линии 0 порта А. Данный вывод можно настроить, как вывод возобновления WKUP путем установки бита EWUP в регистре управления энергопотреблением и статуса. Поскольку режим STANDBY самый маломощный, то и выход из него осуществляется дольше всего: задержка возобновления исполнения инструкций составляет около 50 мкс.
    После перехода в режим STANDBY содержимое статического ОЗУ, регистров ядра Cortex и STM32 теряется. Выход из режима STANDBY практически идентичен программному сбросу.
Так как значения SRAM хранить было не обязательно, а все параметры из настроек хранятся на карте памяти, в проекте консоли было решено использовать режим StandBy. Что бы достичь как можно более низкого энергопотребления без внесения и нагромождения аппаратной части проекта, требовалось программно отключать (переводить в режим низкого энергопотребления) всю периферию. Сперва взялся за дисплей. Подсветка была на одной из ножки GPIO контроллера, поэтому это можно было оставить, так как при переходе в экономичный режим, все значения на портах вывода сбрасывались в ноль. Контроллер дисплея (ILI9481) потреблял около 14 мА, что достаточно много. Для решения данной проблемы необходимо ввести контроллер дисплея в режим Sleep. Для того что бы реализовать это с ILI9481, достаточно отправить контроллеру команду выбора регистра 0x10. Номер регистра для перехода в режим Sleep можно найти в документации на ваш дисплей. Вторым этапом понижения энергопотребления была сенсорная панель. В моем проекте использовался контроллер ADS7846, который кроме того, что может выдавать текущее состояние о нажатии, может отправлять текущее значение уровня заряда батареи, и значение с двух датчиков температуры (о получении координат, уровня заряда и температуры в следующей части статьи).
STM32 общается с контроллером сенсорного экрана по SPI. Полный запрос вмещается в один байт. Процесс получения данных выглядит: "Открытие диалога", "Последовательная отправка байта запроса", "Получение ответного байта (12/8 бит)", "Завершение диалога".   

Содержание "байта запроса"

Описание битов "байта запроса"

Из описания следует, что седьмой бит (START) должен быть всегда выставлен в 1.
(Полное описание в следующей части статьи)
Биты 1 и 0 (PD1-PD0) отвечают за введение контроллера сенсорного экрана в различные режимы, в которых у контроллера сенсорного экрана будет разное энергопотребление.

Описание битов выбора режима контроллера
В итоге, для того что бы перевести сенсорный экран в режим низкого энергопотребления, необходимо отправиться на контроллер 10000000 в бинарном виде или 0x80 в шестнадцатеричном.

На текущий момент удалось добиться потребления в режиме StandBy - 0.4 мА


(Функции работы с контроллером сенсорного экрана описаны в следующей части статьи)

Ссылки на части статьи проекта:

Портативная консоль на STM32F407. Часть 1

No comments :

Post a Comment