Forum: Mikrocontroller und Digitale Elektronik Stromverbraucher ATMega16 im Sleep Mode


von Heiko (Gast)


Lesenswert?

Moin moin,

Ich habe mit einem Mega16 ein kleines Gerät zum Betrieb am KFZ-Netz 
gebastelt. Funktioniert soweit - nur mit dem Stromverbrauch im 
sleep-Mode habe ich noch meine Probleme...

Mit dem folgenden Code komme ich auf ca. 4mA Power-Down-Stromverbrauch 
(delay_ms ist eine selbstgeschriebene delay-Funktion, um über die 
Grenzen aus avr-libc zu kommen)

   wdt_enable(WDTO_2S);

   while(1)
     {
        delay_ms(1000);
        set_sleep_mode(SLEEP_MODE_PWR_DOWN);
        sleep_mode();
        // reset the watchdog timer
        wdt_reset();
     }

Diese 4mA braucht hauptsächlich der 7805*, das LCD hat auch noch ein 
paar uA Ruhestrom, also OK.

Wenn ich das jetzt in mein mehr oder weniger "fertiges" Programm 
einbaue, Wakeup über INT2, ADC, alle drei Timer... braucht die gleiche 
Schaltung ca. 12mA (ohne Sleep-Mode 30mA - also wird der definitiv 
aktiviert)

Nun suche ich die MCU-Teile, die diese 8mA verbrauchen - folgendes habe 
ich schon getan:

- BOD deaktiviert (muss ich aber wieder aktivieren, sonst geht mein 
EEPROM-Inhalt flöten)
- Watchdog ist deaktiviert (will/muss ja über INT2 aufwachen)
- Alle Ports auf Tri-State (DDRx = 0, PORTx = 0)
- ADC aus (mittels ADEN = 0 in ADCSRA)
- LCD abgesteckt (falls es sich nicht wieder 100% ausschalten lässt)

Hilft alles nicht nennenswert. Im Datenblatt habe ich keine genaueren 
Infos dazu gefunden, was im Power-Down-Mode alles noch Strom verbraucht 
- alles was Takt braucht sollte ja aus sein...

Würde einer von euch seine Erfahrung diesbezüglich mit mir teilen und 
mich davon befreien, jeden einzelnen Funktionsblock noch zu 
deaktivieren?

Mein Dank und ein virtuelles Bier wären ihm sicher :) MfG, Heiko

*den ich nebenbei bemerkt genau deswegen gerne ersetzen würde - hab nur 
noch nichts gefunden, was tatsächlich weniger Strom zieht UND ca. 150mA 
für LCD-Hintergrundbeleuchtung liefern kann, OHNE aufwändige Kühlung

von Heiko (Gast)


Lesenswert?

Moin moin,

ich kapier es mittlerweile nicht mehr - selbst wenn ich alle Hardware 
deaktiviere, inklusive Timer und allem, das "große" Programm zieht 12mA, 
obwohl keine Hardware im AVR genutzt wird.

Nächster Versuch: Vor Eintritt in die while(1)-Schleife in der 
main()-Routine schlafen gehen. Kann ich leider erst Montag testen, bin 
derzeit nicht an der Hardware.

Oder ich lebe damit - 12mA auf 50Ah sind ja durchaus noch tragbar.

MfG, Heiko

von Heiko (Gast)


Lesenswert?

Moin moin,

so, weiterprobiert. Wenn ich den Code von oben an verschiedenen Stellen 
ins Hauptprogramm eingefügt habe, ging der Stromverbrauch auf die 
normalen 4mA runter.

Also weiterprobiert. Mit folgendem Code im Hauptprogramm funktioniert es 
jetzt.

    else // still no power - really go to sleep
       while(PINB & (1<<PB2))
         {
            delay_ms(10);
            set_sleep_mode(SLEEP_MODE_PWR_DOWN);
            sleep_mode();
         }

Entscheidend dabei: Das Delay. Warum auch immer - aber unter 5ms Delay 
zieht der Prozessor im Sleep 12mA, bei mehr Delay 4mA.

Grund? Keine Ahnung. Vor dem oberen Code deaktiviere ich den Watchdog, 
schalte das LCD ab, deaktiviere die PullUps und schreibe Daten ins 
EEPROM.

MfG, Heiko

von Michael U. (Gast)


Lesenswert?

Hallo,

hab jetzt nicht nachgelesen, aber wüste Vermutung:
könnte es sein, das der ADC noch im Wandlerzyklus ist und dann nicht 
abgeschaltet wird?

Gruß aus Berlin
Michael

von Heiko (Gast)


Lesenswert?

Möglich ist es - ich hatte den ADC allerdings probehalber auch mal 
deaktiviert.

Kann natürlich sein, dass auch bei ADEN = 0 noch der Zyklus zu Ende 
läuft, bevor der ADC abgeschaltet wird...

MfG, Heiko

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.