xmega128A1 Stromverbrauch

Gast #3888689
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;
}
#3888701
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.
#3888713
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...
Gast #3888763
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.
Gast #3890085
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;


}
Gast #3890317
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.
Gast #3890380
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 (;;)
  {

  }


}
Gast #3890396
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.
Gast #3890408
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?
Gast #3890585
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.
Gast #3890943
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?
Gast #3891462
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.
Gast #3911436
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();

}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren