Forum: Mikrocontroller und Digitale Elektronik Batterie Spannung messen: stromsparendste Methode für spezielle Anwendung


von Alfred S. (hood)


Lesenswert?

Hallo zusammen,

Threads zu Spannungsteilern gibt es viele. Leider komme ich damit in 
meinem Fall nicht weiter und bräuchte daher euren Rat, wie die 
Spannungsmessung am besten umzusetzen ist.

Ausgangssituation:

Ein Pro Mini Board mit 328P auf 3,3V und 1 MHz Clock wird von einem LiPo 
versorgt. Es befindet sich ein MIC5205 oder MIC5219 LDO Regulator auf 
dem Bord, der die 3,3V für den 328P zur Verfügung stellt. Im 
Normalbetrieb schläft der AVR den größten Teil der Zeit. Von daher darf 
der Stromverbrauch des Spannungsteilers maximal im niedrigen 
zweistelligen µA Bereich sein.

Benötigte Genauigkeit der Messung: 0,02 V

Interne Referenzspannung: 1,1V

Versorgungsspannung 328P: 3,3V

Der zu messende LiPo schwankt bei der Spannung zwischen 4,23 Volt 
(Ladeschlussspannung) und 3,35V (Minimalspannung die nicht 
unterschritten werden soll – der LDO Regulator muss ja auch noch laufen. 
LDO Minimum Input Voltage?).

Aus Stromspargründen gibt es noch die Überlegung den LDO Regulator zu 
entfernen. Dann läuft der 328P direkt am LiPo. Der 328P läuft bei 1MHz 
bis runter auf 1,8V - da wäre der LiPo schon lange tot. Was haltet ihr 
davon den LDO zu entfernen?

In der unten beschriebenen Schaltung muss auch ein Level Converter von 
5V zu 3,3V & 3,3V zu 5V eingesetzt werden. Fraglich ob der Level 
Converter auch mit wesentlich mehr als 3,3V (z.B. 4,23 V) zu 5V 
funktioniert, wenn der LDO entfernt wurde. Habt ihr eine Empfehlung? 
TXS0108E? PCA9306?

Die sich ständig ändernde LiPo-Spannung soll ca. 5x/Sek. gemessen 
werden. Sollte die Messung nach dem Einschalten ergeben, dass der LiPo 
genug Saft hat, dann wird über den 328P ein MOSFET geschaltet, der dann 
wiederum ein 5V StepUp / Board versorgt, wo ein Raspberry mit 5V TFT zum 
Einsatz kommt. Kurz nach dem Einschalten (und noch deaktiviertem 5V 
Bereich) gibt es kaum Stromverbrauch in der Schaltung. Reicht die 
Belastung für eine Messung? Die maximale Stromaufnahme wird beim 
Einschalten der 5V Umgebung ca. 1A in Spitze sein. Laufender Betrieb 
schätzungsweise 200-400mA.

Der LiPo wird im laufenden Betrieb weiterhin ca. 5x/Sek. gemessen (mit 
Mittelwertbildung). Sollte die Spannung des LiPo in bestimmte Bereiche 
fallen, gibt es einen Warnton bzw. einen Shutdown des Raspberry und 
anschließende Abschaltung des 5V Bereichs und der AVR legt sich dann 
wieder schlafen.

So wie ich das gelesen habe, gibt es im Prinzip nur folgende 
unkomplizierte Alternativen:

1. ein hochohmiger Spannungsteiler mit Kerko-Abblockkondensator - die 
hohe Ohmzahl sorgt für einen Stromverbrauch im µA Bereich und der 
Keramikkondensator in einer Größenordnung von 100nF versorgt den (ca.) 
14-30 pF Kondensator im ADC bei der Messung mit genügend Strom und 
gleichzeitig werden hochfrequente Störungen eliminiert. Der 100 nF sorgt 
quasi dafür, daß der ADC beim S&H-Zyklus die nötige niederohmige Quelle 
„sieht“.

2. ein normalohmiger(?) Spannungsteiler mit p-FET: 
http://fettricks.blogspot.de/2014/01/reducing-voltage-divider-load-to-extend.html 
Der p-FET hält die Schaltung nur für 2ms und schaltet dann automatisch 
ab. Der AVR hat gerade mal 2ms Zeit die Messung durchzuführen. Sollte 
aber reichen. Je nach Stomversorgung kann sich die Schaltung Störungen 
einfangen, die wohl den p-FET beeinflussen(?) 
http://jeelabs.org/2013/05/19/supply-noise-sensitivity/index.html

3. irgendein Spezial-IC !?

4. ein normalohmiger Spannungsteiler mit n-FET(?), der den 
Spannungsteiler abschaltet. Auch hier stellt sich die Frage 
irgendwelcher Leckströme über interne Dioden und ob ein n-FET das bei 
der Projektanforderung auch bewältigen kann (Spannung zu gering für 
korrektes durchschalten!?).

Der StepUp Wandler wird letztendlich auch vom LiPo versorgt. Somit 
könnte der StepUp Störungen in die 3,3V Umgebung abstrahlen? Reicht der 
100nF am Spannungsteiler, um hochfrequente Störungen auszugleichen? Für 
das Messergebnis ist eine hochohmige „Antenne“ am ADC natürlich nicht 
gut. Zudem kann es z.B. bei Lagerung im Sommer im Auto zu hohen 
Temperaturen kommen. Von daher wäre eine andere stromsparende Lösung für 
eine Messung sinnvoller? Eine temperaturkompensierte Lösung scheidet 
aus, da zu komplex.

Man kann ja nur so oft am ADC einlesen, dass man davon ausgehen kann, 
dass der 100nF Kondensator auch wieder geladen ist. Sonst misst man 
angeblich eine zu kleine Spannung. Wie oft pro Sekunde kann mit einem 
100nF gemessen werden? Gibt es einen Online Rechner hierfür?

Als ob das Problem möglicher hoher Temperaturen und hochfrequenter 
Störungen noch nicht genug wäre: Was ist mit dem I/O-Leakage Current? 
Laut Jakob und Hinweis im Datenblatt kann der bis zu 1 µA sein. "1 µA * 
140 kOhm = 140 mV = 43 LSB. Für beispielsweise 5 V ergibt das einen 
möglichen Fehler bis +/- 0,22 V!" Geht gar nicht!


Wie würdet Ihr das am besten aufbauen? Könnt ihr mich unterstützen, in 
dem ihr mir zu verwendende Werte oder einzusetzende Bauteile nennt? 
Kenne mich leider nicht gut genug aus.


Danke!

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Nimm Lösung 1 und miss einmal alle 5 Sekunden oder langsamer. Alles 
andere ist viel zu kompliziert und für diese Anwendung übertrieben.

von Udo (Gast)


Lesenswert?

Häng den Controller direkt an den Akku und mess
die Betriebsspannung indem du eine Referenzquelle
an deinen ADC hängst. So kannst du die Betriebsspannung messen
und wenn es unter die Spannung vom Akku fällt, kannst du
sie ja abschalten, da dein Controller ja mit weniger Spannung
auskommt und so noch messen kann.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

AVRs haben interne Referenzen. Abweichungen des ADC-Wertes vom 
wirklichen Wert kann man durch Kalibrierung wegrechnen.

von THOR (Gast)


Lesenswert?

Alfred S. schrieb:
Von daher darf
> der Stromverbrauch des Spannungsteilers maximal im niedrigen
> zweistelligen µA Bereich sein.

Im zeitlichen Mittel, ja.

> Benötigte Genauigkeit der Messung: 0,02 V

Nope. Die nötige Genauigkeit der Spannungsmessung wird bei Li-Ion 
deutlich überschätzt. Wenn du die maximale Energie aus dem Akku 
rausholen willst, musst du so genau sein. Aber wenn du den Akku einfach 
10% größer auslegen kannst, tu das.

> Interne Referenzspannung: 1,1V
>
> Versorgungsspannung 328P: 3,3V
>
> Der zu messende LiPo schwankt bei der Spannung zwischen 4,23 Volt
> (Ladeschlussspannung) und 3,35V (Minimalspannung die nicht
> unterschritten werden soll – der LDO Regulator muss ja auch noch laufen.
> LDO Minimum Input Voltage?).

Bei 3,1V-4,1V lebt der Akku länger. Aber du nutzt ca. 15% der Kapazität 
nicht.
Effektiv lässt du deinen AVR so lange laufen, bis entweder die 
Akkuspannung unter 3,1V gesunken ist oder er einfach ausgeht. Den LDO 
ignorierst du, der AVR hat ne BOD.

> Aus Stromspargründen gibt es noch die Überlegung den LDO Regulator zu
> entfernen. Dann läuft der 328P direkt am LiPo. Der 328P läuft bei 1MHz
> bis runter auf 1,8V - da wäre der LiPo schon lange tot. Was haltet ihr
> davon den LDO zu entfernen?

Die 1,1V Referenzspannung kann der AVR bei der Eingangsspannung 
möglicherweise nicht mehr erzeugen. Aber ansonsten ist die Idee gut.

>
> Die sich ständig ändernde LiPo-Spannung soll ca. 5x/Sek. gemessen
> werden

5 Mal pro Sekunde? Das kann auch deutlich seltener sein. Rechne doch 
aus, welche maximale Spannungsänderung pro Sekunde auftreten kann.


>
> 1. ein hochohmiger Spannungsteiler mit Kerko-Abblockkondensator [...]

Das ist richtig.

Die beiden FET-Varianten lassen sich auch durch BJTs ersetzen. Wenn der 
Spannungsteiler 10k hat, machen die paar Ohm eines gesättigten NPN 
herzlich wenig aus.

> Man kann ja nur so oft am ADC einlesen, dass man davon ausgehen kann,
> dass der 100nF Kondensator auch wieder geladen ist. Sonst misst man
> angeblich eine zu kleine Spannung. Wie oft pro Sekunde kann mit einem
> 100nF gemessen werden? Gibt es einen Online Rechner hierfür?

Taschenrechner und Gehirn reichen völlig. Wie groß der interne S/H 
Kondensator ist, steht im Datenblatt. Wie ein Successive-Approximation 
ADC funktioniert, steht auf Wikipedia.

> Als ob das Problem möglicher hoher Temperaturen und hochfrequenter
> Störungen noch nicht genug wäre: Was ist mit dem I/O-Leakage Current?
> Laut Jakob und Hinweis im Datenblatt kann der bis zu 1 µA sein. "1 µA *
> 140 kOhm = 140 mV = 43 LSB. Für beispielsweise 5 V ergibt das einen
> möglichen Fehler bis +/- 0,22 V!" Geht gar nicht!

I/O Leakage ist die Angabe für die Leckströme an den I/O Pins. ADC ist 
was eigenes.

> Wie würdet Ihr das am besten aufbauen? Könnt ihr mich unterstützen, in
> dem ihr mir zu verwendende Werte oder einzusetzende Bauteile nennt?
> Kenne mich leider nicht gut genug aus.

Ich fasse zusammen: Die Aufgabe ist einfach, dein Grundlagenwissen 
bestenfalls sehr lückenhaft, dein Wissen zum AVR ebenso.
Und als ob das nicht genug wäre: Praktisch alles hättest du auch einfach 
ausprobieren können, mit Steckbrett und Multimeter. Es gibt Leute, die 
haben das getan:
http://www.hilltop-cottage.info/blogs/adam/avr-adc-2-experiments-in-operating-the-adc-at-its-extremes-attiny85/

Du brauchst keine Spezial-ICs, du brauchst Grundlagenwissen. Und dann 
musst du auch nicht nach Bauteilwerten fragen. Ich hab ein Oszi, ein 
billiges Multimeter, ein Sammelsurium an Transistoren, Widerständen und 
Kondensatoren und den Casio fx991DE. Damit konnte ich bisher alles 
bauen.

von Michael B. (laberkopp)


Lesenswert?

Alfred S. schrieb:
> Was haltet ihr davon den LDO zu entfernen?

Selbstverständlich. Er scheint ja zu nichts nütze zu sein.

Alfred S. schrieb:
> MIC5205

Schreckliches Teil. Braucht 150uA für sich, wenn er nur 5uA liefert.
Der niedrige <5uA Strom gilt nur im shutdown. Und warum ein low noise 
Regulator für uC-Versorgung ?

> MIC5219

und der braucht sogar 170uA

Alfred S. schrieb:
> 1. ein hochohmiger Spannungsteiler mit Kerko-Abblockkondensator

Unnötig. Der ATmega328 kann seine Betriebspannung (direkt am Akku) 
direkt im Vergleich zu den 1.1V interner Referenz messen.

Alfred S. schrieb:
> Somit könnte der StepUp Störungen in die 3,3V Umgebung abstrahlen?

Ja. Software-Tiefpassfiltern.

Alfred S. schrieb:
> TXS0108E

Der ist ganz ok, verträgt absolute Maximum 4.6V, das sollte für 4.2V 
eines LiPoly ausreichen obwohl nicht mehr in den recommended Bereich.

: Bearbeitet durch User
von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Michael B. schrieb:
> Unnötig. Der ATmega328 kann seine Betriebspannung (direkt am Akku)
> direkt im Vergleich zu den 1.1V interner Referenz messen.

Wobei die Auflösung dann aber schon etwas unterirdisch ist.

von Manfred (Gast)


Angehängte Dateien:

Lesenswert?

Alfred S. schrieb:
> Ein Pro Mini Board mit 328P auf 3,3V und 1 MHz Clock wird von einem LiPo
> versorgt. Es befindet sich ein MIC5205 oder MIC5219 LDO Regulator auf
> dem Bord, der die 3,3V für den 328P zur Verfügung stellt. Im
> Normalbetrieb schläft der AVR den größten Teil der Zeit. Von daher darf
> der Stromverbrauch des Spannungsteilers maximal im niedrigen
> zweistelligen µA Bereich sein.
Ich habe neulich eine Anwendung gemacht, die aus 12V-Blei gespeist wird. 
Erstmal den Längsregler vom ProMini runter, ebenfalls die PowerOn-LED.
Mein A* läuft mit 5V @8MHz und braucht im Schlaf 7µA, zählt alle 8s 
einen Zähler hoch und wird bei größer 111 kurz mal aktiv = etwa alle 
Viertelstunde.

> Die sich ständig ändernde LiPo-Spannung soll ca. 5x/Sek. gemessen
> werden.
Etwas viel, da lohnt es kaum noch, schlafen zu gehen.

> Der LiPo wird im laufenden Betrieb weiterhin ca. 5x/Sek. gemessen (mit
> Mittelwertbildung).
In meinem Szenario messe ich einmal, um schnell wieder schlafen zu 
gehen. Erst, wenn der Wert kritisch ist, betreibe ich Oversampling.

Meinen Spannungsteiler habe ich mit 2kOhm nach GND niederohmig 
ausgelegt, wird plusseitig mit einem P-FET eingeschaltet. Hier musste 
ich mir nach dem Einschalten 2ms delay gönnen, andernfalls war mein 
Meßwert nicht sicher.

Du kannst auch andenken, das in Hardware zu lösen - z.B. ICL7665 als 
Spannungsüberwachung.

Ich versorge über einen MCP1703, dessen Querstrom habe ich mit 5µA 
gemessen. Bei einer Li-Zelle und nur 1 MHz würde ich den µC direkt drauf 
klemmen, der Spannungsbereich passt exact zum AT328.

THOR schrieb:
> Ich fasse zusammen: Die Aufgabe ist einfach, dein Grundlagenwissen
> bestenfalls sehr lückenhaft, dein Wissen zum AVR ebenso.
Mal wieder ein dusseliger Kommentar! Die Fragestellung von Alfred ist 
hinreichend präzise formuliert.

THOR schrieb:
>> bis runter auf 1,8V - da wäre der LiPo schon lange tot. Was haltet ihr
>> davon den LDO zu entfernen?
> Die 1,1V Referenzspannung kann der AVR bei der Eingangsspannung
> möglicherweise nicht mehr erzeugen. Aber ansonsten ist die Idee gut.
Siehe Anhang aus dem Datenblatt, bis kurz unter 2V kann der AT328 die 
hinreichend genau einhalten.

Knut B. schrieb:
>> direkt im Vergleich zu den 1.1V interner Referenz messen.
> Wobei die Auflösung dann aber schon etwas unterirdisch ist.
Quark! Das ist ein Mikrocontroller, der muß nicht mit Fluke oder Prema 
konkurrieren. Für einen Endwert von 4,2V bekomme ich 4,1mV pro Schritt, 
das ist für die Akkuüberwachung mehr als hinreichend.

von Alfred S. (hood)


Lesenswert?

Ich fasse bisher zusammen:

1. LDO und Power LED runterlöten.
2. Direkter Betrieb des 328 am LiPo.
3. LiPo ohne Spannungsteiler direkt am ADC anschließen.
4. Wie geplant interne Referenzspannung von 1,1V verwenden.
5. Nur alle paar Sekunden messen: Hier ist nach dem Einschalten das 
Problem, dass man entsprechend "viele" Sekunden warten muss, bis das 
Messergebnis brauchbar steht und die Peripherie eingeschaltet wird?! 
Quasi ein unschönes "Bootdelay". Wie kann ich das lösen?
6. Die Raspberry GPIO Pins wollen 3,3V Level. Von daher benötige ich 
keinen Logic Level Converter mehr.
7. Wenn der 328 aber direkt am LiPo hängt, werde ich ohne Logic Level 
Converter nicht auskommen!? 4,2V vom LiPo übersteigen die 3,3V der 
Raspberry GPIO Pins.

Was haltet ihr davon?

von Einer K. (Gast)


Lesenswert?

1 ja
2 ja

Alfred S. schrieb:
> 3. LiPo ohne Spannungsteiler direkt am ADC anschließen.
Falsch!


4 falsch
7 richtig

von Thomas E. (picalic)


Angehängte Dateien:

Lesenswert?

Für präzise Messungen wäre mir die interne Referenz zu ungenau.
Bei einer Schaltung mit PIC habe ich das mit einer externen Referenz 
(2,5V) gelöst, die zum Messen eingeschaltet wird (s. Schaltplan: R1, 
U2).
Im Sleep-Modus wird GP5 auf Output-high und dadurch die Referenz 
ausgeschaltet, zum Messen wird GP5 auf low gesetzt und 2,5V an GP4 
gemessen, mit der Versorgungsspannung (= Spannung der Li-Zelle) als 
AD-Referenz. Daraus ergibt sich die Batteriespannung als:

Ub = 2,5V * (AD-Auflösung)/(gemessener AD-Wert), bei einem 10-Bit 
Wandler also U in mV = (2500 * 1024)/AD_Result

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

Thomas E. schrieb:
> Für präzise Messungen wäre mir die interne Referenz zu ungenau.

Was ist "präzise"?

Und was ist "ungenau"?
Instabil? Nee, oder?

Das einfache Verfahren:
Der Messbereich ist bekannt.
Am oberen und unteren Ende wählt man je einen Punkt.
Und wendet die klassische 2 Punkt Kalibrierung an.

Das bekommt man ohne jedes externe Bauteil hin.
Einzig ein gutes Multimeter ist für die Kalibrierung nötig.

von Thomas E. (picalic)


Lesenswert?

Arduino F. schrieb:
> Was ist "präzise"?

Das definiere ich für meine Schaltungen immer noch selbst.

Arduino F. schrieb:
> Und was ist "ungenau"?

Die "Min"- und "Max"-Werte bei definierter Vcc und definierter 
Temperatur von 1.0 bis 1.2 V - das ist für mich ungenau!

Da können sie typische Kurven in ihre Datenblätter malen, wie sie 
wollen, solange keine garantierten Grenzwerte über VCC- und 
Temperaturbereich definiert sind, nehme ich den "Worst Case" an, nämlich 
die +/- 10% (ach ja, bei anderen Temperaturen, als 25 Grad und anderen 
VCC, als 2,7V könnte es ja auch mehr werden...).

Arduino F. schrieb:
> Das einfache Verfahren:
> Der Messbereich ist bekannt.
> Am oberen und unteren Ende wählt man je einen Punkt.
> Und wendet die klassische 2 Punkt Kalibrierung an.

Das noch einfachere Verfahren: ich baue eine Referenz mit für meine 
Ansprüche ausreichender Genauigkeit ein und spare mir die Notwendigkeit 
von Kalibrierungs-Orgien. Zudem habe ich nach Datenblatt meiner Referenz 
die Gewissheit, daß die Werte auch über den gesamten Temperaturbereich, 
in dem ich die Schaltung einsetzen möchte, nicht übermäßig abweichen.

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

Thomas E. schrieb:
> die +/- 10%
Ach die... Exemplarstreuung...
Die holste doch mit der 2 Punkt Kalibrierung raus.

von Thomas E. (picalic)


Lesenswert?

Arduino F. schrieb:
> Ach die... Exemplarstreuung...
> Die holste doch mit der 2 Punkt Kalibrierung raus.

Mal abgesehen davon, daß ich keinen Bock habe, z.B. für eine 
Ungenauigkeit von läppischen 1% schon eine Kalibrierung der Schaltung 
vornehmen zu müssen: Wenn ich die Kalibrierung bei Zimmertemperatur 
vornehme, wer sagt mir, wo die Werte dann bei leichtem Frost oder 
betriebswarmen 40 Grad liegen? Darauf, daß sich mein Exemplar vom 
Controller an die Werte der "typischen" Kurven hält, mag ich mich nicht 
verlassen, zumal aus dem Datenblatt nicht mal typische Werte bei diesen 
Temperaturen ersichtlich sind. Und um ein paar Cent für die Referenz zu 
sparen, kaufe ich mir keine Klimakammer und nehme von jedem Exemplar 
auch noch stundenlang Temperaturkurven auf.

Aber wie ich schrieb: "wäre MIR die interne Referenz zu ungenau" - es 
ist jedem freigestellt, das anders zu sehen.

von Manfred (Gast)


Lesenswert?

Alfred S. schrieb:
> 1. LDO und Power LED runterlöten.
Ja

> 2. Direkter Betrieb des 328 am LiPo.
Ja

> 3. LiPo ohne Spannungsteiler direkt am ADC anschließen.
Nein, mit geschaltetem Spannungsteiler.

> 4. Wie geplant interne Referenzspannung von 1,1V verwenden.
Ja

> 5. Nur alle paar Sekunden messen:
Ja

> Hier ist nach dem Einschalten das
> Problem, dass man entsprechend "viele" Sekunden warten muss, bis das
> Messergebnis brauchbar steht und die Peripherie eingeschaltet wird?!
> Quasi ein unschönes "Bootdelay". Wie kann ich das lösen?
Nicht _Sekunden_: Mit meiner Arduino-Umgebung und einem FET brauche ich 
2 Millisekunden, aus dem Schlaf heraus einen glaubhaften A/D-Wert zu 
bekommen.

> 6. Die Raspberry GPIO Pins wollen 3,3V Level. Von daher benötige ich
> keinen Logic Level Converter mehr.
> 7. Wenn der 328 aber direkt am LiPo hängt, werde ich ohne Logic Level
> Converter nicht auskommen!? 4,2V vom LiPo übersteigen die 3,3V der
> Raspberry GPIO Pins.
Wenn am Raspberry pullup-Widerstände sind, kann der Arduino den Eingang 
mit einer Schottkydiode in Reihe auf GND ziehen, das würde einen aktiven 
Converter entbehrlich machen.

Andererseits sind Platinchen mit dem TXS108E günstig zu haben. Aus dem 
Datenblatt:
"FEATURES
1.2 V to 3.6 V on A Port
and 1.65 V to 5.5 V on B Port (V CCA ≤ V CCB )"

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.