Forum: Mikrocontroller und Digitale Elektronik [STM32] Wie Batterie erkennen?


von Peter M. (pbm)


Lesenswert?

Beim STM32 kann man eine Batterie an einen bestimmten Pin anschließen, 
damit die Echtzeituhr auch ohne Betriebsspannung weiter läuft. Wenn 
keine Batterie vorhanden ist, soll der Pin mit Vcc verbunden werden. 
Diese Wahl habe ich über einen Jumper gelöst.

Ich möchte aber auch im MCU erkennen, ob eine Batterie angeschlossen ist 
oder nicht. Dazu dachte ich, die Batterie ohne Jumper an einen weiteren 
Pin anzuschließen und diesen dann softwareseitig abzufragen.

Die Frage ist: Wie bekomme ich das hin, ohne dass ein Strom von mehr als 
ein paar uA fließt? Und wie erreiche ich einen definierten Eingangswert, 
wenn die Batterie fehlt? Ein Pull-down verbraucht sicher zu viel Strom.

von Helge (Gast)


Lesenswert?

3-pin header für den jumper?

von Peter M. (pbm)


Lesenswert?

Helge schrieb:
> 3-pin header für den jumper?

Ja, habe ich für die Verdrahtung Batterie/Vcc gemacht. Aber davon 
bekommt der STM32 nichts mit.

Ich könnte natürlich noch einen zweiten Jumper einbauen für den zweiten 
Pin, aber vielleicht geht das auch eleganter.

von A. B. (Gast)


Lesenswert?

Peter M. schrieb:
> Ich möchte aber auch im MCU erkennen, ob eine Batterie angeschlossen ist
> oder nicht. Dazu dachte ich, die Batterie ohne Jumper an einen weiteren
> Pin anzuschließen und diesen dann softwareseitig abzufragen.

Man prüfe nach Power-On (und nur danach!) Reset nach, ob die RTC läuft. 
Wenn ja => Batterie dran, wenn nein => keine dran oder 
Erstinbetriebnahme. Den Status merkt man sich und initialisiert die RTC, 
wenn sie noch nicht läuft. Ab dem zweiten Einschalten weiß man's dann.

von Harald (Gast)


Lesenswert?

Du hast ja einen internen ADC Kanal für die Batteriespannung. Du 
könntest die Schwelle zur Erkennung auf 3.25V legen. Ist sie kleiner 
liegt eine Batterie vor, ist die größer ist sie direkt an VCC 
angeschlossen.

von Peter M. (pbm)


Lesenswert?

A. B. schrieb:
> Man prüfe nach Power-On (und nur danach!) Reset nach, ob die RTC läuft.
> Wenn ja => Batterie dran, wenn nein => keine dran oder
> Erstinbetriebnahme. Den Status merkt man sich und initialisiert die RTC,
> wenn sie noch nicht läuft. Ab dem zweiten Einschalten weiß man's dann.

Gute Idee, leider läuft die Uhr in beiden Fällen. Der Unterschied ist, 
in einem Fall sind die Werte 0, im anderen Fall nicht.

Leider setzt das voraus, dass die Uhr initialisiert wurde, und genau 
hier will ich ja unterscheiden, welcher Fall vorliegt.

Aber vielleicht kann trotzdem irgendwie das aktuelle Datum heranziehen 
... guter Vorschlag!

von Peter M. (pbm)


Lesenswert?

Harald schrieb:
> Du hast ja einen internen ADC Kanal für die Batteriespannung. Du
> könntest die Schwelle zur Erkennung auf 3.25V legen. Ist sie kleiner
> liegt eine Batterie vor, ist die größer ist sie direkt an VCC
> angeschlossen.

Auch eine gute Idee, aber ich verwende eine CR2032, und laut eines 
zufällig gewählten Datenblattes kann die Spannung bei 3,0V bis 3,4V 
liegen (hängt sicher vom Hersteller ab). Die Betriebsspannung beträgt 
3,3V.

Das erscheint mir leider zu unsicher.

von Helge (Gast)


Angehängte Dateien:

Lesenswert?

Eignet sich halt nur zum unterdrücken einer Batteriewarnung. Wenn die 
Zeit auf nahe 0 ist, muß die Uhr eh gestellt werden.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

In den RTC Registern kann man auslesen ob die RTC bereits initialisiert 
wurde oder nicht. Bei Stromausfall oder keiner/leerer Batterie wird 
entsprechend ein Bit im Register gesetzt.
Beispiel: RTC_ISR Bit INITS

Bei andern STM32 kann das Bit durchaus ein anderes sein.

Alternative: Man verwendet eine Speicherstelle vom BKP RAM, und schreibt 
da einen Wert rein. Sollte der Wert nach dem Reset noch drin stehen, 
dann war da noch genügend Strom von der Batterie da. Sollte der Wert 0 
sein, so nicht.

Man braucht also kein extra IO Pin vom µC und auch kein AD Wandler oder 
sonstige Beschaltung die womöglich noch extra Strom von der Batterie weg 
nimmt.

: Bearbeitet durch User
von Peter M. (pbm)


Lesenswert?

Peter M. schrieb:
> A. B. schrieb:
>> Man prüfe nach Power-On (und nur danach!) Reset nach, ob die RTC läuft.
>> Wenn ja => Batterie dran, wenn nein => keine dran oder
>> Erstinbetriebnahme. Den Status merkt man sich und initialisiert die RTC,
>> wenn sie noch nicht läuft. Ab dem zweiten Einschalten weiß man's dann.
>
> Gute Idee, leider läuft die Uhr in beiden Fällen. Der Unterschied ist,
> in einem Fall sind die Werte 0, im anderen Fall nicht.
>
> Leider setzt das voraus, dass die Uhr initialisiert wurde, und genau
> hier will ich ja unterscheiden, welcher Fall vorliegt.
>
> Aber vielleicht kann trotzdem irgendwie das aktuelle Datum heranziehen
> ... guter Vorschlag!

Möglicherweise geht das doch viel einfacher, als gedacht: Wenn keine 
Batterie dranhängt, dann wird die Uhr mit Montag, 01.01.00 
initialisiert, und zwar noch vor der eigentlichen Initialisierung mit 
RTC-Reset. Im andern Fall stehen wirkliche Werte drin.

Es könnte allerdings sein, dass die Beobachtung ein Artefakt meiner 
Überprüfung ist, denn ich mache ja einen Reset vor dem Debuggen. Ein 
richtiger Einbau wird Klarheit bringen.

von Peter M. (pbm)


Lesenswert?

Markus M. schrieb:
> RTC_ISR Bit INITS
> [...]
> Speicherstelle vom BKP RAM

Klasse, das ist ja noch besser!

Das übernehme ich so, denn das klingt vielversprechender, als nur das 
Datumsregister abzufragen.

von Stefan F. (Gast)


Lesenswert?

Peter M. schrieb:
> Es könnte allerdings sein, dass die Beobachtung ein Artefakt meiner
> Überprüfung ist

Ich habe ähnliches festgestellt. Beim F103 besteht die Uhr ja nur aus 
einem 32bit Sekundenzähler. Der beginnt bei 0, wenn die Batterie fehlt.

von Peter M. (pbm)


Lesenswert?

> Markus M. schrieb:
> RTC_ISR Bit INITS

Ich habe gerade nachgeschaut: Das Bit ist gesetzt, wenn das Datumsjahr 0 
ist -- ist also äquivalent zu meiner Datumsprüfung. :-)

Wenn es nicht funktioniert, nehme ich das Backup RAM.

von Bauform B. (bauformb)


Lesenswert?

Peter M. schrieb:
> Wenn keine Batterie vorhanden ist, soll der Pin mit Vcc
> verbunden werden.

Warum eigentlich, kennt jemand eine vernünftige Erklärung?
Der Chip muss ja mit jeder beliebigen Spannung von 3.6 bis 0.0V am 
VBAT-Pin richtig funktionieren. Na gut, irgendwann geht der LSE aus, 
aber sonst darf kein Unglück passieren.

Also sollte man mit dem Jumper zwischen Batterie und und einer niedrigen 
Spannung umschalten. Den Unterschied kann man mit dem internen 
ADC-Kanal messen. Manchmal hat man in der Nähe 1.2V, notfalls kostet es 
zwei Widerstände. Natürlich vorausgesetzt, dass es nicht wirklich Vcc 
sein muss.

von Peter M. (pbm)


Lesenswert?

Bauform B. schrieb:
> Peter M. schrieb:
>> Wenn keine Batterie vorhanden ist, soll der Pin mit Vcc
>> verbunden werden.
>
> Warum eigentlich, kennt jemand eine vernünftige Erklärung?

Nein, nur dass es so im Datenblatt steht. Vielleicht wäre die RTC sonst 
ohne Stromversorgung?!

> Also sollte man mit dem Jumper zwischen Batterie und und einer niedrigen
> Spannung umschalten. [...] Manchmal hat man in der Nähe 1.2V, notfalls
> kostet es zwei Widerstände. Natürlich vorausgesetzt, dass es nicht
> wirklich Vcc sein muss.

Wenn man eine Spannung kleiner als Vcc wählt, simuliert man quasi eine 
Batterie. Aber ich wüsste nicht, wieso das nicht funktionieren soll.

Spannungsmessung ginge so, allerdings haben wir ja jetzt eine rein 
Software-basierte Umsetzung.

von MWS (Gast)


Lesenswert?

Peter M. schrieb:
> soll der Pin mit Vcc verbunden werden.
> Diese Wahl habe ich über einen Jumper gelöst.

Warum nicht stattdessen durch einen Pin, der Vcc für die RTC 
bereitstellt?

Start:
Pin auf Eingang und Level abfragen.
Wenn Level Low = keine Batterie eingesetzt, dann Pin auf Ausgang & High
Wenn Level High = Batterie drin, Pin bleibt Eingang.

von Bauform B. (bauformb)


Lesenswert?

Peter M. schrieb:
>>> Wenn keine Batterie vorhanden ist, soll der Pin mit Vcc
>>> verbunden werden.
>>
>> Warum eigentlich, kennt jemand eine vernünftige Erklärung?
>
> Nein, nur dass es so im Datenblatt steht. Vielleicht wäre die RTC sonst
> ohne Stromversorgung?!

Okay, offen lassen sollte man VBAT wirklich nicht. Als definierte 
Spannung bietet sich natürlich GND an, das kann man auch besser von 
leeren Batterien unterscheiden. Also, ein extra Spannungsteiler ist ja 
wohl voll doof, wer denkt sich sowas aus?

von Peter M. (pbm)


Lesenswert?

Bauform B. schrieb:
> Okay, offen lassen sollte man VBAT wirklich nicht. Als definierte
> Spannung bietet sich natürlich GND an, das kann man auch besser von
> leeren Batterien unterscheiden. Also, ein extra Spannungsteiler ist ja
> wohl voll doof, wer denkt sich sowas aus?

Nein, das wäre ein guter Plan B!

von Peter M. (pbm)


Lesenswert?

MWS schrieb:
> Warum nicht stattdessen durch einen Pin, der Vcc für die RTC
> bereitstellt?
>
> Start:
> Pin auf Eingang und Level abfragen.
> Wenn Level Low = keine Batterie eingesetzt, dann Pin auf Ausgang & High
> Wenn Level High = Batterie drin, Pin bleibt Eingang.

Ich musste ein wenig nachdenken, bis ich Dich verstanden habe. Damit bei 
"keine Batterie" ein LOW gemessen wird, braucht man doch einen 
Pull-down, oder? Sonst floated der Pin doch eher?

Und mit dem Pull-down steigt dann wieder der Stromverbrauch, falls man 
nicht 1 MΩ oder mehr verwenden will. Funktioniert denn ein Pull-down mit 
einen so hohen Widerstand überhaupt zuverlässig?

von Bauform B. (bauformb)


Lesenswert?

Peter M. schrieb:
> Damit bei "keine Batterie" ein LOW gemessen wird, braucht man doch
> einen Pull-down, oder? Sonst floated der Pin doch eher?

Der Pin wäre wohl mit dem VBAT-Pin verbunden, aber da fließt auch kein 
Strom, also braucht man einen Pull-Down. In diesem speziellen Fall würde 
man aber den internen GPIO-Pull-Down einschalten und nach dem Test 
wieder abschalten.

Aber: Mit Batterie und Vcc = 0 fließt Strom in den GPIO-Pin. Wie viel, 
ist von Chip zu Chip und von Pin zu Pin verschieden, also aufpassen. 
Manche Pins haben eine Schutzdiode nach Vcc, darüber würde die Batterie 
schnellentladen. An manchen Pins sind Vcc+3.6V erlaubt, da sollten nicht 
mehr als 3uA fließen (was mir aber auch zuviel wäre).


> Und mit dem Pull-down steigt dann wieder der Stromverbrauch, falls man
> nicht 1 MΩ oder mehr verwenden will. Funktioniert denn ein Pull-down mit
> einen so hohen Widerstand überhaupt zuverlässig?

270MΩ funktionieren hier einwandfrei, auf einer normalen Platine. Man 
muss sie nur sehr sorgfältig reinigen und coaten, und nicht mit 
irgendeinem Lack. Mit Resten vom schlechten Flußmittel und hoher 
Luftfeuchtigkeit funktionieren auch 27kΩ nicht zuverlässig. Ja, die 
Natur ist grausam...

von Stefan F. (Gast)


Lesenswert?

Bauform B. schrieb:
> Warum eigentlich, kennt jemand eine vernünftige Erklärung?

Peter M. schrieb:
> Nein, nur dass es so im Datenblatt steht. Vielleicht wäre die RTC sonst
> ohne Stromversorgung?!

Dazu gibt es eine Application Note. In dem Chip befindet sich ein 
schwacher Umschalter für die Versorgung der RTC und der damit 
verbundenen I/O Pins Pins PC13, PC14 und PC15. Die Uhr läuft genauer, 
wenn eine externe Versorgung angelegt wird.

von MWS (Gast)


Lesenswert?

Peter M. schrieb:
> Ich musste ein wenig nachdenken, bis ich Dich verstanden habe. Damit bei
> "keine Batterie" ein LOW gemessen wird, braucht man doch einen
> Pull-down, oder?

Den vergass ich beim Gedankenspiel, der STM32 sollte intern 
konfigurierbare besitzen.

Bauform B. schrieb:
> Mit Batterie und Vcc = 0 fließt Strom in den GPIO-Pin.

Der Einwand einer parasitären Versorgung ist berechtigt. Wäre ggf. mit 
ein wenig Extrahühnerfutter inklusive 2 oder 3 Mosfets zu lösen. 
Allerdings wäre die Schönheit der Schlichtheit dahin.

von Bauform B. (bauformb)


Lesenswert?

Stefan ⛄ F. schrieb:
> Dazu gibt es eine Application Note. In dem Chip
in welchem eigentlich?
> befindet sich ein
> schwacher Umschalter für die Versorgung der RTC und der damit
> verbundenen I/O Pins Pins PC13, PC14 und PC15.

Okay. Das wäre doch ein Grund, warum die Spannung an VBAT egal ist.

> Die Uhr läuft genauer, wenn eine externe Versorgung angelegt wird.

Das wäre allerdings ein Grund, den Chip, oder wenigstens diese RTC, 
nicht zu verwenden... AppNote haben will

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Bauform B. schrieb:
>> Dazu gibt es eine Application Note. In dem Chip
> in welchem eigentlich?

Ach ist doch egal, greifbare Fakten sind Nebensache. Der TO hat es nicht 
anders gewollt.

> AppNote haben will

Verstehe ich. Ich habe eben kurz danach gegoogelt und sie nicht 
gefunden. Ich kann mich an die Nummer des Dokumentes nicht mehr 
erinnern.

von Peter M. (pbm)


Lesenswert?

Stefan ⛄ F. schrieb:
> Ach ist doch egal, greifbare Fakten sind Nebensache. Der TO hat es nicht
> anders gewollt.

Bin ich damit gemeint? Themen...O? Onkel?

Wieso sind Fakten Nebensache? Ich halte mich einfach ans Datenblatt. 
Außerdem habe ich bereits eine Lösung.

von Stefan F. (Gast)


Lesenswert?

Peter M. schrieb:
> Bin ich damit gemeint?
> Ich halte mich einfach ans Datenblatt.

Das würden wir auch gerne tun, leider gibt es nicht "das eine" 
Datenblatt für "den STM32". Sage doch mal bitte, um welchen es geht.

von Peter M. (pbm)


Lesenswert?

Stefan ⛄ F. schrieb:
> Das würden wir auch gerne tun, leider gibt es nicht "das eine"
> Datenblatt für "den STM32". Sage doch mal bitte, um welchen es geht.

Es handelt sich um den STM32F746.

von Stefan F. (Gast)


Angehängte Dateien:

Lesenswert?

Peter M. schrieb:
> Es handelt sich um den STM32F746.

Das Datenblatt zeigt den internen Umschalter für die Stromversorgung der 
RTC.

Ich denke, der VBAT Pin muss nicht mit VDD verbunden werden wenn man 
keine Batterie hat. Der Einzige Hinweis der in diese Richtung geht ist 
dieser:

"When PDR_ON pin is connected to VSS (Internal Reset OFF), the VBAT 
functionality is no more available and VBAT pin should be connected to 
VDD"

Ich denke, dass du diese Betriebsart jedoch nicht verwendest, weil dann 
nämlich die ganze RTC auch deaktiviert ist.

von Peter M. (pbm)


Lesenswert?

Stefan ⛄ F. schrieb:
> Ich denke, der VBAT Pin muss nicht mit VDD verbunden werden wenn man
> keine Batterie hat. Der Einzige Hinweis der in diese Richtung geht ist
> dieser:
>
> "When PDR_ON pin is connected to VSS (Internal Reset OFF), the VBAT
> functionality is no more available and VBAT pin should be connected to
> VDD"

Du hast Recht, was die Passage angeht. Und das wäre prima, weil dann der 
Jumper entfallen kann.

Ich habe meine Aussage allerdings aus dem _Getting started with STM32F7 
Series MCU hardware development_ (AN4661), Abschnitt 1.2:

_VBAT = 1.65 to 3.6 V: power supply for the RTC, the external clock 32 
kHz oscillator and backup registers (through power switch) when VDD is 
not present._

_The VBAT pin can be connected to the external battery (1.65 V < V BAT < 
3.6 V). If no external battery is used, it is recommended to connect 
this pin to VDD with a 100 nF external ceramic decoupling capacitor._

Also Vdd oder nicht? Grundsätzlich hast Du Recht, ich halte mich aber 
gerne an Recommendations.

von Stefan F. (Gast)


Lesenswert?

Peter M. schrieb:
> Also Vdd oder nicht?

Und wenn ja, warum?

von Peter M. (pbm)


Lesenswert?

Entschuldige, ich habe nicht gesehen, dass Du die Recommendation zitiert 
hast, meinen Beitrag konnte ich aber nicht mehr editieren.

Zum Warum kann ich nur sagen, weil es empfohlen wird -- das reicht mir 
in den Regel. Aber ich probiere es auch mit einem unverbundenen Pin aus, 
was wohl funktionieren wird.

Die Platine ist zur Zeit sowieso zum Fertigen in China, aber für die 
nächste Version überlege ich mir das noch.

Also Danke für den Hinweis!

von Peter M. (pbm)


Lesenswert?

Ich muss mich nochmal korrigieren: Du hast etwas Anderes zitiert! :-)

: Bearbeitet durch User
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.