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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.