Hallo Leute, ich habe eine kleine Fernbedienung mit nem tiny13v aufgebaut und bin wegen dem Stromverbrauch am verzweifeln. Kurz zum System: - Stromversorgung: Litium-Batterie CR2025 (170mAh), 3V - uC: Watchdog-Timer wird verwendet als Interrupt (WDT Always Enable Fuse nicht programmiert), Int. RC Clock 4.8MHz, Brown-Out disabled - Programmierung in AVR-GCC - Keine ext. Peripherie, keine R,C,L's, nur zwei Taster und eine LED ohne Vorwiderstand (uC schaltet High-Active) Ausschnitt Code: #include <avr/io.h> #include <avr/interrupt.h> #include <stdint.h> #include <util/delay.h> #include <avr/sleep.h> #include <avr/wdt.h> int main(){ DDRB = (1<<PB0) | (1<<PB1) | (1<<PB2); PORTB |= (1<<PB3) | (1<<PB4); PCMSK = (1<<PCINT3) | (1<<PCINT4); GIMSK |= (1<<PCIE); ACSR = 0x80; sei(); while(1){ set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_mode(); } return 0; } ISR(WDT_vect) { /* ... */ } ISR(PCINT0_vect) { /* WDT wecken, ... */ } Der uC soll immer im Sleep sein, bis ein PCINT oder der Watchdog Interrupt aufweckt (letzterer wird in PCINT jeweils gestartet oder beendet). Alles klappt ganz gut und der uC scheint auch in den Sleep zu gehen (Idle Stromverbrauch ca. 2mA), er zieht aber dann noch satte 500uA! Deaktivieren von Pullups, externe 1MOhm-Pullups hat daran nichts geändert. Ich möchte die Stromaufnahme mindestens um den Faktor 10 verkleinern, sonst wird mir die Litium-Batterie in ein paar Tagen leergesaugt. Habe ich was wichtiges vergessen? Hat jemand Lösungsansätze? Viele Grüße Marco
@ Marco G. (tuding) >- Keine ext. Peripherie, keine R,C,L's, nur zwei Taster und eine LED >ohne Vorwiderstand (uC schaltet High-Active) Was füht dich zu der irrigen Annahmen, den Vorwiderstand weglassen zu können? >Habe ich was wichtiges vergessen? Hat jemand Lösungsansätze? siehe Sleep Mode Mfg Falk
> Was füht dich zu der irrigen Annahmen, den Vorwiderstand weglassen zu > können? Die verwendete LED ist eine IR-LED, die mit 40kHz angepulst wird. Laut Datenblatt hält die bis zu 500mA gepulst aus. Da der uC die LED positiv treibt, kommen eh nicht so viel durch. > siehe Sleep Mode Den Beitrag habe ich gelesen, habe aber nichts gefunden, was ich nicht schon beachtet hätte.
Marco G. schrieb: > Ausschnitt Code: D.h. Dein Fehler liegt im nicht geposteten Teil. Wozu der Watchdog? Warscheinlich macht der alle 15ms ein Reset und das ergibt dann den Verbrauch. Schalte alles ab und wache nur mit dem Pin-Change-Interrupt auf. Die Pullups dafür mußt Du natürlich an lassen. Peter
> Wie mißt Du 500µA gepulst?
Ich messe direkt zwischen -Pol Batterie zu Massefläche des Systems die
Stromaufnahme mit einem 3,5 Digit Multimeter. Die Stromaufnahme bleibt
konstant bei 500µA während des Sleep, wenn ich ne Taste drücke und den
µC aufwecke, fließt natürlich kurzzeitig ein höherer Strom. Lasse ich
die Taste los geht der µC wieder auf die 500µA zurück.
> Wozu der Watchdog? > Warscheinlich macht der alle 15ms ein Reset und das ergibt dann den > Verbrauch. Das wird in einem PCINT gesetzt: WDTCR = (1<<WDTIF) | (1<<WDTIE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0); Wie ich oben beschrieben habe, wird der Watchdog nicht zum Reset, sondern als Interruptquelle verwendet.
Marco G. schrieb: > Das wird in einem PCINT gesetzt: > WDTCR = (1<<WDTIF) | (1<<WDTIE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0); Willst Du Dir jetzt jedes relevante Code-Puzzleteilchen einzeln aus der Nase ziehen lassen? Und lies endlich mal, was über dem Postingfenster steht (Formatierung). Peter
> Willst Du Dir jetzt jedes relevante Code-Puzzleteilchen einzeln aus der > Nase ziehen lassen? Viel mehr steht ja nicht im Programm. Für meine Begriffe habe ich im ersten Posting alles verständlich erklärt. Habe jetzt auch in der Initialisierung den ADC nochmal explizit ausgeschaltet und den WDT Null gesetzt:
1 | ADCSRA &= ~(1<<ADEN); |
2 | WDTCR = 0x00; |
Damit bin ich alle Punkte im Datenblatt in Section 7.2 Minimizing Power Consumption durchgegangen, die Stromaufnahme ist aber gleich geblieben... Marco
Marco G. schrieb: > Ich messe direkt zwischen -Pol Batterie zu Massefläche des Systems die > Stromaufnahme mit einem 3,5 Digit Multimeter. Die Stromaufnahme bleibt > konstant bei 500µA während des Sleep, wenn ich ne Taste drücke und den > µC aufwecke, fließt natürlich kurzzeitig ein höherer Strom. Lasse ich > die Taste los geht der µC wieder auf die 500µA zurück. Hmmmmmmmmmm....... also irgendwie sträubt sich alles in mir zu glauben, daß ein Baumarktmultimeter soetwas halbwegs richtig anzeigt. Zumal mangels Parallelkondensatoren die Stromaufnahme wirklich sehr stark gepulst sein dürfte. Hast Du einen Oszi zur Hand, mit dem Du die Kurvenform der Stromaufnahme bestimmen kannst? Grüße Nicolas
> Zumal mangels Parallelkondensatoren die Stromaufnahme wirklich sehr stark > gepulst sein dürfte. Hast Du einen Oszi zur Hand, mit dem Du die > Kurvenform der Stromaufnahme bestimmen kannst? Habe einen 10µF Elko parallel zur Batterie geschaltet und gemessen, kein unterschied in der Stromaufnahme. Oszi habe ich leider keins zur Hand. Ein Indiz, dass der µC wirklich viel zu viel Strom nimmt ist, dass die Batteriespannung innerhalb von 3-4 Tagen auf 2,7 Volt abgefallen ist - 150mAh sind eben auch bei 0,5mA schnell leergezogen...
Hab nochmal ein Minimalbeispiel, falls jemand testen möchte:
1 | #define F_CPU 4800000
|
2 | |
3 | #include <avr/io.h> |
4 | #include <avr/sleep.h> |
5 | |
6 | int main (void) { |
7 | |
8 | DDRB = 0xFF; |
9 | PORTB = 0x00; |
10 | |
11 | while(1) { |
12 | |
13 | set_sleep_mode(SLEEP_MODE_PWR_DOWN); |
14 | sleep_mode(); |
15 | |
16 | }
|
17 | return 0; |
18 | }
|
Stromaufnahme 500µA bei 2,8V Versorgungsspannung. Fuses: Low Fuse: SPIEN = 0 und 4,8MHz High Fuse: Alles 1 Ich tippe mittlerweile auf defekten µC.
Hast du die interne Voltage Reference für den ADC abgeschaltet? Hast du die Portpins auf den Zustand gestellt, in dem sie am wenigsten Strom verbrauchen, bevor du in den Sleep Mode wechselst? Watchdog sollte aus sein, da der ja im Power Down Mode weiterläuft. Kannst du einfach testen in dem du nach einem Resett einfach mal nen Portpin toggelst und schaust ob sich im Sleep Mode was an dem Pin tut.
Wechsel mal die Zeile set_sleep_mode(SLEEP_MODE_PWR_DOWN); aus und schreib lieber: MCUCR = (1<<SE) | (1<<SM1); Dann ist sicher, dass der richtige Modus eingestellt ist und das SleepEnable (SE) high ist.
"A programmed DWEN Fuse enables some parts of the clock system to be running in all sleep modes. This will increase the power consumption while in sleep. Thus, the DWEN Fuse should be disabled when debugWire is not used." Wenn du Debugwire nutzt braucht der Tiny auch mehr Strom im Sleep.
Marco G. schrieb: >> Was füht dich zu der irrigen Annahmen, den Vorwiderstand weglassen zu >> können? > > Die verwendete LED ist eine IR-LED, die mit 40kHz angepulst wird. Laut > Datenblatt hält die bis zu 500mA gepulst aus. Da der uC die LED positiv > treibt, kommen eh nicht so viel durch. Also verwendest du den Ausgang des AVR als Vorwiderstand. Du weißt aber, daß man den nur mit 20 mA belasten darf?
Kurzer Test hier: tiny13V mit obigem Programm (Marco G., 14:20), intern 8MHz mit CKDIV8 (also 1MHz clock), 5V Versorgungsspannung, auf Brotbrett, keine Beschaltung ausser +Vcc und GND; Gemessen in der Versorgungsleitung mit einem UT70A: 0.47µA - in sehr guter Übereinstimmung mit dem Datenblatt. Entweder misst du Mist oder irgendwas anderes ist kaputt(tm). HTH
s/8MHz/9.6MHz/g;s/1MHz/1.2MHz/g; ∗hüstel∗</Ingrid>
Rolf Magnus schrieb: > Also verwendest du den Ausgang des AVR als Vorwiderstand. Du weißt aber, > daß man den nur mit 20 mA belasten darf? Nein, bis 40 mA ("Absolute maximum ratings"), und bei Vcc = 2,7 V und einer Flussspannung der IRED von vielleicht 1,5 V kommen laut "Typical characteristics" so zwischen 15 und 20 mA da raus, das passt schon. Bei Vcc = 3,0 V werden's ein paar mA mehr sein, aber trotzdem noch vertretbar. Die Drainstrecke des FETs arbeitet bei dieser Versorgungsspannung bereits nahezu im Konstantstrombereich (flacher Kurventeil), bei noch geringeren Vcc ist das noch ausgeprägter.
Jörg Wunsch schrieb: > Rolf Magnus schrieb: >> Also verwendest du den Ausgang des AVR als Vorwiderstand. Du weißt >> aber, daß man den nur mit 20 mA belasten darf? > > Nein, bis 40 mA ("Absolute maximum ratings"), Ich gehe vom Wert für den Normalbetrieb aus, und der ist 20 mA. > und bei Vcc = 2,7 V und einer Flussspannung der IRED von vielleicht 1,5 > V kommen laut "Typical characteristics" so zwischen 15 und 20 mA da > raus, das passt schon. Ok. Das dürfte dann aber wiederum für eine Fernbedienung etwas wenig sein.
Rolf Magnus schrieb: > Ich gehe vom Wert für den Normalbetrieb aus, und der ist 20 mA. Was ist für dich "Normalbetrieb", und wo steht ein solcher Wert? Dass es für die Benutzung als digitaler Ausgang nur Garantiewerte bis 10 mA gibt, spielt doch hier keine Rolle, das heißt nur, dass die High-Ausgangsspannung nur für diesen Strom getestet und vom Hersteller garantiert wird. Grenzwert gibt es nur den mit 40 mA (und dann noch die 200 mA für die Vcc- und GND-Pins, aber das ist hier auch kein Thema). Ganz davon abgesehen will er die LED sowieso nur pulsen, da spielt selbst die Wärmeentwicklung im IC keine Rolle mehr (die sonst noch ein Grund sein könnte, dass man die Wärme lieber extern in einem Vorwiderstand verheizt). > Ok. Das dürfte dann aber wiederum für eine Fernbedienung etwas wenig > sein. Mehr bringt doch die popelige Knopfzelle sowieso nicht, selbst diesen Strom kann man schon nur noch über einen guten Ladekondensator aufbringen. Diese Li-Knopfzellen sind nur für wenige mA Dauerstrom konzipiert. Keine Ahnung, wie effektiv IREDs dieser Tage so sind. Wenn die Stromergiebigkeit nicht reicht, könnte er ja noch zwei Pins parallel schalten.
Jörg Wunsch schrieb: > Rolf Magnus schrieb: > >> Ich gehe vom Wert für den Normalbetrieb aus, und der ist 20 mA. > > Was ist für dich "Normalbetrieb", und wo steht ein solcher Wert? Normalbetrieb ist für mich der, auf den das hier nicht zutrifft: "Exposure to absolute maximum rating conditions for extended periods may affect device reliability." Mit anderen Worten: Wenn man immer an die "absolute maximum ratings" geht, kann der µC davon kaputtgehen. Die 20 mA scheinen tatsächlich so nicht im Datenblatt des Tiny13 zu stehen. Ich hatte das wohl aus dem Datenblatt eines anderen AVR, wo das explizit so steht.
Danke an alle die geholfen haben. Der Tiny hatte ne Macke. Habe mir Ersatz beschafft, das ursprüngliche Programm (erster Post) draufgeladen und gemessen. Das "Baumarktmultimeter" zeigte 0,001 µA. Ziel erreicht. Warum der andere Tiny 500 mal mehr Strom gezogen hat - weiß der Geier. Ansonsten funktioniert der ja tadellos... Eigentlich total mist, dass man sowas nicht erkennen kann. Viele Grüße an alle Marco
@ Marco G. (tuding)
>und gemessen. Das "Baumarktmultimeter" zeigte 0,001 µA. Ziel erreicht.
Du meinst sicher 0,001mA, sprioch 1µA. 0,001µA wären 1nA, und das kann
dein 0815 Multimeter sicher nicht auflösen, noch braucht der Tiny Soooo
wenig Strom.
MFG
Falk
Du hast recht, ich meinte 1µA. Auch wenn das alte Multimeter nicht das tollste und beste ist, "Größenordnungen", d.h. ob eine Anwendung 500µA oder 10µA zieht, kann man damit durchaus gut bestimmen.
Hallo Marco, ich wollte auch nie Dein Gerät bashen - letztendlich lag es daran ja auch nicht - sondern nur das Problembewußtsein schaffen. In der Größenordnung von Strom sind mir schon einige Multimeter begegnet, bei denen die angezeigte Stromstärke irgendwo zwischen "grob geschätzt" und "frei erfunden" einzuordnen war. Marco G. schrieb: > [...] d.h. ob eine Anwendung 500µA oder 10µA zieht, kann > man damit durchaus gut bestimmen. Kannst Du ernsthaft froh drüber sein. Bei zwei von dreien meiner ist das nur noch grobes Stellengewackel. Viele Grüße Nicolas
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.