Як слід налаштувати невикористані штифти вводу / виводу на ATMega328P для найменшого споживання електроенергії?


15

Я намагаюся максимально знизити потужність на створеній мені дошці Arduino. Як слід налаштувати невикористані вхідні штифти? На це вже є кілька відповідей ( тут , тут ), але я переглядаю щось конкретне для ATMega328P.

  1. Встановіть штифт на вхід, увімкніть високий штифт, щоб задіяти внутрішнє підтягування
  2. Встановіть штифт на вхід, низький привід шпильки
  3. Встановити штифт на вхід, зовнішнє підтягування вгору
  4. Встановіть штифт на вхід, зовнішній витягніть вниз
  5. Встановіть штифт на низький вихід
  6. Встановіть штифт на високий вихід
  7. Встановіть штифт на низький вихід, зовнішній витягніть вниз

Відповіді:


12

Прокопавши таблицю , я виявив таке:

14.2.6 Нероз'єднані штифти

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

Найпростіший метод забезпечення визначеного рівня невикористаного штифта - це включення внутрішнього підтягування. У цьому випадку підтягування буде відключено під час скидання. Якщо важливе значення має низьке споживання електроенергії під час скидання, рекомендується використовувати зовнішню підтягування або підтягування. Підключення невикористаних штифтів безпосередньо до VCC або GND не рекомендується, оскільки це може призвести до надмірних струмів, якщо штифт випадково налаштований як вихід.

оновлення стосовно коментаря / питання:

Відповідно до таблиці 14-1, підтягуючий резистор активний лише тоді, коли виконуються наступні умови:

  1. Штифт встановлюється як вхід (DDxn біт логічно низький)
  2. PORTxn встановлюється логічно високим
  3. PUD - логічно низький

Єдиний спосіб отримати значний струм, що протікає через підтягуючий резистор, це якщо штифт відчуває низький рівень із включеним підтягуванням. Це означає, що Atmel погано зіпсувався (малоймовірно), або у вас налаштований штифт як вхід із ввімкненим підтягуванням, і штифт якимось чином підключений до землі.

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


спасибі, ви вважаєте, що це краще, ніж встановити вихід, з точки зору використовуваної потужності? Чи протікає якийсь струм через внутрішню підтягування? Пристрій буде перебувати у режимі сну при відключенні живлення протягом більшої частини часу.
геометрика

оновлена ​​відповідь. Я не думаю, що у вас буде занадто багато проблем, коли це буде результатом, але найкраще ставитись до порад Atmel.
helloworld922

10
  1. Встановіть штифт на вхід, увімкніть високий штифт, щоб задіяти внутрішнє підтягування . Я думаю, що це повинно звучати так: " зробіть вхід високим, задіявши внутрішнє підтягування ". (Я б використовував слово "привід", тільки якщо ви робите це активно, за допомогою FET на Vcc або на землю.) Зрозуміло, що ви хочете певного рівня, і підтягувач переймається цим. Переконайтеся, що ввімкнення підтягування - одне з перших, що ви робите після скидання. Це взагалі стосується ініціалізації вводу / виводу. Єдиним струмом буде струм витоку NFET пари push-pull і витік затвора на вході FET. Менше 1 мкА: гаразд.
  2. Встановити штифт на вхід, низький накопичувач : Недобра ідея. Якщо програмне забезпечення виходить на банани і переключить штифт на високий вихід, ви вкорочуєте шпильку, пошкоджуючи PFET додаткової пари.
  3. Встановити штифт на вхід, зовнішнє підтягування : таке ж, як 1), тільки дорожче. Але має перевагу, що підтягування завжди буде там; ви можете забути ввімкнути внутрішню підтягування (яка за замовчуванням відключена). Якщо I / O випадково перемкнеться на низький вихід, у вас буде невеликий стічний струм.
  4. Встановити штифт на вхід, зовнішнє пониження : Знову вартість резистора (так, я знаю, що вони дешеві, але дешеві + непотрібні = дорогі.) Той же струм, що і в 3), якщо штифт піде на активну високу.
  5. Встановити штифт на низький вихід : має більший струм витоку, ніж коли налаштовано як вхідний, але все ще нижче 1 мкА, тому нічого не турбуватися. Я б все ж включив внутрішнє підтягування. Він не буде активним при вході / виводі як вихідному, але якщо його випадково переключити на введення, штифт не залишиться плаваючим.
  6. Встановити штифт для високого виходу : Те саме, що 5)
  7. Встановіть штифт на низький вихід, зовнішнє спуску вниз : Спадний резистор - це непотрібна вартість: це зробить вихід низьким, який уже низький. Але порівняно з 5) перевага є тим, що ви впевнені, що штифт не плаватиме, якщо ненавмисний перемикається на вхід.

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


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/, які також використовують ті самі фішки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.