Jak należy skonfigurować nieużywane styki we / wy w bankomacie ATMega328P w celu uzyskania najniższego zużycia energii?

15

Staram się maksymalnie zmniejszyć moc w stworzonej przeze mnie płycie Arduino. Jak należy skonfigurować nieużywane piny wejściowe? Jest na to kilka odpowiedzi ( tutaj , tutaj ), ale szukam czegoś konkretnego dla ATMega328P.

  1. Ustaw pin na wejściowy, pin napędowy wysoko, aby włączyć wewnętrzne podciąganie
  2. Ustaw pin na wejściowy, pin na niski
  3. Ustaw pin na wejście, zewnętrzne podciąganie
  4. Ustaw pin na wejście, zewnętrzne opuszczanie
  5. Ustaw pin na niski poziom wyjściowy
  6. Ustaw pin na wyjście wysokie
  7. Ustaw pin na niską moc wyjściową, zewnętrzne opuszczanie
geometrikal
źródło

Odpowiedzi:

12

Po przejrzeniu arkusza danych znalazłem to:

14.2.6 Niepodłączone piny

Jeśli niektóre piny nie są używane, zaleca się upewnienie się, że te piny mają określony poziom. Mimo że większość wejść cyfrowych jest wyłączona w trybach głębokiego uśpienia, jak opisano powyżej, należy unikać wprowadzania zmiennoprzecinkowego, aby zmniejszyć pobór prądu we wszystkich innych trybach, w których wejścia cyfrowe są włączone (reset, tryb aktywny i tryb bezczynności).

Najprostszym sposobem zapewnienia określonego poziomu nieużywanego kołka jest umożliwienie wewnętrznego podciągania. W takim przypadku podciąganie zostanie wyłączone podczas resetowania. Jeśli ważne jest niskie zużycie energii podczas resetowania, zaleca się użycie zewnętrznego podciągania lub opuszczania. Podłączanie nieużywanych pinów bezpośrednio do VCC lub GND nie jest zalecane, ponieważ może to spowodować nadmierny prąd, jeśli pin zostanie przypadkowo skonfigurowany jako wyjście.

aktualizacja w odniesieniu do komentarza / pytania:

Zgodnie z tabelą 14-1 rezystor podciągający jest aktywny tylko wtedy, gdy spełnione są następujące warunki:

  1. Pin jest ustawiony jako wejście (bit DDxn ma niską logikę)
  2. PORTxn ma wysoką logikę
  3. PUD ma niską logikę

Jedynym sposobem na uzyskanie znacznego prądu przepływającego przez rezystor podciągający jest to, że szpilka doświadcza niskiego poziomu z włączonym podciąganiem. Oznacza to, że albo Atmel źle się pomylił (mało prawdopodobne), albo masz pin skonfigurowany jako wejście z włączonym pull-up i pin jest w jakiś sposób podłączony do uziemienia.

Sekcja 14.2.5omawia włączanie i tryb uśpienia wejścia cyfrowego. Podsumowując, wejście cyfrowe jest przymocowane do masy na wejściu wyzwalacza Schmitt, aby zapobiec płynnemu poziomowi w trybie uśpienia, chyba że pin jest skonfigurowany jako zewnętrzne przerwanie. Nie wiem, czy wyjście cyfrowe jest wyłączone w trybie uśpienia. Wygląda na to, że nie jest wyłączony zgodnie z rysunkiem 14-2, choć nie byłbym zaskoczony, gdyby tak było. Najlepiej jest użyć wewnętrznego lub zewnętrznego rezystora podciągającego.

helloworld922
źródło
dzięki, czy uważasz, że jest to lepsze niż ustawienie wyjścia pod względem zużytej mocy? Czy jakiś prąd przepływa przez wewnętrzne podciągnięcie? Urządzenie będzie przez większość czasu znajdowało się w trybie uśpienia z wyłączaniem.
geometrikal
zaktualizowana odpowiedź. Nie sądzę, żebyś miał zbyt wiele problemów z tym, że jest to efekt, ale najlepiej jest posłuchać rady Atmela.
helloworld922,
10
  1. Ustaw pin na wejściowy, pin napędowy wysoki, aby włączyć wewnętrzne podciąganie : Myślę, że powinno to brzmieć: „ zwiększ wejściowy przez włączenie wewnętrznego podciągania ”. (Użyłbym słowa „drive” tylko wtedy, gdy robisz to aktywnie, za pomocą FET do Vcc lub uziemienia.) Oczywiste jest, że chcesz zdefiniowany poziom, a pull-up dba o to. Upewnij się, że włączenie podciągania jest jedną z pierwszych rzeczy, które robisz po zresetowaniu. Dotyczy to ogólnie inicjalizacji we / wy. Jedynym prądem będzie prąd upływowy NFET pary push-pull i prąd upływu wejściowego FET. Mniej niż 1 µA: OK.
  2. Ustaw pin na wejściowy, a pin na niski : niezbyt dobry pomysł. Jeśli oprogramowanie przejdzie na banany i przełączy pin na wysokie wyjście, zewrzesz pin, uszkadzając PFET pary komplementarnej.
  3. Ustaw pin na wejście, zewnętrzne podciąganie : jest takie samo jak 1), tylko droższe. Ma jednak tę zaletę, że zawsze będzie tam podciąganie; możesz zapomnieć o włączeniu wewnętrznego podciągania (które jest domyślnie wyłączone). Jeśli I / O przypadkowo przełączy się na niski poziom wyjściowy, będziesz miał niewielki pobór prądu.
  4. Ustaw pin na wejście, zewnętrzne rozwijanie : Ponownie koszt rezystora (tak, wiem, że są tanie, ale tanie + niepotrzebne = drogie.) Taki sam prąd jak w 3), jeśli pin przejdzie do aktywnego wysokiego.
  5. Ustaw pin na wyjściowy niski : ma wyższy prąd upływu niż po skonfigurowaniu jako wejście, ale nadal poniżej 1 µA, więc nie ma się czym martwić. Nadal umożliwiałbym wewnętrzne podciąganie. Nie będzie aktywny z wyjściem I / O jako wyjściem, ale jeśli przypadkowo zostanie przełączony na wejście, pin nie pozostanie swobodny.
  6. Ustaw pin na wyjściowy wysoki : Taki sam jak 5)
  7. Ustaw pin na niską moc wyjściową, zewnętrzny ściągacz : Rezystor rozkładany jest niepotrzebnym kosztem: sprawi, że wyjście będzie niskie, a już niskie. Ale w porównaniu do 5) ma tę zaletę, że masz pewność, że pin nie będzie się unosić, jeśli przypadkowo przełączysz na wejście.

Wybrałbym 1): wejście z wewnętrznym podciąganiem; nie są wymagane żadne części zewnętrzne. W FMEA 5) może być lepiej, ale zależy to od tego, jak wysoko szacujesz ryzyko, że zapomnisz włączyć wewnętrzne podciąganie. Przegląd oprogramowania powinien dać ci ubezpieczenie.

stevenvh
źródło
1

Szpilki zwykle same nie robią dużej różnicy. Zobaczysz, że każdy pin ma również określoną funkcję - wyłącz funkcję pin

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
}

pochodzi z http://www.nerdkits.com/library/lowpowerexample/, którzy również używają tych samych żetonów.

exussum
źródło