Atmega32u4: снижение энергопотребления при сохранении активности USB

У меня есть плата с питанием от USB, которая должна потреблять как можно меньше энергии в режиме ожидания, сохраняя при этом активное USB-соединение.

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

Я могу перевести Atmega32u4 в режим ожидания, не отключая USB-подключение, но энергопотребление будет очень высоким (чуть меньше, чем в активном состоянии). Я отключил все периферийные устройства, которые можно отключить в режиме ожидания, но это мало что изменило.

Как только я перехожу в любой другой спящий режим (выключение питания, ждущий режим или шумоподавление АЦП), соединение теряется и хост больше не видит устройство, хотя в документации сказано, что в режиме шумоподавления АЦП в режиме сокращения часы USB остаются активными, а при отключении питания/режиме ожидания асинхронные прерывания USB должны продолжать работать.

Можно ли еще что-нибудь сделать, чтобы снизить энергопотребление?

Нужно ли мне что-нибудь сделать, чтобы использовать режимы отключения питания, ожидания или шумоподавления АЦП, сохраняя при этом подключение USB?

, 👍0

Обсуждение

Как перевести микроконтроллер в спящий режим? Разве он не просыпается через миллисекунду или около того прерыванием таймера?, @Edgar Bonet

В настоящее время я использую эту библиотеку: https://github.com/LowPowerLab/LowPower. Я понял, что ошибся, и теперь я могу использовать режим шумоподавления АЦП. Но изменение не очень большое. Если я отключу его с помощью выключения / режима ожидания, энергопотребление снизится до нуля, но соединение USB будет потеряно. На самом деле, его разбудил WDT, и я позволил ему проснуться через 256 мс. Затем он просыпается менее чем за 1 мс, прежде чем снова заснуть., @Dakkaron

Есть ли способ перевести его в режим выключения/ожидания без потери USB-соединения? Это было бы замечательно., @Dakkaron

Вы вызываете idle() с ADC_OFF, TIMER4_OFF... и все остальное выключено? Попробуйте измерить потребляемый ток с помощью обоих параметров USB_OFF и USB_ON: это покажет вам, потребляет ли само периферийное устройство USB слишком большой ток. Вы также можете проверить таблицу данных, чтобы узнать, есть ли другие периферийные устройства, о которых не заботится библиотека, которые вы можете отключить с помощью функции [power_*_disable() из avr-libc](https://www.nongnu .org/avr-libc/user-manual/group__avr__power.html)., @Edgar Bonet

@EdgarBonet Очень интересно: «USB_OFF» значительно снижает энергопотребление (даже ниже, чем в режиме шумоподавления АЦП), сохраняя при этом работу USB. Я все еще намного выше текущего использования, которое я получаю в режиме отключения питания, но это уже значительное улучшение. Это заставляет меня думать, что отключение питания должно быть возможно, но мне нужно каким-то образом добавить прерывания или что-то еще, чтобы USB правильно реагировал на SUSPI/WAKUPI в режиме отключения питания., @Dakkaron

Большое спасибо за список периферии, я перепроверю, чем!, @Dakkaron