Come devono essere configurati i pin I / O inutilizzati su ATMega328P per il minor consumo energetico?


15

Sto cercando di ridurre il potere il più possibile in una scheda Arduino che ho creato. Come devono essere configurati i pin di ingresso non utilizzati? Ci sono alcune risposte ( qui , qui ) per questo, ma sto cercando qualcosa di specifico per ATMega328P.

  1. Impostare il pin su input, il pin drive in alto per attivare il pull-up interno
  2. Imposta il pin su input, il pin del drive basso
  3. Imposta pin su input, pull up esterno
  4. Imposta pin su input, pull down esterno
  5. Impostare il pin su uscita bassa
  6. Imposta il pin su alto
  7. Impostare il pin su uscita bassa, pull down esterno

Risposte:


12

Dopo aver scavato nel foglio dati , ho trovato questo:

14.2.6 Pin non collegati

Se alcuni pin non vengono utilizzati, si consiglia di assicurarsi che questi pin abbiano un livello definito. Anche se la maggior parte degli ingressi digitali è disabilitata nelle modalità di sospensione profonda come descritto sopra, gli ingressi fluttuanti dovrebbero essere evitati per ridurre il consumo di corrente in tutte le altre modalità in cui gli ingressi digitali sono abilitati (Reset, Modalità attiva e Modalità inattiva).

Il metodo più semplice per garantire un livello definito di un pin non utilizzato è abilitare il pull-up interno. In questo caso, il pull-up verrà disabilitato durante il reset. Se è importante un basso consumo di energia durante il ripristino, si consiglia di utilizzare un pull-up o pull-down esterno. Non è consigliabile collegare i pin non utilizzati direttamente a VCC o GND, poiché ciò potrebbe causare correnti eccessive se il pin viene configurato accidentalmente come uscita.

aggiornamento in relazione a commento / domanda:

Secondo la tabella 14-1, la resistenza di pull-up è attiva solo quando sono soddisfatte le seguenti condizioni:

  1. Il pin è impostato come input (il bit DDxn è logicamente basso)
  2. PORTxn è impostato su logica alta
  3. PUD è logico basso

L'unico modo per ottenere una corrente significativa che attraversa la resistenza di pull-up è se il pin presenta un livello basso con il pull-up abilitato. Ciò significa che Atmel ha incasinato gravemente (improbabile) o hai il pin configurato come input con il pull-up abilitato e il pin è in qualche modo collegato a terra.

La sezione 14.2.5tratta dell'abilitazione dell'ingresso digitale e delle modalità di sospensione. Per riassumere, l'ingresso digitale è bloccato a terra all'ingresso del Trigger Schmitt per impedire un livello flottante mentre si trova in modalità di sospensione, a meno che il pin non sia configurato come un interrupt esterno. Non riesco a capire se l'uscita digitale è disabilitata in modalità sospensione. Non sembra che sia disabilitato secondo la figura 14-2, anche se non sarei troppo sorpreso se lo fosse. La soluzione migliore è utilizzare una resistenza pull-up interna o esterna.


grazie, pensi che sia meglio che impostare un'uscita, in termini di potenza utilizzata? C'è corrente che attraversa il pull-up interno? Il dispositivo sarà in modalità di spegnimento per la maggior parte del tempo.
geometrikal,

risposta aggiornata. Non credo che avrai troppi problemi con l'output, ma la cosa migliore è prendere il consiglio di Atmel.
helloworld922,

10
  1. Imposta pin su input, drive pin high per attivare il pull-up interno : penso che questo dovrebbe leggere: " rendere l'input alto coinvolgendo il pull-up interno ". (Userei la parola "drive" solo se lo fai attivamente, tramite un FET su Vcc o ground.) È chiaro che vuoi un livello definito, e il pull-up se ne occupa. Assicurati che l'abilitazione del pull-up sia una delle prime cose che fai dopo il reset. Questo vale per l'inizializzazione dell'I / O in generale. L'unica corrente sarà la corrente di dispersione dell'NFET della coppia push-pull e la dispersione del gate del FET di ingresso. Meno di 1 µA: OK.
  2. Imposta pin su input, pin unità basso : non è una buona idea. Se il software va in banane e commuta il pin su output alto stai cortocircuitando il pin, danneggiando il PFET della coppia complementare.
  3. Imposta pin su input, pull up esterno : è uguale a 1), solo più costoso. Ma ha il vantaggio che il pull-up sarà sempre lì; potresti dimenticare di abilitare il pull-up interno (che è disabilitato di default). Se l'I / O passa accidentalmente all'uscita bassa, si avrà un piccolo assorbimento di corrente.
  4. Imposta pin per input, pull down esterno : di nuovo il costo di una resistenza (sì, lo so che sono economici, ma economici + non necessari = costosi). La stessa corrente di quella in 3) se il pin andasse su attivo.
  5. Imposta pin su uscita bassa : ha una corrente di dispersione maggiore rispetto a quando configurata come ingresso, ma comunque inferiore a 1 µA, quindi nulla di cui preoccuparsi. Vorrei comunque abilitare il pull-up interno. Non sarà attivo con l'I / O come uscita, ma se si accendesse accidentalmente in ingresso il pin non rimarrebbe mobile.
  6. Imposta il pin su output alto : uguale a 5)
  7. Imposta il pin su output basso, pull down esterno : la resistenza pull-down è un costo non necessario: renderebbe un output basso, che è già basso. Ma rispetto a 5) ha il vantaggio di essere sicuro che il pin non galleggerà se involontariamente commutato su input.

Vorrei 1): input con pull-up interno; nessuna parte esterna richiesta. In una FMEA 5) può andare meglio, ma ciò dipende da quanto si stima il rischio che si dimentica di abilitare il pull-up interno. Una revisione tra pari di progettazione software dovrebbe fornire un'assicurazione.


1

I pin di solito non fanno una differenza enorme da soli. Vedrai che ogni pin ha anche una funzione specifica: disabilita la funzione del 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
}

tratto da http://www.nerdkits.com/library/lowpowerexample/ che usano anche gli stessi chip.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.