Forum: Mikrocontroller und Digitale Elektronik Frage zum STM32 - Widerstandsproblematik


von Udo (Gast)


Lesenswert?

Hallo Forumsgemeinde,

Ich bin leider noch etwas neu auf dem Gebiet "low power". Nun habe ich 
folgendes Problem:

Problem 1:

Bei einer Schaltung (Erkenung eines Protablen Moduls) soll der Prozessor 
jeweils beim Flankenwechsel eines Schalters (Miniatur-Rollenendtaster) 
aufwachen, und eine Aktion ausführen. Leider ergibt sich aus der 
Anwendung, das beide Tasterstellungen jeweils relativ lange anstehen, 
das heist die Schaltung kann bei gedrücktem Taster sowie auch bei 
ungedrücktem Taster in den "Schlafmodus" gehen. Im Schlafmodus wird ca. 
1.5uA benötigt (STOP2+RTC).

Ein PullDown/Up erzeugt folgende Ströme für folgende Widerstandswerte:

- 1k = 3mA
- 10k = 300uA
- 100k = 30uA
- 1M = 3uA

selbst wenn ein 1M Ohm Widerstand benutzt wird, fliessen über diesen 
jeweils das doppelte vom MCU Verbrauch ab. Das ist sehr unschön. Die 
"internen" Pull-Widerstände mit ca. 50k sind da auch keine Option.

Bei einer normalen Applikation wo eine Schaltung einfach aufwgewecht 
werden soll, ist das ja auch kein Problem. In meiner Applikation leider 
schon, da  beide Schaltzustände über lange Zeit existieren können.

Gibt es für dieses Probelem eine einfache Lösung, welche den 
Stromverbrauch senkt? Ziel wäre es, die komplette Schaltung von aktuell 
5uA, in die nähe der 1.5uA zu bringen, da der meiste Strom aktuell über 
den Widerstand abfliesst?


Problem 2:

Bei einer ähnlichen Schaltung, soll per internem ADC des STM32 die 
Batteriespannung einer LiMno2 Batterie geprüft werden, anders als bei 
LiIon Batterien, sinkt deren Spannung änlich einer 1.5V Batterie. 
Befindet sich die Schaltung (ein Kabelloser Sensor) im Tiefschlaf, 
verbaucht die Schaltung lediglich rund 330nA (Shutdown+RTC). Periodisch 
wacht die Schaltung auf, misst den Messert des Sensors und versendet 
diesen. Für die Betriebssicherheit wird die Batteriespannung über einen 
Spannungsteiler gemessen. Dieser ist aktuell mit 5.6M/5.6M 
dimensioniert. Diese wurden damals so gewählt, da höhere Werte im Format 
0603 schwer zu beschaffen sind. Der Spannungsteiler ergibt also rund 
11.2M. Bei einer vollen Batterie von 3V, fliessen über den Teile ganze 
300uA ab. Dies verursacht Mathematisch gesehen, eine halbsolange 
Batterielaufzeit im "Schlafmodus".

Gibt es hier eine Lösung den Stromverbrauch noch weiter zu senken?

von GEKU (Gast)


Lesenswert?

Udo schrieb:
> 1M = 3uA

Pullups noch größer machen?

von Jens M. (schuchkleisser)


Lesenswert?

Zu 1)
Wenn du einen Wechsler und genug Portpins hast, könntest du immer 
umschalten und nur den jeweils offenen Kontakt abfragen.
Braucht halt 4 Pins (2x In, 2x Pull), Stromaufnahme sollte so auf Null 
gehen.

Zu 2)
11,2M und 3V sind unter 300nA.
Mal ganz ab das ich kaum glauben kann das der ADC damit klar kommt (und 
nicht eh schon Leckströme in der Größenordnung vorhanden sind):
Du könntest den Pluspol via FET abklemmen und nur messen wenn du wach 
bist.

Aber ganz ehrlich:
Selbst mit 5µA ist bei bei den meisten Batterien im Stromverbrauch 
unterhalb der Selbstentladung.
5µA sind pro Jahr 44mAh. Halten die Batterien überhaupt so lange?

: Bearbeitet durch User
von guest (Gast)


Lesenswert?

Jens M. schrieb:
> Zu 1)
> Wenn du einen Wechsler und genug Portpins hast, könntest du immer
> umschalten und nur den jeweils offenen Kontakt abfragen.
> Braucht halt 4 Pins (2x In, 2x Pull), Stromaufnahme sollte so auf Null
> gehen.

??? Wenn das ein Wechsler ist braucht man eigentlich gar keine Pullups 
mehr und auch keine zusätzlichen Pins.

von A. B. (Gast)


Lesenswert?

guest schrieb:

> ??? Wenn das ein Wechsler ist braucht man eigentlich gar keine Pullups
> mehr und auch keine zusätzlichen Pins.

Wenn es kein Wechsler ist, hängt's von den Anforderungen an die 
zeitliche Auflösung ab: Periodischer Wakeup so etwa alle 10ms sollte bei 
einem mechanischer Taster wohl ausreichen, da der selbst i. d. R. etwas 
prellt.
Bei Wakeup den Portpin auf Digital-Ein mit Pull-Up oder -Down (je 
nachdem, ob Taster nach Masse oder VDD), Zustand ermitteln und dann 
Portpin auf von Pull-Up nach Pull-Down (oder umgekehrt) wechseln, dann 
fliesst kein Strom mehr, schlafen legen. Je nach 
Schlafmodus/Konfiguration bzw. genauem Typ des uC ist der Pin im 
Schlafmodus hochohmig, oder der Pull-Up/Down bleibt aktiv (aber dennoch 
kein Stromfluss).

Was die Batterieüberwachung anbelangt: Die Antwort mit 'nem MOSFET 
(alternativ Analogschalter), oder bei den neueren STM32 (z. B. G0) 
gleich den eingebauten Spannungsteiler mit internem Schalter dazu für 
VBat-Messung. S. RM0444, 14.10 Battery voltage monitoring.

von Udo (Gast)


Lesenswert?

Jens M. schrieb:
> Zu 1)
> Wenn du einen Wechsler und genug Portpins hast, könntest du immer
> umschalten und nur den jeweils offenen Kontakt abfragen.
> Braucht halt 4 Pins (2x In, 2x Pull), Stromaufnahme sollte so auf Null
> gehen.

Das Problem hier ist auch noch, das der Schalter abgesetzt auf einer 
kleinen Platine ist, welches mit einem kleinen Kabel verbunden wird, 
leider habe ich dort zu wenige Adern, somit kann ich nur mit einem Pin 
Arbeiten, oder die Schalterplatine müsste ersetzt werden.

Gibt es denn keine Lösung dies zu lösen, das garkein Pull-Up nötig ist? 
Ich meinte ich hätte an einigen IC's (z.b. Spannungsregler) schon Pins 
gesehen die entweder "floatend" oder High sein können, oder beinhalten 
diese einfach einen sehr hohen PullDown drinne?

> Aber ganz ehrlich:
> Selbst mit 5µA ist bei bei den meisten Batterien im Stromverbrauch
> unterhalb der Selbstentladung.
> 5µA sind pro Jahr 44mAh. Halten die Batterien überhaupt so lange?

Mein beführchtetes Problem ist eher die Summe von "Problemchen". xuA 
Selbstenladung, xuA Schlafstrom, xuA Leckstrom, das treibt in Summe 
schon einges her. Und persönlich habe ich irgendwie den Anspruch etwas 
technisch möglichst gut zu machen, also falls der Strom gesenkt werden 
kann, wieso sollte man das nicht tun?

von guest (Gast)


Lesenswert?

Udo schrieb:
> Gibt es denn keine Lösung dies zu lösen, das garkein Pull-Up nötig ist?

Doch, ein Wechsler nehmen. Die Mitte an Deinen Portpin, ein Ende an VDD, 
das andere an GND.

von Mike J. (linuxmint_user)


Lesenswert?

Den Spannungsteiler kannst du mit einem Transistor abschalten und wenn 
der PullUp an einem Taster hängt, dann fließt der Strom ja nur wenn der 
Taster gedrückt ist, wäre also eigentlich gar kein Problem.

von Gerd E. (robberknight)


Lesenswert?

Udo schrieb:
> Das Problem hier ist auch noch, das der Schalter abgesetzt auf einer
> kleinen Platine ist, welches mit einem kleinen Kabel verbunden wird,
> leider habe ich dort zu wenige Adern

Dein bisheriger Schalter hat doch 2 Adern. Gehen die beide zu Deinem 
Mikrocontroller oder nicht?

von temp (Gast)


Lesenswert?

Udo schrieb:
> eines Schalters (Miniatur-Rollenendtaster)

Hast du mal ins Datenblatt deines Schalters gesehen welche minimale 
Werte für Spannung und Strom da angegeben sind? Ich denke damit erübrigt 
sich die Problematik von selbst.

Die STM32 die ich kenne haben alle eine interne Referenz die der ADC 
messen kann. Daraus kann man dann die aktuelle Betriebsspannung 
berechnen, ganz ohne zusätzlichen Spannungsteiler.

von MaWin (Gast)


Lesenswert?

Udo schrieb:
> Gibt es für dieses Probelem eine einfache Lösung

Umschaltender Taster zwischen 0V und VCC.

Udo schrieb:
> Gibt es hier eine Lösung den Stromverbrauch noch weiter zu senken

Nutze die Spannung als Betriebsspannung des uC und messe nur beim 
Aufwachen mit dem internen ADC die Betriebsspannung.

von Jens M. (schuchkleisser)


Lesenswert?

guest schrieb:
> Wenn das ein Wechsler ist braucht man eigentlich gar keine Pullups
> mehr und auch keine zusätzlichen Pins.

Du meinst "den wechselnden an den Port, die beiden Ruhepole an plus und 
minus"?
Das wäre suboptimal, da der Kontakt zwischendrin ja weder noch 
kontaktiert.
ODer wie ginge es sonst?
Ich kenne nur die Lösung, das man an jeden Ruhepol je einen Input und 
einen Pull-Output anlegt, der Wechsler ist fest GND.
Der µC muss dann immer den gerade aktiven Kontakt auf Pulldown schalten, 
damit der Kontakt GND mit GND brückt (Strom also Null), der offene 
Kontakt dagegen wird Pullup geschaltet und kann den zugehörigen Input 
auf H ziehen.
Wenn der Kontakt wechselt, wird der Pin low, der Prozessor schaltet dann 
dementsprechend wieder um.
Der Pullstrom fließt also nur  so lange wie der Proz braucht aufzuwachen 
und umzuschalten.

Udo schrieb:
> Pins
> gesehen die entweder "floatend" oder High sein können, oder beinhalten
> diese einfach einen sehr hohen PullDown drinne?

Der ist nichtmal besonders hoch. Größenordnungen sind 50-100k.

A. B. schrieb:
> Periodischer Wakeup so etwa alle 10ms sollte bei
> einem mechanischer Taster wohl ausreichen,

Du meinst "aufwachen, Pull einschalten, evtl. reagieren, Pull 
abschalten, schlafen"?
Und das braucht bei 10ms Wakeup-Takt weniger Strom als ein paar µA 
dauerhaft zu pullen?
Ich bin jetzt nicht so der STM-Kenner, aber das erscheint mir schwer 
möglich.

Udo schrieb:
> also falls der Strom gesenkt werden
> kann, wieso sollte man das nicht tun?

Grundsätzlich stimme ich dir zu, nur muss man sehen was für Aufwand 
welche Kosten und/oder Nutzen verursacht.
Besser geht immer, aber wenn für doppelte Kosten aus 52 Wochen 54 Wochen 
werden, lohnt das nicht.
Du bist durch den Kontakt z.B. eingeschränkt, da wirds dann teuer bis 
unmöglich was zu reißen.

temp schrieb:
> Die STM32 die ich kenne haben alle eine interne Referenz die der ADC
> messen kann. Daraus kann man dann die aktuelle Betriebsspannung
> berechnen, ganz ohne zusätzlichen Spannungsteiler.

Das ist gut.
Quasi rückwärts messen: VDD als Referenz, Uref messen. Etwas rechnen und 
VDD kann ohne Spannungsteiler und Extrastrom bestimmt werden.

MaWin schrieb:
> Umschaltender Taster zwischen 0V und VCC.

Find ich "bah", weil der Portpin wenn auch nur kurz im Umschaltmoment 
offen ist.
Wurd emir zumindest so beigebracht.
Wäre das eine Industrietaugliche Lösung?

von MaWin (Gast)


Lesenswert?

Jens M. schrieb:
> Find ich "bah", weil der Portpin wenn auch nur kurz im Umschaltmoment
> offen ist.
> Wurd emir zumindest so beigebracht.
> Wäre das eine Industrietaugliche Lösung

Industrie macht:
1
            +-----10k----+
2
+5V --o\    |            |
3
        \o--+--|>o--|>o--+--|uC
4
GND --o         74HC14
Entprellt, ist nie offen, liegen in Ruhe immer 0V über den 10k.

von Jens M. (schuchkleisser)


Lesenswert?

Oh, interessant, danke.
Das muss ich auch mal ausprobieren.

von Clemens L. (c_l)


Lesenswert?

MaWin schrieb:
> Industrie macht:

Nennt sich "Bus Hold".

Und anstelle des 10 kΩ kann man auch den internen Pull-Up bzw. -Down des 
Mikrocontrollers nehmen, und die beiden 74HC14 durch Software ersetzen. 
(Das hat A.B. oben schon vorgeschlagen, aber mit periodischem Wakeup.)

von A. B. (Gast)


Lesenswert?

Jens M. schrieb:
> Du meinst "aufwachen, Pull einschalten, evtl. reagieren, Pull
> abschalten, schlafen"?
> Und das braucht bei 10ms Wakeup-Takt weniger Strom als ein paar µA
> dauerhaft zu pullen?
> Ich bin jetzt nicht so der STM-Kenner, aber das erscheint mir schwer
> möglich.

Das hängt entscheidend von der Dauer des Wachzustandes ab. Wenn das 
Verhältnis Wach/Schlaf klein genug ist, bleibt die mittlere 
Stromaufnahme halt entsprechend klein. Und mit entsprechendem 
Widerstand/Pufferkondensator tun die kurzen Pulse der Batterie auch 
nicht mehr weh als die mittlere Stromaufnahme.

Auch sind 10ms recht kurz. Je nach Anwendung wären auch 20 - 100 ms 
denkbar, aber das weiß halt nur der Anwender ... Entsprechend güstiger 
wär' die Bilanz.

von A. B. (Gast)


Lesenswert?

Jens M. schrieb:
> Das muss ich auch mal ausprobieren.

Aha, nun sind wir also beim Umschaltkontakt?! Also alles zurück auf Los 
...

von M.A. S. (mse2)


Lesenswert?

zu Problem 1:

Wenn das mit dem Wechsler nicht geht und nur zu wenige Leitungen zur 
Verfügung stehen, täte ich den Taster mit Controllerinternem Pullup 
pollen, wobei ich den Pullup jeweils nur für den Poll-Vorgang kurz 
einschalten würde.

Sprich: µC schläft die meiste Zeit, wird alle ? ms geweckt, schaltet 
Pullup ein, mißt nach, geht wieder schlafen.

Nachteile:
- natürlich erhöht dies ebenfalls den mittleren Stromverbrauch gegenüber 
einer Lösung, die nur bei Flankenwechsel (interruptgesteuert) aufwacht.

- Zeitauflösung?

von Stefan F. (Gast)


Lesenswert?

M.A. S. schrieb:
> täte ich den Taster mit Controllerinternem Pullup
> pollen

Ja

Udo schrieb:
> Gibt es denn keine Lösung dies zu lösen, das garkein Pull-Up nötig ist?

Es gibt nur zwei Möglichkeiten: Entweder fließt Strom, oder es fließt 
keiner. Du kommst nicht umhin, dass in einem der beiden Schaltzustände 
Strom fließen muss.

Für alle anderen Lösungen brauchst du mehr Leitungen oder einen 
Wechselschalter.

von Jens M. (schuchkleisser)


Lesenswert?

A. B. schrieb:
> Aha, nun sind wir also beim Umschaltkontakt?!

Keine Ahnung, wo "wir" "sind".
Ich finde die Lösung interessant und möchte das mal testen, denn ich 
habe "immer" die Variante mit den 4 Ports gemacht. Diese löst das 
Problem anders.
Ob sie für den TS geeignet ist, kann ich nicht beurteilen.

Clemens L. schrieb:
> Und anstelle des 10 kΩ kann man auch den internen Pull-Up bzw. -Down des
> Mikrocontrollers nehmen, und die beiden 74HC14 durch Software ersetzen.
> (Das hat A.B. oben schon vorgeschlagen, aber mit periodischem Wakeup.)

Wie geht das ohne den per. Wakeup? Dazu brauchts einen Proz, der Pullup 
und Pulldown kann, oder?

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.