Как настроить неиспользуемые выводы ввода / вывода на ATMega328P для минимального энергопотребления?

15

Я пытаюсь максимально уменьшить мощность на созданной мной плате Arduino. Как настроить неиспользуемые входные контакты? Есть несколько ответов ( здесь , здесь ) уже для этого, но я после чего-то определенного для ATMega328P.

  1. Установите вывод на вход, приводной штифт на высокий уровень, чтобы задействовать внутреннюю тягу
  2. Установите вывод на вход, низкий вывод привода
  3. Установить вывод на вход, внешний подтянуть
  4. Установить вывод на вход, внешний подтянуть
  5. Установите вывод на низкий уровень на выходе
  6. Установить вывод на высокий уровень
  7. Установите вывод на низкий уровень, внешнее опускание
geometrikal
источник

Ответы:

12

Пролистав таблицу , я нашел это:

14.2.6 Несвязанные контакты

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

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

обновление по отношению к комментарию / вопросу:

Согласно таблице 14-1, подтягивающий резистор активен только тогда, когда выполняются следующие условия:

  1. Пин установлен как вход (бит DDxn имеет низкий логический уровень)
  2. PORTxn имеет высокий логический уровень
  3. ПУД логико низкий

Единственный способ получить значительный ток, протекающий через подтягивающий резистор, - это если на выводе присутствует низкий уровень при включенном подтягивании. Это означает, что либо Atmel плохо испортил (маловероятно), либо вы настроили вывод на вход в качестве входа с включенным подтягиванием, и этот вывод каким-то образом подключен к земле.

В разделе 14.2.5рассматриваются включение цифрового входа и спящие режимы. Подводя итог, можно сказать, что цифровой вход зажимается на землю на входе триггера Шмитта, чтобы предотвратить плавающий уровень в режиме ожидания, если только вывод не настроен как внешнее прерывание. Я не могу сказать, отключен ли цифровой выход в спящем режиме. Не похоже, что он отключен согласно рисунку 14-2, хотя я не был бы слишком удивлен, если бы это было. Лучше всего использовать внутренний или внешний подтягивающий резистор.

helloworld922
источник
спасибо, как вы думаете, это лучше, чем установка на выход, с точки зрения используемой мощности? Протекает ли какой-либо ток через внутреннюю тягу? В большинстве случаев устройство будет находиться в режиме ожидания.
геометрикал
обновленный ответ. Я не думаю, что у вас будет слишком много проблем с выходом, но лучше всего принять совет Атмела.
helloworld922
10
  1. Установите вывод на вход, приводной - на высокий, чтобы задействовать внутреннее подтягивание : я думаю, что это должно звучать так: « сделать вход высоким, задействуя внутреннее подтягивание ». (Я бы использовал слово «драйв», только если вы делаете это активно, с помощью FET для Vcc или земли.) Ясно, что вы хотите определенный уровень, и подтягивание позаботится об этом. Убедитесь, что включение подтягивания - это первое, что вы делаете после сброса. Это касается инициализации ввода / вывода в целом. Единственным током будет ток утечки NFET двухтактной пары и утечка затвора входного полевого транзистора. Менее 1 мкА: ОК.
  2. Установить вывод на вход, низкий вывод привода : не очень хорошая идея. Если программное обеспечение выходит из строя и переключает вывод на высокий уровень, вы закорачиваете вывод, повреждая PFET дополнительной пары.
  3. Установить вывод на вход, внешний подтягивать : то же, что 1), только дороже. Но имеет преимущество в том, что подтягивание всегда будет там; Вы можете забыть включить внутреннее подтягивание (которое по умолчанию отключено). Если вход / выход случайно переключится на низкий уровень выходного сигнала, у вас будет небольшой ток утечки.
  4. Установите вывод на вход, внешнее опускание : Опять стоимость резистора (да, я знаю, что они дешевые, но дешевые + ненужные = дорогие.) Тот же ток, что и в 3), если на контакте будет активный высокий уровень.
  5. Установить вывод на низкий уровень : имеет более высокий ток утечки, чем при настройке в качестве входа, но все же ниже 1 мкА, так что не о чем беспокоиться. Я бы все равно включил внутренний подтягивающий. Он не будет активен с входом / выходом в качестве выхода, но если он будет случайно переключен на вход, вывод не останется плавающим.
  6. Установить вывод на высокий уровень : То же, что 5)
  7. Установите вывод на низкий уровень на выходе, внешнее понижающее напряжение : резистор понижающего напряжения - это ненужные затраты: на выходе будет низкий уровень, который уже низкий. Но по сравнению с 5) преимущество заключается в том, что вы уверены, что контакт не будет плавать, если непреднамеренно переключиться на вход.

Я бы пошел за 1): вход с внутренним подтягиванием; внешние детали не требуются. В FMEA 5) может получиться лучше, но это зависит от того, насколько высоко вы оцениваете риск того, что вы забыли включить внутреннюю подтягивание. Рецензирование программного дизайна должно дать вам страховку.

stevenvh
источник
1

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

volatile uint8_t timer2sum; // see interrupt handler

void Initialize()
{
    // configure pin for output
    DDR_LED |= LED;

    // set Power Reduction Register
    PRR = (1<<PRTWI)     // turn off TWI
        | (1<<PRTIM0)    // turn off Timer/Counter0
        | (1<<PRTIM1)    // turn off Timer/Counter1 (leave Timer/Counter2 on)
        | (1<<PRSPI)     // turn off SPI
        | (1<<PRUSART0)  // turn off USART (will turn on again when reset)
        | (1<<PRADC);    // turn off ADC

    // select POWER SAVE mode for sleeping, which allows Timer/Counter2 to wake us up
    set_sleep_mode(SLEEP_MODE_PWR_SAVE);

    // configure Timer/Counter2 to wake us up as infrequently as possible
    TCCR2B |= (1<<CS22) | (1<<CS21) | (1<<CS20); // clock at 14400 Hz
    TIMSK2 |= (1<<TOIE2);                        // interrupt on overflow, 56.25 Hz
    timer2sum = 0;                               // see interrupt handler
    sei();                                       // enable interrupts
}

взяты из http://www.nerdkits.com/library/lowpowerexample/, которые также используют те же чипы.

exussum
источник