Hallo,
meine Messergebnisse stimmen nicht mit den Datenblatt-Werten überein.
Konkret geht es um die Stromaufnahme vom Mikrocontroller im Ruhemodus,
wenn nur der Oszillator mit Prescaler und der TCB laufen.
(getestet am ATtiny402 @ 3.0V, 21°C)
1
-------------------------------------
2
Datasheet:
3
OSC20M (1MHz system clock): 125 µA
4
TCB @ 1 MHz: 7.5 µA
5
-------------------------------------
Zusammen: 132.5µA
Gemessen: 235µA
Irgendwas stimmt also nicht. Wo ist der Fehler?
1
// OSC20M: 16MHz
2
// Main Clock: 1MHz
3
#include<avr/io.h>
4
#include<avr/sleep.h>
5
6
intmain(void)
7
{
8
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLB,CLKCTRL_PDIV_16X_gc|CLKCTRL_PEN_bm);// 1 MHz Main Clock
9
10
PORTA.PIN1CTRL=PORT_ISC_INPUT_DISABLE_gc;// disable PA1 digital input buffer
11
PORTA.PIN2CTRL=PORT_ISC_INPUT_DISABLE_gc;// disable PA2 digital input buffer
12
PORTA.PIN3CTRL=PORT_ISC_INPUT_DISABLE_gc;// disable PA3 digital input buffer
13
PORTA.PIN6CTRL=PORT_ISC_INPUT_DISABLE_gc;// disable PA6 digital input buffer
14
PORTA.PIN7CTRL=PORT_ISC_INPUT_DISABLE_gc;// disable PA7 digital input buffer
15
16
TCB0.CCMP=0xC350;// count value
17
TCB0.CTRLA=TCB_RUNSTDBY_bm|TCB_ENABLE_bm;// enable Run in Standby, enable TCB
Eventuell am drumherum?
Es kommen jetzt die üblichen Fragen.
Wie hast du gemessen, nur den µC?
Was ist sonst noch dran, vielleicht fließt ja dein Strom aus einem
IO-Port?
Günstig ist wie immer auch ein Schaltplan. Und bei Low-Power besser den
kompletten, in eine Prinzip/Übersichtsschaltung passiert es schnell das
der verursachende Teil weggelassen wurde (ach ist doch nur die LED oder
so)
Bitte nicht missverstehen, ich bin Elektroniker, das sind die für mich
wesentlichen Fragen. Die deri Softwarezeilen versteht jemand anderes
besser.
Tja, merkwürdig: mein ATmega4809 nimmt 360 uA auf, ist jedoch mit 130 +
7.4 bei OSC20M angegeben; mit OSC16M sind es immer noch 290 uA. Ich sehe
aber keinen Fehler im Programm.
S. L. schrieb:> Für die Eingänge ist mit PORTx.PINnCTRL gesorgt.
Hast du mal geschaut, ob sich was ändert, wenn du die Einänge mal alle
per Pulldown runter ziehst oder mal als Ausgang konfigurierst? Rein
experimentell! Es muss ja einen Grund geben, dass du soweit weg von den
Spezifikationen bist...
Du kannst ja mal den Vorteiler verdoppeln, um zu sehen, welcher Anteil
konstant bleibt und welcher sich mit dem Takt halbiert.
Ist die Referenzspannung an (Brownout)?
Schon heute vormittag: pull-ups per PINnCTRL (bzw. PINCONFIG) ändert
nichts.
660 uA bei 2 MHz, 590 bei 0.5 (statt 560 bei 1).
FUSE_BODCFG und FUSE_WDTCFG stehen auf 0x00.
Mache die IO Pins mal alle als Output Low.
Schau wie sich der Stromverbrauch ändert bei anderem Takt oder anderen
Einstellungen (bleibt der Differenzbetrag gleich, oder skaliert er).
Du kommst ja schonmal im Powerdown auf deine unter 1µA.
Ich würde vermuten, dass du eine Brücke irgendwo hast. Guck mal wie viel
Strom beim Pullup fließen würde, wenn man den kurzschließen würde.
Ich hatte das Problem auch, aber mit einem 2-series im QFN. Da war ein
Pin mit GND kurzgeschlossen, Lötfehler.
Du hast 100µA Differenz, Pullups werden mit 35kOhm angegeben
(20-50kOhm), wären bei 3V irgendwas um die 80µA, also durchaus passend.
an Georg M.:
Wie es bei Ihrem ATtiny402 aussieht, kann ich natürlich nicht sagen; bei
meinem ATmega4809 verstehe ich den Unterschied in den beiden
Datenblattangaben nicht, siehe Anhang. Idle-Modus (entspricht Standby
mit aktivem TCB) bei 3.0 V und 5 MHz benötigt hier 520 uA, das passt so
ungefähr zu den angegebenen 0.4 mA; aber welche Bedeutung dann die 130
uA haben ... ?
Hallo,
habe auch gemessen. ATmega4808 TQFP auf Adapter auf Steckbrett. An der
Stiftleiste sind direkt 2x 100nF Keramik verlötet an Vcc und Avcc. Sonst
nichts. 5V über Multimeter auf Steckbrett. Ich messe 2,4µA. Allerdings
zeigen alle 3 Multimeter Minus an. Also -2,4µA. Wobei die Kabel richtig
herum gesteckt sind. Im Nicht Sleep Mode passt auch alles.
Keysight U1233A
Voltcraft VC940
Voltcraft VC220
Mit internal 32kHz keine Änderung.
Hallo,
@ TO & Herr Landolt
ich hatte ein paar komische Effekte beim Messen. Programmiere mal deinen
Controller für Sleep Mode, trenne die Versorgung, stelle Multimeter auf
µA und Verbindung wieder herstellen. Ich hatte auch im µA Meßbereich
Probleme mit dem flashen. Signatur wurde nicht erkannt usw. Weil ich
hatte auch öfters um die 480µA gemessen was viel zu hoch war. Als wenn
der Controller nicht im Sleep Mode war.
Mangels passender Messgeräte mache ich das so:
In Reihe zur Stromversorgung liegt ein 1 kΩ Widerstand, der zunächst
überbrückt ist. Das Programm auf dem µC legt ihn Schlafen. Das sehe ich
deutlich an der "Ampere" Anzeige des Netzteils.
Dann entferne ich die Brücke über dem Widerstand und messen den
Spannungsabfall.
> set_sleep_mode(SLEEP_MODE_PWR_DOWN);
Okay, aber das war ja unbestritten; da messe ich, wie geschrieben, unter
0.2 uA.
Es geht um die Relevanz dieser Angabe für den '16/20 MHz Oscillator
(OSC20M)' - die ist für mich als Anwender, nach derzeitigem
Kenntnisstand, so interessant wie, sagen wir mal, Länge&Breite
irgendeiner Leiterbahn auf dem Chip.
> komische Effekte beim Messen
hatte ich nicht (zugegeben, einmal falsch abgelesen). Alles passte
zusammen, auch bei dem 'AVR128DB48 Curiosity Nano', das ich schließlich
auch noch hervorkramte: die Stromangabe für den isolierten Oszillator
ist nur ein (Bruch-) Teil der Wahrheit.
> Programmiere ... trenne ... stelle ... wieder herstellen
Das wird bei mir nichts bringen - irgendwelche Effekte dabei hängen
sicher (auch) von Programmiergerät und Stromversorgung ab: das ist bei
mir alles Eigenbau.
Das Problem auf eine Frage reduziert: Unter welchen Voraussetzungen kann
der Anwender diese '130 uA' messen?
S. L. schrieb:> Wie es bei Ihrem ATtiny402 aussieht, kann ich natürlich nicht sagen; bei> meinem ATmega4809 verstehe ich den Unterschied in den beiden> Datenblattangaben nicht, siehe Anhang. Idle-Modus (entspricht Standby> mit aktivem TCB) bei 3.0 V und 5 MHz benötigt hier 520 uA, das passt so> ungefähr zu den angegebenen 0.4 mA; aber welche Bedeutung dann die 130> uA haben ... ?
Ja, etwas stimmt nicht.
Entweder braucht der TCB viel mehr Strom als angegeben, oder er läuft
nicht allein.
Oder könnte es andere Erklärungen geben?
Auszüge aus dem Datenblatt:
Three sleep modes:
• Idle with all peripherals running
• Standby (configurable operation of selected peripherals)
• Power-Down with full data retention
TCBn is, by default, disabled in Standby sleep mode.
It will be halted as soon as the sleep mode is entered.
The module can stay fully operational in the Standby sleep mode if the
Run Standby (RUNSTDBY) bit in the TCBn.CTRLA register is written to ‘1’.
Ich stelle mir das so vor: der isolierte Oszillator läuft mit den
angegebenen 125 uA (bzw. 130 oder 160), nur - die Frequenz muss über
weite Teile des Chips verteilt werden, das zehrt; deshalb auch das
deutlich schlechtere Verhältnis zum gemessenen Strom beim ATmega4809 im
Vergleich zum ATtiny402.
Hallo,
ich denke man muss das anders betrachten. Das ist nicht die absolute
Stromaufnahme, sondern der Wert um den es sich reduziert wenn man
Einheit x abschaltet bzw. zunimmt beim aktivieren. Laut Angabe im
Datenblatt ist das alles im Idle Sleep Mode.
ATmega4808 @5V @1MHz
S. L. schrieb:> Und schließlich ist da ja auch noch der Originalfall, Georg M. mit dem> ATtiny402.
Um den geht es mir auch.
Wie du schon bemerktest, ist Georg M. das Thema.
Ich weiß euer Problem sieht gleich aus, aber das heißt nicht, dass sie
dieselbe Ursache haben.
Mach ein eigenes Thema auf.
Eigentlich sollte hier ein Moderator aufräumen.
Veit D. schrieb:> Laut Angabe im Datenblatt ist das alles im Idle Sleep Mode.
Ja, das war mein Denkfehler. Ich habe naiv geglaubt, dass der TCB im
Standby Modus laufen kann (wie es im Datenblatt steht).
Offensichtlich wird stattdessen der Idle Modus eingeschaltet, bei dem
auch andere Komponenten Strom verbrauchen.
S. L. schrieb:> die Frequenz muss über> weite Teile des Chips verteilt werden, das zehrt
Ja, absolut richtig. Jetzt begreife ich es auch.
Es war schon klar, dass das Taktsignal nicht ganz ohne Energieaufwand
weitergeleitet werden kann. Überraschend ist dabei aber, dass diese
"dunkle" Stromaufnahme rund 20-mal höher liegt als der eigentliche
Energiebedarf des 16-bit-Zählers.
> ... 20-mal höher ...
Ich denke nicht. Die 7.5 uA des TCB sind bei unserer Betrachtung
vernachlässigbar.
Der Timer benötigt einen Takt, deshalb bleibt der Oszillator trotz
Stand-by-Modus eingeschaltet, was konkret dann dem Idle-Modus
entspricht, strommäßig. Es geht um die Differenz zwischen der
Datenblattangabe von 125 uA für den Oszillator und dem gemessenen Wert
von 235 im Betrieb - die erkläre ich mir damit, dass die Verteilung des
Oszillatorsignals über den Chip zusätzlichen Strom benötigt, und je
größer der Chip, wie bei meinen ATmega4809 bzw. AVR128DB28, umso mehr:
ATtiny402: +80 %, ATmega4809: +110 %, AVR128DB28: +240 %.
S. L. schrieb:> Die 7.5 uA des TCB sind bei unserer Betrachtung vernachlässigbar.
Welchen Sinn hat dann die Datenblatt-Angabe über die Stromaufnahme vom
TCB, wenn sie nur einen kleinen Bruchteil des Unvermeidbaren ausmacht?
S. L. schrieb:> Der Timer benötigt einen Takt, deshalb bleibt der Oszillator trotz> Stand-by-Modus eingeschaltet, was konkret dann dem Idle-Modus> entspricht, strommäßig. Es geht um die Differenz zwischen der> Datenblattangabe von 125 uA für den Oszillator und dem gemessenen Wert> von 235 im Betrieb - die erkläre ich mir damit, dass die Verteilung des> Oszillatorsignals über den Chip zusätzlichen Strom benötigt
Beim Oszillator allein (für diesen Test auf 16MHz umgeschaltet) messe
ich nur 95µA @ 3V. Der Rest ist für den TCB und die Taktzufuhr. Sonst
ist nichts eingeschaltet und muss also nicht mit dem Oszillatorsignal
beliefert werden. Theoretisch.
> Welchen Sinn hat dann die Datenblatt-Angabe> über die Stromaufnahme vom TCB
Vielleicht für Anwender, die 'EXTCLK' oder den '32 kHz ULP Int.
Oscillator' für den Systemtakt nutzen.
> Beim Oszillator allein (für diesen Test auf 16MHz> umgeschaltet) messe ich nur 95µA @ 3V. Der Rest ist> für den TCB und die Taktzufuhr.
Das heißt, 140 uA (235-95) für den TCB? Erstaunlich, wirklich ganz
erstaunlich. Dass der Winzling sich so anders verhält! Zum Vergleich:
S. L. schrieb:> Das heißt, 140 uA (235-95) für den TCB? Erstaunlich
Nein, das heißt, 7µA für den TCB und 133µA für die "dunkle Materie".
Oszillator allein (ATtiny402, 16MHz):
1
#include<avr/io.h>
2
#include<avr/sleep.h>
3
4
intmain(void)
5
{
6
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLB,CLKCTRL_PDIV_16X_gc|CLKCTRL_PEN_bm);// 1 MHz main clock
7
_PROTECTED_WRITE(CLKCTRL.OSC20MCTRLA,CLKCTRL_RUNSTDBY_bm);// Run in Standby
8
9
PORTA.PIN1CTRL=PORT_ISC_INPUT_DISABLE_gc;// disable PA1 digital input buffer
10
PORTA.PIN2CTRL=PORT_ISC_INPUT_DISABLE_gc;// disable PA2 digital input buffer
11
PORTA.PIN3CTRL=PORT_ISC_INPUT_DISABLE_gc;// disable PA3 digital input buffer
12
PORTA.PIN6CTRL=PORT_ISC_INPUT_DISABLE_gc;// disable PA6 digital input buffer
13
PORTA.PIN7CTRL=PORT_ISC_INPUT_DISABLE_gc;// disable PA7 digital input buffer
Ah, danke, CLKCTRL_OSC20MCTRLA hatte ich bislang übersehen - und damit
ist auch meine gestrige Frage beantwortet!
Am Rande: der Oszillator meines ATmega4809 benötigt 105 uA, das stimmt
recht gut mit den 130 aus dem Datenblatt überein.
Hallo,
habe auch nochmal rumgespielt. Die BOD Fuses machen bei mir auch wie
angegeben ca. 19µA aus zwischen Enable und Sample. Wegen Thema
Grundenergieverbrauch. ;-)
Wünsche ruhige Pfingsten.