Hi zusammen!
Ich brauch mal bitte jemanden zum Mitdenken:
Mein MSP430F169 will scheinbar nicht in den Low Power Mode 3. Sagt
zumindest meine Strommessung. Nach dem Initialisieren der Ports und
aller Module braucht der Controller laut Messgerät ca. 600uA. Beim
Aufrufen des LPM3 werdens nur etwa 40uA weniger. Wow.
Den LPM3 rufe ich im C-Code so auf:
1
for(;;){
2
//(toller Code)
3
4
START_TIMER();//start timer for periodic wake up
5
6
// MSP power down (LPM3: all clocks but ACKL disabled), general interrupts enable
7
_BIS_SR(GIE+CPUOFF+SCG1+SCG0);
8
}
Das Makro "START_TIMER" lässt einen Timer zählen, dessen Interrupt den
MSP aufweckt. Im Interrupt wird der Low Power Mode ausgeschaltet, zurück
zur oberen Schleife gesprungen, diese ausgeführt und wieder in den
Ruhezustand gewechselt.
Springe ich im Einzelschritt durch den Code, schläft der MSP wie
erwartet nach dem abarbeiten von
1
_BIS_SR(GIE+CPUOFF+SCG1+SCG0);
und wacht durch den Timer wieder auf. Soweit klappt das Programm.
Abgesehen vom Strom, der mit grob 599uA viel zu viel ist.
Lasse ich den programmierten MSP ohne Debugger laufen, ändert sich auch
nichts. Das Messgerät stimmt, ich hab's gerade mit dem Strom an ein paar
Widerständen überprüft. Eine Spannungsfolger muss ich also nicht
aufbauen.
Vielleicht noch: Entwicklungsumgebung ist Code Composer Studio Version:
4.0.2.01003. In den (1001) Einstellungen habe ich nichts gefunden, was
zum beschriebenen Problem führen würde.
Hat jemand eine Ahnung, ob irgendwas den LPM3 (also DCO bzw. CPU OFF) am
MSP verhindert?
Auch der abgezogene Debugger (Olimex Tiny) bringt keine Veränderung. Ich
hab noch einen Taster dran, der P1.5 gegen Masse schaltet. Ein
Pullup-Widerstand erzeugt mir den stabilen Highpegel. Der isses aber
auch nicht.
Während der Initalisierung der Portpins ändert sich auch nichts am
Stromverbraucht. Die schließe ich daher aus. Ein EEPROM ist nicht dran.
Auf dem Board ist noch ein Funktransceiver (Chipcon CC2420). Den kann
ich erfolgreich abschalten (verbraucht idle ca. 200uA, die sind bei den
600uA nicht mitgerechnet).
Mir ist gerade noch aufgefallen, dass das Initialisieren der
UART-Schnittstelle auf SPI-Mode bei ver-odern des SYNC-Bits (schaltet
zwischen RS232 und SPI um) um 200uA ansteigt. Obwohl sich das Modul beim
Initialisieren im Reset befindet. Komisch...
Hier ist die Initialisierung des UART-Moduls auf SPI-Funktion:
Hab gerade IAR Workbench anstatt dem CodeComposer ausprobiert. Keine
Veränderung. Auch ein neuer MSP zeigt gleiches Verhalten.
Mein Problem ist wohl zu speziell, als dass hier groß Tipps reinkokmmen
würden, oder?
Hi Daniel,
Kann man den Funktransceiver abziehen?
Wenn ja, dann teste mal ohne.
Hatten ein ähnliches Problem bei UART.
Lösung: Ein Impedanzwandler in der Datenleitung zwischen µc und
Funkmodul.
Gruß
@jensen:
Nein, den Funktransceiver kann ich leider nicht abziehen. Meinst du,
dass Abschalten zwar funktioniert, aber verbundene Leitungen trotzdem
stören?
@Heinz:
Der MSP läuft mit dem internen DCO auf ~800kHz. Der Timer wird mit einem
externen Uhrenquarz betrieben. Im LPM3 sollte der DCO abgeschaltet
werden.
Der LPM3 hat schonmal in einem anderen Projekt funktioniert, da bin ich
mir sicher. Ich kann aber nicht sagen, was jetzt anders ist.
Eben habe ich noch etwas festgestellt:
Wenn ich den Pullup-Widerstand an P1.5 wegnehme und P1.5 als Eingang
unbeschaltet lasse, geht der Stromverbrauch bei Aktivieren des LPM3
tatsächlich auf wenige uA zurück. Allerdings nur für 1-2 Sekunden.
Dannach steigt der Strom wieder an. Halte ich den Widerstand kurz an den
Pin und nehme ihn wieder weg, fällt der Strom und steigt dann wieder.
(Das kann ich ewig wiederholen... Workaround: Widerstand periodisch
anschließen? ;-))
Daniel Schwarz schrieb:
>Nein, den Funktransceiver kann ich leider nicht abziehen. Meinst du,>dass Abschalten zwar funktioniert, aber verbundene Leitungen trotzdem>stören?
Durchaus möglich.
Bei uns war es so, das nach dem Initialisieren der UART (Port 3) der
Stromverbrauch sich extrem steigerte (4mA), obwohl MSP im LPM3 war.
Mit abgezogenem Funkmodul funktionierte es tadellos (80µA).
Abhilfe durch OPV in Datenleitung und nun "funzt" es.
Der Funkbaustein ist leider fest draufgelötet. An die Leitungen komm ich
nicht ohne Weiteres ran. Ich habe den UART mal nicht initialisiert, das
hat aber auch nichts gebracht.
Wie Heinz schon vorgeschlagen hat, habe ich den LPM auch direkt in Main
geschrieben. An allen möglichen Positionen und mit allen möglichen
Initialisierungen.
Kann da irgendein blöder Anschluss floaten?
Sowas hatte ich auch mal beim MSP430. Durch viel probieren der einzelnen
Zustände der I/Os zwischen dem MSP und den übrigen Bauteilen bin ich
dann irgendwann in die Nähe des Datenblatt-Verbrauchs gekommen. Manche
Leitungen als Eingang, manche als Ausgang, manche Low, manche High. Es
macht sogar einen Unterschied, ob mal PxOUT auf Low oder High setzt,
wenn der Pin als Eingang geschaltet ist. Alles sehr mysteriös und leider
mit viel Probieren verbunden.
Hab ich erwähnt, dass ich das gerade zum Kotzen finde?!
Das mit den Pegeln an den Ports stimmt wohl irgendwie. Im Datenblatt ist
auch die "Connection of unused pins" angegeben. Daran hab ich mich
jetzt mal gehalten. Es ist ein bisschen besser geworden, aber noch weit
weg von optimal.
Ist leider so. Bei vielen Ports bei mir hab ich PxDIR auf Eingang stehen
und den Ausgangstreiber auf Low. Generell geht der Stromverbrauch auch
etwas zurück, wenn man die Zweitfunktion abschaltet.
> Der MSP läuft mit dem internen DCO auf ~800kHz. Der Timer wird mit einem> externen Uhrenquarz betrieben. Im LPM3 sollte der DCO abgeschaltet> werden.
Aha, also ein LPM3 direkt als ersten Befehl bringt nicht die erwünschte
Änderung ?
Dann gehe jede Peripherie/Port/Pin einzeln durch und schau ob/wann es
besser wird. Wildes rumgesuche führt zwar auch mal zum Ziel, aber danach
weißt du genauso viel wie vorher.
Also schön aufschreiben und nachdenken !
Jörg S. schrieb:
> Wie machst du denn eigentlich die Strommessung wenn er alle x ms> aufwacht?
Der einfachste Weg ist, den Spannungsabfall an einem hochohmigen
Reihenwiderstand zu messen (200 mV Bereich) und parallel zum Widerstand
eine Si-Diode. Im Stromsparbereich stört die Diode kaum, weil der Strom
sehr klein ist und viel weniger als 700 mV an Diode/Widerstand abfallen,
man erhält also eine genaue Messung. Wenn der Controller "aufwacht"
bricht seine Versorgungsspannung um max. 700 mV wegen der Diode ein ->
meist kein Drama.
Gruß,
Bernd
Man sollte auch mal die Errata bemühen. Manchmal gibt es Bugs in denen
Clocks oder der ADC nicht abgestellt werden - da bringt dann ein
gefummele am Port nicht sonderlich viel. Wenn alles korrekt ist, dann
sollte man bei maximal 10µA landen.
Auf der Suche nach Mikroamperes bin ich jetzt auf 12uA runter!
3 Auslöser habe ich gefunden:
- Zum einen war's wohl wirklich der Funktransceiver am Port 5: Werden
die Datenleitungen (MOSI, MISO und SCK) von der Option "Special
function" zurück auf allgemeine I/O-Leitung geschaltet, werden's
schonmal ein paar Hundert uA weniger
- Wie im Datenblatt beschrieben: alle unbenutzten Pins auf I/O-Funktion,
Ausgang und low schalten bringt noch ein paar uA
- Zu dumm zum Programmieren: Takt der ACKL teilen lief bei mir über
1
BCSCTL1=DIVA_3;
Fehler hier: Oder-Operator vergessen. Das schaltet im Register den
Quarzoszillator ein und braucht damit 250uA.
Die restlichen 10-11uA sind mir jetzt egal. Für die Batterie reicht bei
diesem Profil für mehr als ein Jahr. Ich hab an genug Portpins gewackelt
und finde einfach nichts mehr (Exemplarstreuung, obwohl der Wert gut vom
Datenblatt abweicht?).
Danke für eure Hilfe, mein Problem kann als gelöst betrachtet werden!
Daniel
========================================================================
===
Hier noch ein kleiner Einschub, weil die Frage aufkam. Vielleicht hilfts
ja dem ein oder anderem:
Jörg S. schrieb:
> Wie machst du denn eigentlich die Strommessung wenn er alle x ms> aufwacht?
Entweder wie Bernd das beschrieben hat, oder man hat ein Multimeter,
dass schon im uA-Bereich zuverlässig messen kann oder rückwirkungsfreie
Messung kleiner Ströme mit einem OP:
Strommessungen mittels Spannungsabfall über einen niederohmigen
Messwiderstand (Shunt) würden hier zu ungenaue Ergebnisse liefern. Um
den Stromverbrauch der zu betreibenden Hardware auch bis in den unteren
Mikroamperebereich sicher messen zu können, kannst du einen sog.
Transimpedanzwandler aufbauen. Das ist ein als invertierender Verstärker
beschalteter Operationsverstärker, der zwischen die MASSELEITUNG(!) der
Last geschaltet wird. (Schaltung siehe
http://www.elektronik-kompendium.de/sites/slt/0210141.htm).
Der Operationsverstärker (OPV) versucht, die Differenzspannung UNP an
seinen Eingängen (+ und -) auf 0 V zu halten. Der Widerstand R2 (siehe
Link zur OP-Schaltung) dient zur Rückkopplung der Ausgangsspannung, um
dieses Ziel zu erreichen. Tritt über eine Last eine Spannungsdifferenz
auf (der Widerstand R1 stellt die Last mit dem fließenden Laststrom Ie
dar), wird die Spannung am Ausgang Ua solange erhöht, bis UNP = 0 V ist.
Der Punkt S besitzt demnach auch das Potential 0 V, obwohl dieser gar
nicht real auf Masse liegt. S wird deshalb auch als „virtuelle Masse“
bezeichnet. Der fließende Strom ist nach dem Ohmschen Gesetz der
Quotient aus der Ausgangsspannung Ua und dem Rückkoppelwiderstand R2
(mit negativem Vorzeichen, wegen des invertierenden Eingangs).
Bei dieser Schaltung ist folgendes zu beachten:
- Der OPV muss schnellen Lastwechseln und damit schnellen Änderungen der
Spannungsdifferenz am Eingang entsprechend schnell folgen können
- Der OPV sollte symmetrisch mit Spannung versorgt werden (dual supply),
damit Ströme in beiden Richtungen gemessen werden können
- Wird der Laststrom zu groß, steigt die Ausgangsspannung max. bis zur
Versorgungsspannung des OPVs. Die Spannungsdifferenz kann nicht mehr
ausgeregelt werden und der Massebezug fällt weg. Durch zwei antiparallel
geschaltete Schottkydioden zwischen dem invertierenden Eingang und Masse
kann das Einbrechen der Spannung vermieden werden: Je nach Polung der
Spannung wird eine der beiden Dioden gegen Masse leitend. Der
Spannungsabfall von ca. 0,2 V muss in diesem Fall allerdings in Kauf
genommen werden
Die Spannung misst du dann am besten mit dem Oszi (schnelle Lastwechsel
macht ein Multimeter der Torzeit wegen nicht mit bzw. kannst du ein
Stromprofil aufzeichen), invertierst den Kanal und rechnest von
gemessener Spannung in den Strom zurück (wie oben beschrieben).