Ich habe ein kleines Problem bezüglich dem xmega128A1.
Laut Datenblatt zieht der µC im "Active Mode" bei 32MHz Takt und einer
Versorgungsspannung von 3,3V einen Strom von 21-22mA [im Datenblatt des
XMEGA A1: S.76 (34. Typical Characteristics --> 34.1 Active Supply
Current)].
Wie hoch muss dann einen Strom bei 2MHz sein?
Nun verwende ich das Entwicklungsboard XMEGA-A1 Xplained mit den
xmega128A1. Bei diesem kann man über einen Jumper den µC und die
Peripherie separat versorgen. Somit bin ich in der Lage den benötigen
Strom für den xmega einzeln zu messen.
Mit meinem aktuellen Programm zieht der xmega jedoch einen Strom von
4,35mA!?
Woran kann das liegen, dass ich so hohen
Stromverbrauch messe, als im Datenblatt angegeben?
Das ist mein Programm:
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
PORTF.DIR |= (1<<PIN7); // PIN7-PIN1 sind als Ausgang
beschlossen
PORTF.DIR |= (1<<PIN6);
PORTF.DIR |= (1<<PIN5);
PORTF.DIR |= (1<<PIN4);
PORTF.DIR |= (1<<PIN3);
PORTF.DIR |= (1<<PIN2);
PORTF.DIR |= (1<<PIN1);
PORTF.DIR &= ~(1<<PIN0); // Pin0 als Eingang beschlossen
PORTA.DIR = 0xFF;
PORTD.DIR = 0xFF;
PORTR.DIR = 0xFF;
PORTC.DIR = 0xFF;
PORTE.DIR = 0x00;
}
Alex schrieb:> Mit meinem aktuellen Programm zieht der xmega jedoch einen Strom von> 4,35mA!?
Wieviel erwartest du denn? Ist doch nicht so viel?
Du kannst nicht annehmen dass der Stromverbrauch proportional
zu Taktfrequenz zu- oder abnimmt.
Dein Programm hat übrigens keinen Einfluss auf den Stromverbrauch
da es zu Ende ist bevor du auch nur zum Strom Messen kommst.
Es gibt so viele Wege auf denen dein Stromverbrauch verfälscht weerden
kann.
Ich hab dir hier mal die häufigsten gelistet:
- I/O-Pin hängt Vcc/2 und die CMOS-Transis schließen kurz
- Externe Hardware (LEDs z.B.) brauchen zusätzlich Strom
- Die Taktfrequenz ist falsch eingestellt
- Du hast ein paar Eingänge die extern auf high/low getrieben werden als
Ausgänge definiert und treibst in die andere Richtung
- Pegelwandler
usw...
Die Stromaufnahme des Mikrocontrollers ist ungefähr linear im Verhältnis
zur Frequenz. Also bei 3,2Mhz ein Zehntel verglichen mit 32Mhz.
Einige Komponenten (z.B. Watchdog und R/C Oszillator) haben eine
weitgehend konstante Stromaufnahme, die noch dazu kommt.
Bei Taktfrequenzen unter 1Mhz dominieren die Komponenten mit konstanter
Stromaufnahme.
Offene Eingänge (mit undefiniertem Pegel) können durchaus mehr Strom
aufnehmen, als der ganze Rest des Mikrocontrollers. Darum soll man sie
auf GND oder VCC legen oder als Ausgang schalten, oder einen Pullup oder
Pulldown einschalten.
Dein Meßwert ist jedenfalls im Bereich dessen, was ich erwartet hätte.
Schau mal ins Datenblatt des Mikrocontrollers. Du kannst viele Features
deaktivieren, um die Stromaufnahme zu senken.
Eberhard F. schrieb:> Dein Programm hat übrigens keinen Einfluss auf den Stromverbrauch> da es zu Ende ist bevor du auch nur zum Strom Messen kommst.
Es sei denn die Ports die du auf Output gesetzt hast werden von
aussen mit "Stromverbrauchern" belastet.
Entschuldigung habe ich vieleicht falsch Ausgedrückt.
Ich habe ein kleines Problem bezüglich dem xmega128A1.
Nun verwende ich das Entwicklungsboard XMEGA-A1 Xplained mit den
xmega128A1. Bei diesem kann man über einen Jumper den µC und die
Peripherie separat versorgen. Somit bin ich in der Lage den benötigen
Strom für den xmega einzeln zu messen.
Mit meinem aktuellen Programm zieht der xmega jedoch einen Strom von
4,00mA!?
Denke ich mir muss Strom bei µc in µA bereich ligen soll.Woran kann das
liegen, dass ich so hohen Stromverbrauch messe?
Das ist mein Programm:
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
int main(void)
{
PORTF.DIR |= (1<<PIN7); // PIN7-PIN1 sind als Ausgang
beschlossen
PORTF.DIR |= (1<<PIN6);
PORTF.DIR |= (1<<PIN5);
PORTF.DIR |= (1<<PIN4);
PORTF.DIR |= (1<<PIN3);
PORTF.DIR |= (1<<PIN2);
PORTF.DIR |= (1<<PIN1);
PORTF.DIR &= ~(1<<PIN0); // Pin0 als Eingang beschlossen
PORTA.DIR = 0xFF;
PORTB.DIR = 0xFF;
PORTC.DIR = 0xFF;
PORTE.DIR = 0x00;
PORTD.DIR = 0xFF;
PORTR.DIR = 0xFF;
PORTK.DIR = 0xFF;
PORTJ.DIR = 0xFF;
PORTQ.DIR = 0xFF;
PORTH.DIR = 0xFF;
}
Alex schrieb:> Entschuldigung habe ich vieleicht falsch Ausgedrückt.
Irgendwie bekomme ich das Gefühl du hast die bisherigen Beiträge
nicht gelesen oder nicht verstanden .....
> Denke ich mir muss Strom bei µc in µA bereich ligen soll
Wiesom das denn, etwa weil das Programm zuende ist? Am Ende des
Programms fügt der Compiler automatisch eine Endlosschleife ein.
1
while (1) {};
Darum führt der Prozessor ständig Befehle aus. Wenn Du ihn wirklich
anhlaten willst, musst Du dich mit sleep Modi beschäftigen.
stefanus schrieb:>> Denke ich mir muss Strom bei µc in µA bereich ligen soll>> Wiesom das denn, etwa weil das Programm zuende ist? Am Ende des> Programms fügt der Compiler automatisch eine Endlosschleife ein.> while (1) {};>> Darum führt der Prozessor ständig Befehle aus. Wenn Du ihn wirklich> anhlaten willst, musst Du dich mit sleep Modi beschäftigen.
Danke habe ich gerade gemach bleibt immer noch 4mA
Code:#include <avr/sleep.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
int main(void)
{
PORTF.DIR |= (1<<PIN7); // PIN7-PIN1 sind als Ausgang
beschlossen
PORTF.DIR |= (1<<PIN6);
PORTF.DIR |= (1<<PIN5);
PORTF.DIR |= (1<<PIN4);
PORTF.DIR |= (1<<PIN3);
PORTF.DIR |= (1<<PIN2);
PORTF.DIR |= (1<<PIN1);
PORTF.DIR |= (1<<PIN0); // Pin0 als Eingang beschlossen
PORTA.DIR = 0xFF;
PORTB.DIR = 0xFF;
PORTC.DIR = 0xFF;
PORTE.DIR = 0x00;
PORTD.DIR = 0xFF;
PORTR.DIR = 0xFF;
PORTK.DIR = 0xFF;
PORTJ.DIR = 0xFF;
PORTQ.DIR = 0xFF;
PORTH.DIR = 0xFF;
for (;;)
{
}
}
>> Nun verwende ich das Entwicklungsboard XMEGA-A1 Xplained mit den> xmega128A1. Bei diesem kann man über einen Jumper den µC und die> Peripherie separat versorgen. Somit bin ich in der Lage den benötigen> Strom für den xmega einzeln zu messen.
Hier.
Nochmal: Wenn Du ihn wirklich anhalten willst, musst Du dich mit sleep
Modi beschäftigen.
Das hast du nicht getan.
Stattdessen hast Du eine nutzlose leere Endlosschleife eingefügt.
stefanus schrieb:> Nochmal: Wenn Du ihn wirklich anhalten willst, musst Du dich mit> sleep> Modi beschäftigen.>> Das hast du nicht getan.> Stattdessen hast Du eine nutzlose leere Endlosschleife eingefügt.
So was habe ich auch schon versucht da messe ich stadt 4mA 3.5mA. Muss
aber so weit ich weis µa bereich sein oder?
Hi
>Genau gesagt bei Power jumper.
Falsch. Da trennst du nur den Controller vom Rest des Boards.
Zum Sleep-Mode sieh dir mal hier
http://www.atmel.com/Images/doc8077.pdf
ab S.99 an.
MfG Spess
Hi
>Über Power jumper steht hier klar und deutlich:>http://www.atmel.com/Images/doc8370.pdf>s.3 an.
Ist mir bekannt. Aber was hat das mit deinen µA zu tun?
MfG Spess
>> Nochmal: Wenn Du ihn wirklich anhalten willst, musst Du dich mit>> sleep Modi beschäftigen. Das hast du nicht getan.>So was habe ich auch schon versucht
Und was ist dabei heraus gekommen? Wie sieht der Quelltext mit sleep
Modus aus?
Lesestoff dazu: http://www.mikrocontroller.net/articles/Sleep_Mode
Aund natürlich auch nicht die Informationen aus den Datenblättern
ignorieren. Ich vermisse nämlich auch Code-zeilen, die die ganzen
unbenutzten Peripherie-Komponenten abschaltet.
Hi
>Meinst du dass man mit sleep_mode() Peripherie-Komponenten abschalten>kann?
Nein. Oder meinst du ATMEL hätte 6 Seiten im Manual dazu geschrieben,
wenn es so einfach wäre?
MfG Spess
Doku lesen ist nicht so deine Stärke, was? Dann helf ich Dir mal.
Schau hier:
http://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html
Da steht gleich im ersten Anwendungsbeispiel, dass man vor sleep_mode()
erstmal den Modu einstellen soll, mit set_sleep_mode(<mode>);
Da steht auch, dass der Modus standardmäßig IDLE ist, so dass die
gesamte peripherie weiter getaktet wird. Im Idle Modus wird nur wenig
Strom eingespart.
Da steht außerdem der wichtige Hinweis, dass man den Brown-Out Detektor
deaktivieren soll, wenn man nicht will, dass er den Schlafzustand stört.
Außerdem verbraucht er einiges an Strom. Hast du das gemacht?
Was hast du an die Port Pins angeschlossen? Nichts?
Was ist mit Port E und F, haben alle Eingänge einen sauberen Logikpegel
(0V oder 3,3V, durch äußere Beschaltung oder interne Pull-Up
Widerstände)?
Bedenke, dass der Taktgeber viel Strom verbraucht, vor allem mit
Kristall. Den kann man auch abschalten.
Instruktion SLEEP!!!
Vorher natürlich die entsprechenden Register so beschreiben, dass der
Controller in einen tiefen Schlaf fällt und nicht nur in den Idle-Mode.