Энергосберегающая конфигурация несоединенных контактов

По умолчанию все контакты Arduino (ATmega328P) настроены для ввода без включения внутреннего подтягивания. По-видимому, это значение по умолчанию исходит от самого микроконтроллера AVR.

Когда дело доходит до экономии энергии - является ли это оптимальной конфигурацией для неиспользуемых (и, следовательно, не подключенных) контактов?

В разделе 14.2.6 Несоединенные контакты спецификации ATmega328P (стр. 88) рекомендуется настроить подтягивания в целях экономии электроэнергии:

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

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

Поэтому у меня возникает искушение назвать что-то вроде

for (uint8_t i = first_unused_pin; i < 20; ++i)
    pinMode(i, INPUT_PULLUP);

во время настройки.

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

Однако Ник Гэммон сообщает в своей обширной статье о методах энергосбережения (раздел Настройка контактов в качестве входов/выходов, скетч D) о повышенном энергопотреблении, когда 6 неиспользуемых контактов сконфигурированы в качестве входов с подключенными внутренними подтягивающими устройствами:

Все контакты как входы, так и НИЗКИЕ (другими словами, внутренние подтягивания отключены): 0,35 мкА (как и раньше).

Все контакты в качестве входов и ВЫСОКИЕ (другими словами, внутренние подтягивания включены): 1,25 мкА.

Таким образом, утверждения таблицы, по-видимому, противоречат этим результатам.

Это ошибка в таблице данных, я что-то упускаю?

, 👍1

Обсуждение

Re “поскольку подтягивание подключено к VCC, определенно есть какой-то ток”: какой-то ток течет где-то? Чтобы ток мог течь, должен быть полный путь от Vcc до GND. Подтягивание соединяет контакт с Vcc, что же связывает его с GND?, @Edgar Bonet

@EdgarBonet ток утечки то есть. См.также стр. 323 технического паспорта, где максимальный "Входной ток утечки на выводе ввода-вывода" указан как 1 мкА., @maxschlepzig

FWIW, "Входной ток утечки". https://electronics.stackexchange.com/a/325619/165322, @VE7JRO

Аналогичный вопрос по electronics SE: [Как следует настроить неиспользуемые контакты ввода-вывода на ATmega328P для самого низкого энергопотребления?](https://electronics.stackexchange.com/q/43460/56807), @maxschlepzig


3 ответа


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

3

Ток потребляется, когда входной вывод переключается с ВЫСОКОГО на НИЗКИЙ или с НИЗКОГО на ВЫСОКИЙ. Несоединенный "плавающий" входной контакт может меняться случайным образом в зависимости от локальной среды (электромагнитные помехи, шум и т. Д.). Это непредсказуемо. "Он будет потреблять больше" ошибочно - это должно быть "он может потреблять больше". Будущее важно, как я уже говорил, оно непредсказуемо. Потянув вверх или вниз, вы больше не будете непредсказуемы, так как у вас есть определенное устойчивое состояние, и входной контакт не будет переключаться случайным образом.

Да, вы получите некоторый ток утечки через подтягивание и нижний МОП-транзистор, но это определенная предсказуемая величина, которую вы можете включить в свой дизайн. Если вы хотите уменьшить его, то используйте большие внешние подтягивания (или подтягивания), чтобы уменьшить ток утечки (примечание: слишком большое использование снова начнет посягать на "плавающий" територ).

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

,

хорошо, да, это небольшие суммы - re: "[ ... ] так что экономия нескольких nA на самом деле не будет иметь ни малейшего значения". Возможно, я что-то здесь упускаю, но разве такая утечка не является аддитивной? Я имею в виду саморазряд батареи, которая у меня есть в любом случае, и вдобавок ко всему я должен учитывать любой дополнительный ток утечки, верно? Кроме того, что будет в худшем случае, если _could_ произойдет, когда подтягивание не настроено/не подключено к несоединенному входному контакту с точки зрения энергопотребления (или чего-то еще)?, @maxschlepzig

@maxschlepzig Все не так просто, поскольку саморазряд-это не ток сам по себе, а эффект химии батареи. Например, NiMH может потерять 30% своего заряда за месяц (NiMH-один из худших для саморазряда). Но, конечно, ток, который вы потребляете, берется из того, что осталось в батарее, которая постоянно разряжается, и чем меньше вы потребляете, тем дольше она прослужит, но когда у вас есть (как в примере с NiMH) около 3 месяцев потенциального времени работы, вы все равно пытаетесь сэкономить достаточно энергии, чтобы продержаться 6 месяцев просто не будет., @Majenko

Вы можете попробовать подать высокочастотный (несколько МГц) сигнал на все несоединенные контакты, когда они установлены в качестве ВХОДНЫХ, и измерить ток сна, чтобы увидеть, как (если) он увеличивается., @Majenko

Это отличная идея, Маенко!, @Nick Gammon


0

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

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

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

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

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

,

1

Хотя я не понимаю, откуда берется повышенное энергопотребление, когда входной контакт не подключен и подтягивание не активно.

Эта часть вашего вопроса уже имеет 2 ответа, поэтому я просто отвечу на "энергосберегающую часть".

В техническом паспорте говорится: "Если некоторые контакты не используются, рекомендуется убедиться, что эти контакты имеют определенный уровень". Настройка их с помощью pinMode() для вывода, а затем управление ими с помощью digitalWrite() вполне приемлема и МОЖЕТ обеспечить наибольшую экономию энергии / помехоустойчивость из всех возможных.

Если вы посмотрите на раздел "14.3 Альтернативные функции портов" на странице 89, то получите представление о внутренней цифровой логической схеме. При установке на ВЫХОДвнутренние цепи обеспечивают низкоомный путь к земле для поглощения тока. Какая бы часть внутренней схемы ни "колебалась из-за плавающего входного вывода", вызывая дополнительное энергопотребление, теперь подключена к земле, или ее вход игнорируется, или как бы это ни делал микрочип.

Когда вы следуете за выводом ввода-вывода на рис.14-2, он показывает схему INPUT_PULLUP в верхней части диаграммы, за которой следует трехфазное управление внизу, а затем схему СНА, состоящую из аналогового переключателя ИЛИ передающего затвора, если хотите, инверторного затвора и N-канального FET. Когда Arduino находится в некоторых спящих режимах, он "отключает" вывод с аналоговым переключателем, а также одновременно заземляет вход триггера Шмитта. Было бы здорово, если бы вы могли написать "Код Arduino" в IDE, чтобы программно включить/выключить это.

Figure 14-2

Из технического паспорта:

14.2.5 Режимы включения и сна цифрового входа

Как показано на рис.14-2, цифровой входной сигнал может быть заземлен на входе триггера Шмитта. Сигнал, обозначенный на рисунке как спящий режим, устанавливается контроллером спящего режима MCU в режиме отключения питания, режиме энергосбережения и режиме ожидания, чтобы избежать высокого энергопотребления, если некоторые входные сигналы остаются плавающими или имеют уровень аналогового сигнала, близкий к VCC/2.

Суть в том, что вы не хотите, чтобы неиспользуемые контакты были установлены в качестве ВХОДНЫХ данных (режим Tri-state (Hi-Z)). См. "Таблица 14-1. Конфигурации контактов портов".

,

Мое [более раннее тестирование](http://www.gammon.com.au/power), казалось бы, подтверждает, что установка контактов на выход и НИЗКИЙ уровень, вероятно, имеет самое низкое энергопотребление. В моих тестах установка их на ввод также имела низкое потребление, но это, вероятно, будет варьироваться в зависимости от того, что происходит вокруг контактов., @Nick Gammon

Ok - одна из проблем с таким подходом (установка несвязанного контакта на OUTPUT+low) - это, возможно, поведение во время сброса, т.е. Когда контакт настроен на ВВОД в течение короткого времени. Таким образом, подключение внешних подтягиваний к неиспользуемым контактам (и сохранение их в качестве ВХОДНЫХ данных) поможет в этом. Однако, я думаю, если вы не сбросите много, экономия (ВЫХОД+низкий уровень по сравнению с INPUT+pull-up) компенсирует потенциальные "отходы" при сбросе с большим запасом. Я не знаю, подключение всех неиспользуемых контактов к внешним подтягиваниям кажется немного чрезмерным., @maxschlepzig

@maxschlepzig - Я не рекомендую подключать неиспользуемые контакты к чему-либо. Вы комментируете то, что я написал в своем ответе, или комментарий выше вашего, сделанный Ником Гэммоном?, @VE7JRO

@maxschlepzig - Страница 619 технического паспорта может пролить некоторый свет на то, сколько тока используется в процессе перенастройки. См.: 35.12 Потребление тока при сбросе и ширине импульса сброса, @VE7JRO

@VE7JRO Я этого не говорил. В своем комментарии я просто хотел обсудить компромиссы метода, описанного в вашем ответе (т. Е. OUTPUT+low). Таким образом, reset-behavior - это, возможно, его единственный недостаток, AFAICS - итак, я только что упомянул INPUT+external pull - up, поскольку это единственная альтернатива, которая дает определенный уровень также во время сброса. Что я имею в виду под поведением сброса, так это то, что во время сброса неподключенный вывод (ранее установленный в OUTPUT+low) сбрасывается на ВХОД до тех пор, пока не будет запущена функция setup (). В течение этого временного окна в 1 с или около того уровень еще не определен. 35.12 не имеет дела с этим сценарием, верно?, @maxschlepzig

@maxschlepzig - Вы проверяли, плавают ли эти входы в течение одной секунды? Если это так, то я бы сказал, что ответ на ваш вопрос - это **в** вашем вопросе-"Если низкое энергопотребление во время сброса важно, рекомендуется использовать внешнее подтягивание или подтягивание".. В техническом паспорте также говорится, что не следует привязывать штифты непосредственно к источнику питания или земле из-за повреждения "ЕСЛИ" вы случайно установили штифты на ввод/вывод с помощью "кода". Если у вас нет возможности установить неиспользуемые входы на VCC или GND, то подключите их непосредственно к земле., @VE7JRO

@VE7JRO нет, я еще не пытался измерить эти входные данные. См.Также Ответ Майенко и комментарии о том, как измерение последствий несвязанного ВВОДА (без подтягивания) не совсем тривиально., @maxschlepzig

@maxschlepzig - В таком случае просто делайте то, что рекомендует технический паспорт., @VE7JRO