Forum: Mikrocontroller und Digitale Elektronik xmega128A1 Stromverbrauch


von Alex (Gast)


Lesenswert?

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;
}

von Loocee L. (loocee)


Lesenswert?

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.

von Max D. (max_d)


Lesenswert?

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...

von stefanus (Gast)


Lesenswert?

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.

von Loocee L. (loocee)


Lesenswert?

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.

von Alex (Gast)


Lesenswert?

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;


}

von Loocee L. (loocee)


Lesenswert?

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 .....

von stefanus (Gast)


Lesenswert?

> 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.

von Alex (Gast)


Lesenswert?

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 (;;)
  {

  }


}

von spess53 (Gast)


Lesenswert?

Hi

>Danke habe ich gerade gemach bleibt immer noch 4mA

Wo?

MfG Spess

von Alex (Gast)


Lesenswert?

>
> 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.

von stefanus (Gast)


Lesenswert?

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.

von Alex (Gast)


Lesenswert?

Genau gesagt bei Power jumper.

von Alex (Gast)


Lesenswert?

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?

von spess53 (Gast)


Lesenswert?

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

von Alex (Gast)


Lesenswert?

spess53 schrieb:
> 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

Über Power jumper steht hier klar und deutlich:
http://www.atmel.com/Images/doc8370.pdf
s.3 an.

von spess53 (Gast)


Lesenswert?

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

von stefanus (Gast)


Lesenswert?

>> 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.

von Alex (Gast)


Lesenswert?

> Und was ist dabei heraus gekommen? Wie sieht der Quelltext mit sleep
> Modus aus?
#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;


        sleep_mode();

}
>
> 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.

Meinst du dass  man mit sleep_mode() Peripherie-Komponenten abschalten 
kann?

von spess53 (Gast)


Lesenswert?

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

von stefanus (Gast)


Lesenswert?

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.

von Alex (Gast)


Lesenswert?

> Bedenke, dass der Taktgeber viel Strom verbraucht, vor allem mit
> Kristall. Den kann man auch abschalten.

Wie kann man Taktgeber abschalten?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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.

von Alex (Gast)


Lesenswert?

habe ich auf 2.15mA gesetzt-habe ich PORTA.DIR = 0x00 als Eingang 
gemacht.
Komisch!

#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 = 0x00;
    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;


        sleep_mode();

}

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Schaltplan bitte!

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.