Forum: Mikrocontroller und Digitale Elektronik Wo werden 0,72 mA verbraucht??


von Cetin A. (exaware)


Lesenswert?

Hallo zusammen,

ich habe hier ein komisches Problem. Aber zuerst mal eine Beschreibung 
zu meiner Schaltung. Die Schaltung wird mit 3 Mignon Batterien 
betrieben.

An einem ATmega168PA hängt ein Funkmodul (RFM12B), ein 
Luftfeuchtigkeitssensor (HH10D) und ein Temperatursensor (DS1621).
Es gibt drei 10K Pullups, zwei davon hängen am I2C und einer hängt am 
Reset-Pin des ATmegas und es hängt ein 16 MHz Quarz am AVR. Der Quarz 
vom RFM wird nicht benutzt. Die zwei Sensoren bekommen ihre 
Spannungsversorgung über einen PORT-Pin des ATmegas. Die zwei Pullups 
gehen auch auf diesen PORT-Pin.

Der ATmega sendet ein Signal an einen anderen Teilnehmer und wartet auf 
einen Antwort. Nach dem Erhalt der Antwort, wird der RFM12 in den 
Sleep-Mode geschickt und dessen Wakeup-Timer auf 10 Sekunden gesetzt. 
Anschließend legt sich der ATmega in den Power-Down-Sleep-Mode. Nach 10 
Sekunden wird der ATmega vom RFM12 geweckt und der ATmega beginnt wieder 
von vorn. Das funktioniert soweit ganz gut. Aber der Stromverbrauch ist 
komisch, im normalfall geht der Gesamtstromverbrauch der Schaltung auf 
160µA runter, im Sleep-Mode. Jedoch kommt es immer wieder vor 
(sporadisch) das der Stromverbrauch nur auf 880µA fällt. Der Fehler 
tritt nicht systematisch auf. Mit 160µA würde ich mich zufrieden geben, 
mit 3 Mignon Batterien würde ich es dann auf 1 jahr bringen. Der 
Taktausgang vom RFM12 wird ordnungsgemäß abgeschaltet (Kontrolliert mit 
Oszi). Also am RFM12 sollte es nicht liegen. Ich habe ein gutes 
Voltcraft Multimeter, daran sollte es also auch nicht liegen.

Wer hat eine Idee, wo die 720µA sporadisch verbraucht werden??

: Bearbeitet durch User
von Arc N. (arc)


Lesenswert?

I2C möglicherweise... Das würde nach Ohm relativ gut zu den Pullups 
passen d.h. irgendwas/wer könnte die I2C-Leitungen auf Low ziehen...

von Cetin A. (exaware)


Lesenswert?

Habe auch schon die zwei Pullups von der I2C Leitung entfernt. Fehler 
ist aber geblieben. Die zwei Sensoren schalte ich auch vorher ab.
Der Fehler besteht leider weiterhin.

von 42 (Gast)


Lesenswert?

Meine Kristallkugel sagt R42 ist das Problem.

von Kurt B. (kurt-b)


Lesenswert?

Cetin A. schrieb:
> Habe auch schon die zwei Pullups von der I2C Leitung entfernt. Fehler
> ist aber geblieben. Die zwei Sensoren schalte ich auch vorher ab.
> Der Fehler besteht leider weiterhin.

Interne Pullaps nicht weggeschaltet und Ausgänge auf Low gelegt.

 Kurt

von Cetin A. (exaware)


Lesenswert?

Habe soeben alle drei externe Pullups sowie die beiden I2C Sensoren 
entfernt. Der Fehler blieb weiterhin. Aber wie gesagt immer nur 
sporadisch. Morgen werde ich mir die internen Pullups genau anschauen 
und werde mich dann noch mal melden. Danke für die Hilfe bis jetzt. Bis 
morgen. Gruß Cetin.

PS: Kann es auch am externen Quarz vom Avr liegen? Kann der sich 
vielleicht irgendwie aufhängen und diesen Stromverbrauch verursachen? 
Ich habe nämlich nicht die zwei Kondensatoren am Quarz nicht verbaut, da 
ich die nicht da hatte.

: Bearbeitet durch User
von APW (Gast)


Lesenswert?

Hochohmige Eingänge, die in der Luft hängen, können auch zu erhöhtem 
Stromverbrauch führen.
Wenn meine Schaltung im Sleep einen höheren Strom aufnimmt als erwartet,
mache ich u.a. folgendes: Ich fahre mit dem Finger leicht an den Pins 
der ICs entlang. Schwankt dabei die Stromaufahme, könnte ein offener 
Eingang vorliegen.
Ich kenne mich mit den Atmegas nicht aus. Könnte es sein, dass z.B. der 
ADC (falls dieser verwendet wird) vor dem Sleep kontrolliert 
ausgeschaltet werden muss?

von Achim S. (Gast)


Lesenswert?

Cetin A. schrieb:
> Jedoch kommt es immer wieder vor
> (sporadisch) das der Stromverbrauch nur auf 880µA fällt.

Den beiden Sensoren sollte ja die Versorgung weggeschalten werden. Das 
würde ich zuerst mal nachmessen (und zwar im Fehlerfall). Wenn sowohl an 
deren Versorgung als auch an all deren IOs die Spannung auf 0V liegt, 
sollten die nicht für den Extrastrom verantwortlich sein. Falls doch 
noch irgendwo eine Spannung an ihnen anliegt, die den Sensor (parasitär) 
powern könnte: Schaltungsdesign nochmal durchdenken ;-)

Wenn da alles passt würde ich die Versorgungen von µC und Funkmodul 
auftrennen, so dass man deren Teilströme getrennt messen kann. Dann 
weißt du wenigstens, wer von beiden den Strom zieht und kannst dich in 
der weiteren Fehleranalyse darauf konzentrieren.

von Pete K. (pete77)


Lesenswert?

Kannst Du nicht auf den internen Taktgeber umstellen? Dann wäre es 1 (3) 
Bauteil weniger.

10k Pullups und 3xMignon hören sich nach 5V-Design an, der HH10D ist 
aber nur für 3V6 max. spezifiziert.

Wir brauchen einen Schaltplan!

: Bearbeitet durch User
von Alexander S. (esko) Benutzerseite


Lesenswert?

Cetin A. schrieb:
> Aber der Stromverbrauch ist
> komisch, im normalfall geht der Gesamtstromverbrauch der Schaltung auf
> 160µA runter, im Sleep-Mode. Jedoch kommt es immer wieder vor
> (sporadisch) das der Stromverbrauch nur auf 880µA fällt.

Wie misst du den Strom? Wenn du das Multimeter auf Strommessung stellst 
und einfach in die Versorgung einschleifst, dann fällt am Shunt des 
Multimeters eine Spannung ab. Der Shunt ist meist zwischen 1Ω und 1000Ω. 
Bei 1mA sind es also leicht 1 Volt.
Lese mal hier: http://www.eevblog.com/files/uCurrentArticle.pdf


> Ich habe ein gutes Voltcraft Multimeter, daran sollte es also
> auch nicht liegen.
Soso.

: Bearbeitet durch User
von Hobbyist (Gast)


Lesenswert?

Alexander Schmidt schrieb:

>> Ich habe ein gutes Voltcraft Multimeter, daran sollte es also
>> auch nicht liegen.

Woher bekommt man denn bitte ein GUTES Voltcraft Multimeter?

Aber daran wird es wohl nicht liegen.
Hast Du mal die Stromaufnahmen der jeweiligen "Module" getrennt 
gemessen? Finde doch erst mal raus, wer denn da den Strom zieht. Wenn du 
dann weist wer der Böse ist, dann ist es wesentlich einfacher eine 
Lösung zu finden.

Hobbyist

von Thomas (Gast)


Lesenswert?

Strom im Mikroampere-Bereich mit einem Voltcraft Multimeter messen?
... ich denke das geht schief.

Kauf dir doch mal das hier: http://eevblog.myshopify.com/

Thomas

von isidor (Gast)


Lesenswert?

Pete K. schrieb:
> Wir brauchen einen Schaltplan!

Das wäre wirklich zu viel verlangt. Das kann man nicht machen.

von Stefan F. (Gast)


Lesenswert?

Ich denke APW hat es auf den Punkt gebracht (in beiden Punkten: offene 
Eingänge und ADC).

von Dennis R. (dennis_r93)


Lesenswert?

Ich kann mir vorstellen, dass ein Pin unterschiedlich gesetzt ist, je 
nachdem ob die 720 uA zusätzlich verbraucht werden oder nicht.
Evtl hängt das mit dem letzen Bit einer Übertragung zusammen?

Den Tip mit dem Finger finde ich gut. ist da etwas raus gekommen?

von Cetin A. (exaware)


Angehängte Dateien:

Lesenswert?

So, da bin ich. Ich bin immer noch nicht weitergekommen. Hab jetzt mal 
die freien Pins auf Ausgang geschaltet und konnte so den Stromverbrauch 
im Sleep-Mode auf 2µA reduzieren. Aber zwischendrin schleicht sich die 
72µA immer wieder ein.

APW schrieb:
> Ich fahre mit dem Finger leicht an den Pins
> der ICs entlang.

Das habe ich probiert. Bei mir schwankt da nichts.

Achim S. schrieb:
> Den beiden Sensoren sollte ja die Versorgung weggeschalten werden. Das
> würde ich zuerst mal nachmessen (und zwar im Fehlerfall).

Die zwei Sensoren werden zuverlässig ausgeschaltet, auch im Fehlerfall 
liegt an ihnen keine Spannung an. habe ich nachgemessen.

Pete K. schrieb:
> Kannst Du nicht auf den internen Taktgeber umstellen? Dann wäre es 1 (3)
> Bauteil weniger.

habe ich auch schon probiert. Glwicher Fehler hier auch.

Pete K. schrieb:
> 10k Pullups und 3xMignon hören sich nach 5V-Design an

Fast, ich benutze 1,2V Akkus.

Alexander Schmidt schrieb:
> Wie misst du den Strom?

Ich messe in der Plus-Leitung vor der Schaltung, also den gesamtstrom 
der Schaltung.

Hobbyist schrieb:
> Woher bekommt man denn bitte ein GUTES Voltcraft Multimeter?

Wollte nicht mit meinem Multimeter protzen, wollte damit eigentlich nur 
andeuten, dass man das Messgerät als Fehlerquelle ausschließen kann.

Dennis R. schrieb:
> Evtl hängt das mit dem letzen Bit einer Übertragung zusammen?

Die Vermutung habe ich auch und habe mal versucht INT0 u. INT1 Pins am 
Atmega vor dem Schlafen gehen auf einen definierten Zustand zu setzen, 
leider kein Erfolg.

Ich habe sogar schon das Funkmodul gegen ein neues ausgewechselt. Kein 
Erfolg.

Ich habe den Schaltplan und das Programm angehängt. Ich hoffe ihr könnt 
mir da weiterhelfen, ich bin echt am Verzweifeln.

von Hubert G. (hubertg)


Lesenswert?

Ich hoffe du warst mit den Kondensatoren nicht tatsächlich so geizig wie 
in deinem Schaltplan.

von Cetin A. (exaware)


Lesenswert?

Hubert G. schrieb:
> Ich hoffe du warst mit den Kondensatoren nicht tatsächlich so geizig wie
> in deinem Schaltplan.

Ich habe nur das was auf dem Schaltplan ist. Dachte ich könnte auf die 
Kondensatoren verzichten da ich keinen Spannungsregler, kein Netzteil 
habe und weil die Schaltung nicht gerade viel Strom zieht. Das Maximum 
liegt so ca bei 30mA.

Update:
Habe jetzt mal im Fehlerfall erst den HH10D abgesteckt und im zweiten 
Fehlerfall habe ich dann den DS1621 abgesteckt um zu schauen ob diese 
den Strom ziehen. Am Strom hat sich nichts geändert.
Also an den beiden I2C-Sensoren liegt es meiner Meinung nicht.

Update 2:
Jetzt bin ich ein Schritt weitergekommen. Habe jetzt mal im Fehlerfall 
die zwei Sensoren und den Atmega abgezogen und an der 72µA Strom hat 
sich nicht geändert. Also liegt es 100% am RFM12.

Der Wakeup-Timer funktiniert auf jeden fall denn sonst würde der Atmega 
jede Sekunde senden, mit dem Wakeup-Timer sendet es so alle 10 Sekunden.

Irgendwelche Komponenten am RFM12 werden vermutlich nicht sauber 
abgeschaltet. Aber wie kann ich das feststellen und vor allem warum 
werden einige Komponenten nicht sauber abgeschaltet. Der SPI-Takt liegt 
etwa bei 2MHz, das ist eigentlich ok.

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Cetin A. schrieb:
> Dachte ich könnte auf die
> Kondensatoren verzichten

Falsch gedacht. Die Kondensatoren sind ja nicht dafür da, das Netzteil 
glücklich zu machen, sondern den MC abzublocken. Deswegen schreibt das 
auch Atmel ins Datenblatt und nicht der Hersteller der Mignon Akkus :-P
CMOS erzeugt bei jedem Schaltvorgang einen 'Shoot-through' der Gegentakt 
Buffer, die zu Spitzen auf der Versorgungsspannung führen. Diese werden 
von den Kondensatoren aufgefangen.
Ausserdem sind sie in deiner Anwendung mit dem RFM12 auch noch nützlich 
als HF Blocker. Das RFM Modul sollte sowieso eine gut abgeblockte und 
verdrosselte Versorgung bekommen, da es dann wesentlich besser empfängt.
Ausserdem wird AREF nicht auf +VCC gelegt, sondern auf einen 100nF o.ä. 
Kondensator. Das Anschliessen an Vcc ist Quatsch, denn erstens kannst du 
Vcc intern auswählen und zweitens verbaust du dir die Möglichkeit, mal 
eine andere AREF auszuwählen.

: Bearbeitet durch User
von Cetin A. (exaware)


Lesenswert?

Hallo nochmal,

ich hab es jetzt endlich zum Laufen bekommen. Ich habe die init-Routine 
vom RFM und die Standby-Routine am AVR überarbitet.

Hier die alte Init-Routine:
1
void rfm12_init(void)
2
{
3
  for(uint8_t t=0;t<30;t++)_delay_ms(10);                // Warten bis RFM12 hochgefahren
4
  DDRB  |=  (1<<PB0);                          // PB0 (nFFS) als Ausgang   (Wird nicht benötigt, wenn ein Pullup vorhanden ist)
5
  PORTB |=  (1<<PB0);                          // nFFS auf high ziehen    (Wird nicht benötigt, wenn ein Pullup vorhanden ist)
6
  DDRD  &= ~(1<<PIND2);                        // PD2(INT0) für den nIRQ-Pin  
7
  DDRD  &= ~(1<<PIND3);                         // PD3(INT1) für den FIFO-Interrupt
8
  EICRA |= (1<<ISC10) | (1<<ISC11);                  // INT1 steigende Flanke
9
  EIMSK  |= (1<<INT1);                        // INT1 aktivieren
10
  rfm12_write(0xC000);                        // AVR CLK: 1MHz
11
  rfm12_write(0x80D7);                        // Enable FIFO
12
  rfm12_write(0xC2AB);                        // Data Filter: internal
13
  rfm12_write(0xCA81);                        // Set FIFO mode
14
  rfm12_write(0xC4F7);                        // AFC settings: autotuning: -10kHz...+7,5kHz
15
  rfm12_write(0x82C8);                        // Empfänger einschalten
16
  rfm12_write(0xCA81);                        // set FIFO mode
17
  rfm12_write(0xCA83);                        // enable FIFO  
18
  rfm12_setfreq(RF12FREQ(433.92));                  // Sende/Empfangsfrequenz auf 433,92MHz einstellen
19
  rfm12_setbandwidth(4, 1, 4);                    // 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm 
20
  rfm12_setbaud(RFM12_BAUD);                      // Baudrate einstellen
21
  rfm12_setpower(0, 6);                        // 1mW Ausgangangsleistung, 120kHz Frequenzshift  
22
  rfm12_write(0x0000);                        // Interrupts löschen
23
}

Und hier die neue Init-Routine:
1
void rfm12_init(void)
2
{
3
  DDRB  |=  (1<<PB0);                          // PB0 (nFFS) als Ausgang   (Wird nicht benötigt, wenn ein Pullup vorhanden ist)
4
  PORTB |=  (1<<PB0);                          // nFFS auf high ziehen    (Wird nicht benötigt, wenn ein Pullup vorhanden ist)
5
  DDRD  &= ~(1<<PIND2);                        // PD2(INT0) für den nIRQ-Pin  
6
  DDRD  &= ~(1<<PIND3);                         // PD3(INT1) für den FIFO-Interrupt
7
  EICRA |= (1<<ISC10) | (1<<ISC11);                  // INT1 steigende Flanke
8
  EIMSK  |= (1<<INT1);                        // INT1 aktivieren
9
  for(uint8_t t=0;t<10;t++)_delay_ms(10);                // Warten bis RFM12 hochgefahren
10
  rfm12_write(0x8201);                         // Sleep
11
  rfm12_setbandwidth(4, 1, 4);                    // 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm 
12
  rfm12_setbaud(RFM12_BAUD);                      // Baudrate einstellen
13
  rfm12_setfreq(RF12FREQ(433.92));                  // Sende/Empfangsfrequenz auf 433,92MHz einstellen
14
  rfm12_write(0xE74E);                            // Wakup-Timer 10 Sekunden
15
16
  rfm12_write(0x80D7);                        // Enable FIFO
17
  rfm12_write(0x0000);                        // Interrupts löschen
18
}

Und hier die alte Standby-Routine:
1
void rfm12_sleep()
2
{
3
  rfm12_write(0x0000);
4
  rfm12_write(0x8057);                                // Sende-Fifo deaktivieren (Bit el löschen) Wichtig!
5
  rfm12_write(0x8203);                                  // Wakeup aktivieren, Clockoutput aus
6
  rfm12_write(0xE74E);                                    // Wakup-Timer 10 Sekunden
7
}
8
9
void atmega_sleep()
10
{
11
  SENSOREN_OFF;
12
13
  // Geht in die Schlafphase    
14
  ACSR  |= (1 << ACD);                                // Analogcomparator ausschalten
15
  EIMSK |= (1 << INT0);                                      // externen Interrupt freigeben
16
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);                        // Sleep-Modus: PowerDown      
17
  sleep_mode();                                    // Atmega in den Sleep-Modus schiken    
18
  
19
  // Ab hier wieder wach
20
  EIMSK &= ~(1 << INT0);                                     // externen Interrupt sperren        
21
  rfm12_init();                                    // RFM12 initialisieren    
22
  
23
  if (TypMode == Sensor)                                // Wenn Modul = Sensor
24
  {
25
    SENSOREN_ON;                                  // Sensoren einschalten
26
    i2c_init();
27
    hh10d_init();                                  // init HH10D
28
    ds1621_init();                                  // init DS1621
29
  }                                          
30
31
}

Hier die neue Standby-Routine:
1
void rfm12_sleep()
2
{
3
  rfm12_write(0x0000);                                // Interrupts löschen
4
  rfm12_write(0x801F);                                // Sende-Fifo deaktivieren (Bit el löschen) Wichtig!
5
  rfm12_write(0x8201);                                  // Wakeup aktivieren, Clockoutput aus
6
  rfm12_write(0x8202);                                  // Wakeup aktivieren, Clockoutput aus
7
8
}
9
10
void atmega_sleep()
11
{
12
  SENSOREN_OFF;
13
14
  // Geht in die Schlafphase    
15
  PORTB |= (1<<PB0);
16
  ACSR  |= (1 << ACD);                                // Analogcomparator ausschalten
17
  EIMSK |= (1 << INT0);                                      // externen Interrupt freigeben
18
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);                        // Sleep-Modus: PowerDown      
19
  sleep_mode();                                    // Atmega in den Sleep-Modus schiken      
20
  // Ab hier wieder wach
21
  EIMSK &= ~(1 << INT0);                                     // externen Interrupt sperren        
22
  rfm12_write(0x80D7);                                // Enable FIFO
23
  rfm12_write(0x0000);                                // Interrupts löschen  
24
  if (TypMode == Sensor)                                // Wenn Modul = Sensor
25
  {
26
    SENSOREN_ON;                                  // Sensoren einschalten
27
    i2c_init();
28
    hh10d_init();                                  // init HH10D
29
    ds1621_init();                                  // init DS1621
30
  }                                          
31
}

Den Erfolg brachten die zwei Zeilen:
1
rfm12_write(0x8201);                                  // Wakeup aktivieren, Clockoutput aus
2
  rfm12_write(0x8202);                                  // Wakeup aktivieren, Clockoutput aus

Meiner Meinung nach total unlogisch da folgende Zeile das gleiche macht, 
nur halt in einem Schritt:
1
rfm12_write(0x8203);

Aber jetzt geht es ja, jetzt kann ich endlich weitermachen.
Ich danke euch für eure Antworten.

von Peter D. (peda)


Lesenswert?

Cetin A. schrieb:
> APW schrieb:
>> Ich fahre mit dem Finger leicht an den Pins
>> der ICs entlang.
>
> Das habe ich probiert. Bei mir schwankt da nichts.

Das ist korrekt.
Im Powerdown werden alle digitalen Eingänge abgeschaltet, die nicht als 
Aufwachinterrupt programmiert sind.

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.