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
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...
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.
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
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
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?
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.
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
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
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
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
Pete K. schrieb: > Wir brauchen einen Schaltplan! Das wäre wirklich zu viel verlangt. Das kann man nicht machen.
Ich denke APW hat es auf den Punkt gebracht (in beiden Punkten: offene Eingänge und ADC).
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?
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.
Ich hoffe du warst mit den Kondensatoren nicht tatsächlich so geizig wie in deinem Schaltplan.
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.