Wie sollten nicht verwendete E / A-Pins am ATMega328P konfiguriert werden, um den geringsten Stromverbrauch zu erzielen?

15

Ich versuche, die Leistung eines von mir erstellten Arduino-Boards so weit wie möglich zu reduzieren. Wie müssen die nicht verwendeten Eingangsstifte konfiguriert werden? Es gibt bereits ein paar Antworten ( hier , hier ), aber ich bin auf der Suche nach etwas Speziellem für den ATMega328P.

  1. Setzen Sie den Stift auf den Eingang, und fahren Sie den Stift nach oben, um den internen Pull-up zu aktivieren
  2. Pin auf Eingang setzen, Antriebsstift niedrig
  3. Pin auf Eingang setzen, extern hochziehen
  4. Pin auf Eingang setzen, externer Pulldown
  5. Pin auf Low setzen
  6. Pin auf High setzen
  7. Stellen Sie den Stift auf einen niedrigen Ausgangspegel ein
geometrikal
quelle

Antworten:

12

Nach dem Durchstöbern des Datenblattes fand ich Folgendes :

14.2.6 Nicht verbundene Pins

Wenn einige Pins nicht verwendet werden, wird empfohlen, sicherzustellen, dass diese Pins einen definierten Pegel haben. Obwohl die meisten Digitaleingänge in den oben beschriebenen Tiefschlafmodi deaktiviert sind, sollten potentialfreie Eingänge vermieden werden, um den Stromverbrauch in allen anderen Modi zu reduzieren, in denen die Digitaleingänge aktiviert sind (Reset, Aktivmodus und Ruhemodus).

Die einfachste Methode, um einen definierten Füllstand eines nicht verwendeten Stifts zu gewährleisten, besteht darin, das interne Hochziehen zu ermöglichen. In diesem Fall wird das Pull-Up während des Resets deaktiviert. Wenn ein geringer Stromverbrauch während des Zurücksetzens wichtig ist, wird empfohlen, ein externes Pull-up oder Pull-down zu verwenden. Das direkte Anschließen nicht verwendeter Pins an VCC oder GND wird nicht empfohlen, da dies zu übermäßigen Strömen führen kann, wenn der Pin versehentlich als Ausgang konfiguriert wird.

Update in Bezug auf Kommentar / Frage:

Nach Tabelle 14-1 ist der Pull-Up-Widerstand nur aktiv, wenn folgende Bedingungen erfüllt sind:

  1. Der Pin wird als Eingang gesetzt (DDxn-Bit ist logisch niedrig)
  2. PORTxn ist logisch hoch eingestellt
  3. PUD ist logisch niedrig

Der Pull-up-Widerstand kann nur dann mit einem signifikanten Strom versorgt werden, wenn der Pin bei aktiviertem Pull-up einen niedrigen Pegel aufweist. Dies bedeutet, dass entweder Atmel stark (unwahrscheinlich) durcheinander gebracht wurde oder dass Sie den Pin als Eingang konfiguriert haben, während das Pull-up aktiviert ist und der Pin irgendwie mit Masse verbunden ist.

In diesem Abschnitt werden 14.2.5die Aktivierungs- und Ruhemodi für digitale Eingänge erläutert. Zusammenfassend kann gesagt werden, dass der Digitaleingang am Eingang des Schmitt-Triggers auf Masse geklemmt wird, um einen schwebenden Pegel im Ruhemodus zu verhindern, sofern der Pin nicht als externer Interrupt konfiguriert ist. Ich kann nicht feststellen, ob der digitale Ausgang im Ruhemodus deaktiviert ist. Es sieht nicht so aus, als wäre es laut Abbildung deaktiviert 14-2, obwohl ich nicht zu überrascht wäre, wenn es so wäre. Am besten verwenden Sie einen internen oder einen externen Pull-Up-Widerstand.

helloworld922
quelle
danke, denkst du, das ist besser als einen Ausgang einzustellen, in Bezug auf die verbrauchte Leistung? Fließt Strom durch den internen Pull-up? Das Gerät befindet sich die meiste Zeit im Energiesparmodus.
geometrikal
aktualisierte Antwort. Ich glaube nicht, dass Sie zu viele Probleme haben werden, wenn es sich um eine Ausgabe handelt, aber am besten nehmen Sie Atmels Rat an.
helloworld922
9
  1. Pin auf Eingang setzen, Pin hoch fahren, um internen Pull-up zu aktivieren : Ich denke, dies sollte lauten: " Eingabe durch Aktivieren des internen Pull-up auf Hoch setzen ". (Ich würde das Wort "fahren" nur dann verwenden, wenn Sie dies aktiv tun, mittels eines FET an Vcc oder Masse.) Es ist klar, dass Sie einen definierten Pegel wollen, und das Pull-up kümmert sich darum. Vergewissern Sie sich, dass das Aktivieren des Pull-Ups nach dem Zurücksetzen eine der ersten Aktionen ist. Dies gilt im Allgemeinen für die E / A-Initialisierung. Der einzige Strom ist der Leckstrom des NFET des Gegentaktpaares und der Gate-Leckstrom des Eingangs-FET. Weniger als 1 µA: OK.
  2. Pin auf Input setzen, Pin auf Low fahren : Keine gute Idee. Wenn die Software auf Bananen umschaltet und den Pin auf High schaltet, wird der Pin kurzgeschlossen, wodurch der PFET des komplementären Paars beschädigt wird.
  3. Pin auf Eingang setzen, extern hochziehen : Ist wie 1), nur teurer. Hat aber den Vorteil, dass der Klimmzug immer dabei ist; Möglicherweise vergessen Sie, das interne Pullup zu aktivieren (das standardmäßig deaktiviert ist). Wenn die E / A versehentlich auf einen niedrigen Ausgangswert umschaltet, ist der Stromverbrauch gering.
  4. Pin auf Eingang setzen, externes Pulldown : Wieder die Kosten für einen Widerstand (ja, ich weiß, sie sind billig, aber billig + unnötig = teuer.) Derselbe Strom wie in 3), wenn der Pin auf Aktiv-Hoch gehen würde.
  5. Pin auf niedrigen Ausgangsstrom einstellen : Hat einen höheren Ableitstrom als bei Konfiguration als Eingang, liegt aber immer noch unter 1 µA, sodass Sie sich keine Sorgen machen müssen. Ich würde das interne Pull-up trotzdem aktivieren. Es wird nicht mit dem I / O als Ausgang aktiv sein, aber wenn es versehentlich auf Eingang geschaltet würde, würde der Pin nicht schweben.
  6. Pin auf High setzen : wie 5)
  7. Stellen Sie den Pin auf einen niedrigen externen Pulldown-Ausgangswert ein : Der Pulldown-Widerstand verursacht unnötige Kosten: Er würde einen bereits niedrigen Ausgangswert auf einen niedrigen Wert bringen. Aber im Vergleich zu 5) hat dies den Vorteil, dass Sie sicher sind, dass der Pin nicht schwebt, wenn er unbeabsichtigt auf Eingang geschaltet wird.

Ich würde für 1) gehen: Eingabe mit internem Pull-up; Keine externen Teile erforderlich. In einer FMEA kann 5) besser abschneiden, aber das hängt davon ab, wie hoch Sie das Risiko einschätzen, dass Sie vergessen, das interne Pull-up zu aktivieren. Ein Software-Design-Peer-Review sollte Sie versichern.

stevenvh
quelle
1

Die Stifte machen normalerweise selbst keinen großen Unterschied. Sie werden sehen, dass jeder Pin auch eine bestimmte Funktion hat - deaktivieren Sie die Funktion des Pins

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
}

entnommen aus http://www.nerdkits.com/library/lowpowerexample/, die auch die gleichen chips verwenden.

exussum
quelle