Arduino Leonardo/Pro Micro сон и USB

Я использую Arduino Pro Micro (в основном Leonardo в меньшем форм-факторе) в мобильном приложении, где действительно важно энергопотребление.

Чтобы снизить энергопотребление, я перевожу Arduino в спящий режим, но это отключает USB. Это не совсем приемлемо в данном приложении, поскольку повторное подключение USB после пробуждения Arduino занимает довольно много времени (секунда или две).

Есть ли какой-нибудь способ поддерживать USB-соединение в рабочем состоянии, сохраняя при этом энергию? Например, часто пробуждая ATmega32U4, чтобы поддерживать соединение в рабочем состоянии? Или есть какой-то не такой глубокий режим сна, при котором USB-соединение остается в рабочем состоянии?

Правки для уточнения:

Устройство представляет собой устройство USB HID. Если устройство переходит в спящий режим после нескольких минут бездействия, необходимость повторного подключения после нажатия пользователем кнопки вызывает довольно длительную задержку между нажатием кнопки и реакцией устройства.

Я использую собственную реализацию USB ATmega32U4, поэтому нет V-USB или чего-либо подобного.

Я перевожу устройство в спящий режим следующим образом:

Keyboard.end();
USBCON = 0;
LowPower.powerDown(SLEEP_120MS, ADC_OFF, BOD_OFF);

Вот как я снова его пробуждаю:

USBDevice.attach();
delay(50);
Keyboard.begin(KeyboardLayout_en_US);

, 👍0

Обсуждение

Вы пробовали LowPower.idle(...);?, @Edgar Bonet

Нет, пока нет, я попробую это сделать, спасибо!, @Dakkaron

@EdgarBonet Это именно то, что мне было нужно, все работает отлично, спасибо! Вы хотите опубликовать это как ответ, чтобы я мог принять его?, @Dakkaron

Удаление индикатора питания также может снизить энергопотребление., @sa_leinad

@sa_leinad Спасибо за информацию, я планировал это сделать!, @Dakkaron


2 ответа


Лучший ответ:

4

Arduino имеет несколько режимов ожидания. Они отличаются в основном включенными часами , включенными периферийными устройствами и возможными источниками пробуждения. Все эти режимы описаны в техническом описании микроконтроллера ATmega32U4, раздел 7: Управление питанием и спящие режимы.

Здесь вы можете увидеть, что “Отключение питания” является одним из самых глубоких режимов сна: все тактовые частоты отключены, главный генератор выключен, и доступны только асинхронные источники пробуждения. Как вы уже испытали, USB-порт в этом режиме не работает.

Напротив, “Бездействие” - это несколько поверхностный сон: процессор остановлен, но периферийные устройства остаются включенными. Любое включенное прерывание может быть использовано в качестве источника пробуждения. Это хороший вариант, если вы хотите, чтобы USB-канал оставался подключенным во время сна, и вы можете получить его с помощью функции LowPower.idle () функция.

Если вы беспокоитесь о том, что спящий режим будет слишком “поверхностным” и не будет экономить достаточно энергии, обратите внимание, что параметры if LowPower.idle() позволяют указать, какие периферийные устройства вы хотите продолжать работать во время сна. Если вы продолжаете запускать только те, которые необходимы, это должно ограничить энергопотребление тем, что строго необходимо.

,

Большое спасибо, это решило мою проблему! Спасибо также за действительно хороший отзыв!, @Dakkaron


2

Это лучше послужило бы комментарием, но я не могу публиковать комментарии (пока) ...

  • Что делает ваше приложение? Предполагается ли, что он должен быть асинхронным? Почему 1-2 секунды - это слишком долго?
  • Под подключением "USB" вы имеете в виду периферийное устройство UART / Serial?
  • Как вы усыпляете плату? Используете ли вы спящие режимы Arduino? Если да, то какой из них вы используете?

Я немного порассуждаю: если вы используете ASP, то вам, возможно, придется изменить исходный код для функций, которые вы используете, чтобы приспособить это периферийное устройство к бодрствованию. Обратите внимание, что это может сделать приложение более энергозатратным, чем вы хотели бы.

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

,

ATmega32U4 на микро имеет встроенное периферийное устройство USB, @Juraj

Я добавил запрошенную информацию к вопросу., @Dakkaron

@Dakkaron спасибо! Я должен буду рассмотреть это подробнее, это не обязательно тривиальная проблема. Я бы посоветовал попробовать режим ожидания и посмотреть, работает ли USB более отзывчиво. Требуется ли вашему приложению режим отключения питания? Кроме того, почему вы делаете "USBCON = 0" против "UsbDevice.detach()"?, @Nick S.

Спасибо за отзыв, я попробую это сделать. Главная причина, по которой я этого не делал, заключается в том, что мое решение - это то, что нашел Google. Спасибо за информацию!, @Dakkaron