PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Arduino AD-Wandler abgleichen



Moppi
06.10.2020, 10:18
Hallo!

Ich habe bisher nie die Genauigkeit benötigt. Da ich jetzt aber die Spannung einzelner LiPo-Zellen messen will, frage ich mich wie ich das am Gescheitesten anstelle, da die Spannungsteiler minimal unterschiedlich und schon verbaut sind. Ich kann mir einen ziemlich neuen LiPo hernehmen, die Zellenspannung mit einem Multimeter messen, die Werte notieren, den LiPo an meiner Platine anschließen und dann die AD-Werte ermitteln. In der Annahme, dass alle Zellen sich in den ersten Minuten gleichmäßig entladen (denn das wird unweigerlich passieren, wenn ich den LiPo an die Platine anschließe). So könnte ich die zuvor mit dem Multimeter gemessenen Werte mit den dann etwas später ermittelten Digitalwerten in Beziehung setzen, um unter dem Strich möglichst genaue Messwerte der einzelnen Zellen zu erhalten. Wäre das so brauchbar oder am Ende doch zu ungenau, da ich ja doch schon gerne 0.1V oder sogar, noch besser, 0.01V Genaugkeit haben möchte?

MfG

- - - Aktualisiert - - -

PS: Spannungsteiler mit Metallfilm-Widerständen

Gnom67
06.10.2020, 11:03
Wenn du (verstehe ich das richtig) deine AD-Wandler kalibrieren willst, warum machst du das nicht mit einer unabhängigen Referenzspannung? Der Akku wird je nach Belastung, Ladezustand, Temperatur usw. keine verlässlichen Kalibrierwerte liefern. Nimm doch ein Labornetzteil, stell konstante Spannungen ein und gleiche die ADC daran ab. Notfalls tut es wahrscheinlich schon sowas (https://www.banggood.com/RIDEN-DPS3005-32V-5A-Buck-Adjustable-DC-Constant-Voltage-Power-Supply-Integrated-Meter-Ammeter-p-1062474.html?cur_warehouse=CN).

Moppi
06.10.2020, 11:29
warum machst du das nicht mit einer unabhängigen Referenzspannung?

Weil die Platine fertig ist. :)

Auf jeden Fall, danke für Link!

Ich hätte auch die Möglichkeit, an den eingelöteten Widerständen ein Multimeter anzuschließen und zu messen, während ich den Wert vom AD-Wandler auslese. Wahrscheinlich besser.

Gnom67
06.10.2020, 13:05
Du musst doch nur die Referenzspannung da anschließen, wo sonst der Lipo ist. Das Problem verstehe ich nicht...

Moppi
06.10.2020, 13:15
Durch vielfältige Überlegungen stand ich mir selber im Weg, bzw. auf dem Schlauch irgendwie.

Ich habe ja einen Stecker, wo alle Anschlüsse der einzelnen Zellen zusammenkommen.
Dort an diesen Stecker gehe ich auf der Platine dran, mit Spannungsteilern, damit ich es per
AD-Wandler messen kann. Ein LiPo besteht aus drei Zellen, so dass ich drei Anschlüsse messen
will, die aus dem LiPo raus führen. Wenn ich den LiPo angestöpselt habe, kann ich ja an den
einzelnen Anschlüssen messen, sind dann nur zwei Widerstände dazwischen gegen GND,
(vom Spannungsteiler) ca. 12kOhm.

Gnom67
06.10.2020, 13:51
Ich nehme an, die drei Zellen sind in Reihe geschaltet, um ~10 V zu erhalten.
Wieso willst du die einzelnen Zellen messen? Beim Laden hältst du doch die Spannung sicher über einen Balancer an allen drei Zellen gleich.

Willst du einfach nur wissen, wie hoch die Spannung jeder Zelle ist, um ungleichmäßige Entladung (wegen Alterung usw.) zu erkennen?

Wie auch immer - da wo deine Platine misst, kannst du doch auch die Referenzspannung anklemmen.

Holomino
06.10.2020, 13:59
Du kannst Dir auch mithilfe eines einstellbaren Netzteiles und drei niederohmigen Widerständen in Reihe (100R) einen Akkusimulator bauen.
Da muss man dann zwar immer noch manuell messen (die Mesteiler auf Deiner Platine ziehen aufgrund der unterschiedlichen Spannungslage alle unterschiedliche Ströme), aber man kann so recht gut die beiden relevanten Spannungen (Ladeschluss/Entladeschluss) testen.

Wenn Du die drei Zellspannungen misst, kommst Du ja mit 10 Bit nicht auf 10mV Auflösung. Dazu gibt's ne Softwarelösung: http://ww1.microchip.com/downloads/en/appnotes/doc8003.pdf
Das hat dann zwar nix mit mehr Genauigkeit zu tun, aber man sieht z.B. beim Laden besser und schneller Tendenzen.

Ansonsten: Wenn Du beim Laden/Entladen etwas von den Nominalgrenzen wegbleibst, brauchst Du es nicht so ganz genau und es verlängert die Lebenszeit Deiner Akkus.

oberallgeier
06.10.2020, 13:59
Arduino AD-Wandler abgleichen
Hi Moppi,

na der Titel ist wohl irreführend. Du willst nicht den AD-Wandler abgleichen sondern den Spannungswandler ausmessen - nicht wahr? (Abgleichen setzt ja immer Variationsmöglichkeit/en voraus).

Der AD-Wandler sitzt bei meinen Platinen immer im Controller, zu dem gibts das Datenblatt und darin steht das "Übersetzungsverhältnis" - jedenfalls die Gleichung nach der man aus dem digitalen Output einer AD-Wandlung den am AD-Wandler anstehenden Spannungwert ermitteln kann. Ein Abgleich ist dafür nicht möglich. Voraussetzung ist auch, dass man sich auf die Controller-Versorgungsspannung der Platine verlassen kann - zumindest wenn man als Spannungsreferenz AREF nimmt. Bei Wandlungen mit der controllerinternen Spannungsreferenz ist das etwas anders.

Du willst den Spannungsteiler genau ausmessen. Dazu reicht eine (später zu messende) Stromzelle oder ähnliche kleine Stromquelle, ein Poti, > 5k , z.B. ein Steckbrett, ein DMM, Papier und Bleistift. Poti auf Steckbrett, Stromquelle zwischen die beiden Potienden und Abgriff vom Poti auf den ADC-Eingang. Oder was am arduino so genannt wird. WENN zwischen Arduinoplatine und Arduinochip kein Bauteil hängt, dann kann man mit dem DMM direkt am Platineneingang messen, andernfalls am Controllerpinn des betrachteten ADC.

Jetzt noch schnell ein Miniprogramm das den ADC-Wert ausliest (am Besten ein paarmal, die letze Messung gilt) und z.B. über UART ausgibt. Alles ein, leicht am Poti drehen bis die vermutet maximale Eingangsspannung ansteht und ADC auslesen. Notiere Spannung und ADC-Wert. (Eigentlich reicht das schon). Dann weit runter drehen bis etwa vermutet minimale Eingangsspannung ansteht und ADC auslesen. Notiere Spannung und ADC-Wert.

Der Rest ist einfache Rechnerei, die Kennlinie des ADC ist wohl linear (bis auf die Toleranzen). Die ADC-Toleranzen stehen im Datenblatt - nach Umrechnung auf Spannung hast Du Deine möglichen Abweichungen.

Wenn Du Deine Spannungsteiler nicht genau kennst machst Du das Gleiche für alle Spannungsteiler.

Moppi
06.10.2020, 14:57
Natürlich nicht den ADC auf dem Chip abgleichen. ;)
Abgleichen mit einer externen Spannung ist schon gemeint.

Ich habe gerade mal etwas gerechnet. Das gibt bei meinen R-Werten eine Spannung am AD-Eingang zwischen 2.25V und 2.29V, je nach Toleranz der Widerstände, des Spannungsteilers. Würde ich das nicht irgendwie ausmessen, müsste ich in Kauf nehmen, dass ich pro Zelle 0.1V daneben liege. Weiß jetzt nicht, ob das sooo schlimm wäre. Ich meine, ich habe ja irgendwo eine Schwelle nach unten, ob die jetzt pro Zelle bei 3.5, 3.6 oder 3.8V liegt, wäre ja gar nicht mal so sehr wichtig. Wichtiger wäre es nach oben, bis 3.9V oder 4V würde ich jede Zelle schon laden wollen. Problematischer ist, glaub ich, dass ich die Spannung einer Zelle nur berechnen kann, indem ich die drei Anschlüsse messe. Dann könnten sich im schlimmsten Fall die Fehler summieren und es wäre noch ungenauer.

Jetzt sind die Widerstände eingelötet auf der Platine. Wie ist es denn, wenn ich die nochmal einzeln ausmesse, kann ja den ATmega328P-PU aus dem Sockel ziehen, dann kann ich doch die Widerstände einzeln ausmessen? Dann rechne ich mit den gemessenen Widerstandswerten die Spannung aus, die am ADC anliegt, wenn ich eine Max-Spannung voraussetze (i.R. 12.6V). Laut Datenblatt haut das mit der Linearität des ADC halbwegs hin.
Das mit dem Poti ist keine schlechte Idee, ich habe da noch ein paar Spindeltrimmer, da kann ich mir sicher was bauen, was die Spannung der drei Zellen imitiert. Ich denke drüber nach, wie. Ich muss im Grunde ja nur 4.2V am ersten Abgriff/Spannungsteiler einstellen, 8.4V am Zweiten und 12.6V am Dritten. Und dann unten rum genau dasselbe, angefangen mit 3.5V oder 3.7V. Dazwischen (3.7 und 4.2) wäre mir halbwegs egal.

MfG

Crazy Harry
06.10.2020, 16:21
Schliess anstatt der Akkus ein Labornetzteil an, miss dessen Spannung mit einem Multimeter und laß dir den ADC-Wert ausgeben. Das machst du bei mehreren Spannungen. Wenn dein Compiler eine sog. LookUp-Tabelle unterstützt, nur noch eine eben solche mit den ermittelten Werten erzeugen und verwenden. Fertig.
Aus eigener Erfahrung ..... 10Bit sind zu wenig und linear ist es nicht. Akkuspannungen habe ich bisher entweder mit einem externen ADC gemessen oder einen XMega mit 12Bit verwendet.

wkrug
06.10.2020, 21:06
10Bit sind zu wenig und linear ist es nicht. Akkuspannungen habe ich bisher entweder mit einem externen ADC gemessen oder einen XMega mit 12Bit
Genau das gleiche hätte Ich auch geantwortet.
Ich würde sogar so weit gehen und auf einen externen 16Bit A/D wandler setzen.
Wenn die Messung nicht gerade superschnell gehen muss sind die Teile auch bezahlbar - Beispielsweise mal den schnell mal Gegoogelten ADS1115 ( Hatte Ich aber selber noch nicht im Einsatz! ).
Bei 15V und 10 Bit bedeutet ein Bit 15mV ohne die Fehler, die der A/D ohnehin noch zusätzlich macht.

HaWe
06.10.2020, 22:23
Ich habe mehrere davon, am Raspi und am esp8266, und auch der ads1115 braucht eine absolut zuverlässige, stabile Vref., sonst misst der auch Mist.
Nimmt man für ihn als Vref die, die der µC-Pin bietet (5V/3v3 am Arduino oder 3v3 beim Raspi) führen schon kleine Schwankungen, die der DC/DC Wandler per Versorgungs-Netzteil oder USB produziert, zu unsauberen Werten - ansonsten wäre er OK.
ads1115 geht also, braucht dann aber eine andere, externe, saubere, superstabile Vref, plus eine Eichtabelle.

Holomino
07.10.2020, 08:55
Ein BMS ist keine Audioanwendung. Die einzigen relevanten Spannungen sind Ladeschluss und Entladeschluss. Die kann man bei drei Zellen auch mit 10 Bit gut mit zwei Punkten kalibrieren. Was dazwischen abläuft, interessiert eigentlich niemanden (Ober- und Unterhalb erst recht nicht, weil dann ist der Akku kaputt). In den Randbereichen verliert man durch den Quantisierungsfehler <20mV (vor dem Spannungsteiler) vielleicht 1% der nutzbaren Akkukapazität. Aber wenn man mit einem handelsüblichen 3,5-stelligen DMM kalibriert, kommt man in der Regel auch nicht weiter als 11..12 Bit (je nach Ausführung schalten die bei 2.048V oder 4.096V den Bereich um). Und man schont den Akku, wenn man von den Grenzen wegbleibt.

Aber mal eine ganz andere Frage:
Moppi, bleiben die 12k Spannungsteiler im Dauerbetrieb an den Akkus? Dann achte mal darauf, ob die oberen Zellen nach einiger Zeit anfangen, zu balancieren.
(Ich kann's nur vermuten, den Fehler hab ich auch bei meinem ersten BMS gemacht. Das lässt sich aber relativ einfach kompensieren.)

Moppi
07.10.2020, 13:49
Ja, die Spannungsteiler bleiben immer dran. Ich habe mir mit den Zellen untereinander da bis jetzt
keine Gedanken gemacht, dass die über die Widerstände miteinander verbunden sind.
Daher habe ich keine Idee, wie sich das auswirkt. Ebenso, wie die zu einer dauernden Entladung,
von einigen Milliampere, führen. Aber da habe ich mich diesmal vom Datenblatt leiten lassen und bin
an die 10k-Ohm-Grenze gegangen (wegen dem ADC), sonst habe ich 10fach größere Werte verwendet.
Kann natürlich sein, dass die Widerstände den Ladevorgang stören. Weiß ich noch nicht, hoffe ich nicht.

Also ich habe ja - wenn - dann ein automatisches Ladegerät, dass ich anschließen will, nur will ich
den Akku nicht so stark belasten, bzw. will ich den lange erhalten, deshalb die Überwachung der
einzelnen Zellen. Habe ich noch nie gemacht, mein erstes Mal.

Meine Erkennung am unteren Ende soll bei 3.4 bis 3.7V liegen, oder etwas höher: 3.8V wären auch
kein Problem, nur niedriger wäre ein Problem, wegen Tiefentladung. Die untere Schwelle würde ich
bei 3.7V ansetzen wollen. Mit einem Fehler von 0.2V käme ich im schlimmsten Fall bei 3.5V raus,
die die erste Zelle hätte, wenn ich 3.7V als Digitalwert ermittelt hätte. Das würde gerade passen,
ungenauer sollte es nicht sein. Falls es doch ungenauer wäre, müsste ich die untere Schwelle nach
oben verschieben. Dann 3.8V, dann nach 3.9V und irgendwann ergibt das dann keinen Sinn mehr.


Ein Überladen der Zelle ist praktisch ausgeschlossen, weil ich einen Automatiklader mit Balancer anschließe.
Ziel ist aber, den Balancer möglichst nicht zu nutzen. Nur dann, wenn die Zellen zu weit auseinander
liegen, in ihrer Spannung. Das heißt ich würde etwa bei 4.0V pro Zelle die Ladung abbrechen. Sobald
also eine Zelle die 4.0V erreicht hätte. Liegen die Zellen zu weit auseinander, würde ich länger laden
wollen, so dass die Zellen angeglichen werden. Würde eine Zelle die 3.7V erreichen, würde ich nachladen
wollen.


Ich habe ein Testprogramm laufen lassen, um zu sehen, was der A/D-Wandler für Werte ausgibt.
Die Werte schwanken +/-5.

Nachtrag:
-----------

Ich habe eine Funktion nachgeschaltet, welche die Werte nochmals stabilisiert. Jetzt habe ich
bei den ausgegebenen Werten keine Schwankungen mehr. Allerdings habe ich dazu die Funktion
auf Schwankungswerte +/-7.5 umgestellt. +/-5 waren noch was zu wenig.

Auf der zweiten Nachkommastelle, wenn ich den Wert per Taschenrechner umrechne, sehe ich,
dass es nicht linear ist, was da gemessen wird. Da gibt es noch Kompensationsrechnungen
(s. Datenblatt), die ich aber nicht anwende, weil mir sind die zu kompliziert für den Zweck.
Aber die erste Nachkommastelle, der ausgerechneten Spannung, ist sehr zuverlässig.
Da bin ich schon mal froh. Einen zuverlässigen oberen und unteren Punkt zu ermitteln und
stabile Werte zu messen, die diese Punkte der Ladezustände repräsentieren,
sollte damit nun kein Problem sein.

Im Anhang, mein Traffic-Log, unter ASCII die Werte, die 12.xxV entsprechen.
Die Werte sinken, weil die Akkuspannung sinkt.

35249

Holomino
07.10.2020, 15:25
Ok, die Sache mit dem Ungleichgewicht über die Messteiler sieht folgendermaßen aus:

Die Ströme über die Spannungsteiler kann man sich errechnen über I=U/R. Da aber der Strom des höchsten Spannungsteilers über alle Zellen fließt (er fließt ja wieder gegen Masse), führt das zu einem Ungleichgewicht in Deinen Zellen. Ich hab Dir das mal im Bild aufgemalt.
35248
Das Ungleichgewicht von 675µA zwischen unterster und oberster Zelle scheint nicht viel, summiert sich aber auf 16,2mAh/Tag oder 113mAh/Woche auf. Langfristig ist also die unterste Zelle immer leerer, als die anderen Zellen.

Man kann das durch einen passenden Widerstand parallel jeweils zu den oberen Zellen kompensieren (ich konnte das damals nachträglich beheben, indem ich direkt an den Stecker auf der Platine zwischen die Lötpads die passenden Widerstände gepatcht habe). Auf dem Bild findest Du R7 als Beispiel. Die Berechnung folgt aus der Annahme, dass ich die erhöhte Stromentnahme von 1350µA in der untersten Zelle nicht verhindern kann (das Kind ist ja bereits in den Brunnen gefallen) aber zumindest dafür sorgen kann, dass der gleiche Strom auch von der obersten Zelle entnommen wird, damit sich das Akkupack nicht gravierend debalanciert. Also
3,7V/(1350µA - 675µA)*** = 5,5kOhm. Dieser Widerstand bewirkt, dass auch aus der obersten Zelle (grob) 1375µA dauerhaft entnommen werden.

Das Gleiche kannst/musst Du auch für die mittlere Zelle machen, bei der untersten Zelle erübrigt sich der parallele Widerstand ja.

Moppi
07.10.2020, 15:49
Danke, für Deine ausführliche Erklärung!
So ähnliche Gedanken sind mir auch schon gekommen, aber ich war - zugegeben - zu bequem, das aufzumalen.
Die Frage, die auftaucht ist, inwiefern sich das auf die Unterschiede der Ladezustände auswirkt, also wie groß
der Unterschied am Ende wirklich ist, wenn die erste Zelle 3.7V z.B. erreicht. Wieviel Volt hat dann die Letzte?
Dann müsste ich u.U. bei jedem Laden die Zellen balancieren, was entgegen meiner Vorstellung wäre.
Einen Ausgleichswiderstand einzusetzen könnte dann wirklich das Ladegerät stören, wenn die andern Widerstände
das noch nicht tun. Weil der ist ja dann rel. klein, gegenüber den anderen.
Eventuell stört es auch das Ladegerät, wenn die Zellen auf diese Weise zu unterschiedlich entladen sind. Dann
streikt das vielleicht.
Ich glaube, ich muss jetzt mal eine Balancerbuchse auf die Platine auflöten, um den Akku dort dran zu stecken
und diese Fragen zu klären.

Nachtrag:
----------

Ich komme mit den Zahlen noch nicht zurecht.
Ich habe gerechnet, bei 12V und 12.2kOhm:


0.0009836A für die erste Zelle, die am stärksten, durch alle Spannungsteiler, belastet ist.
Wenn aus einer Zelle 1Ah entnommen werden können, dann sind das 1000h, bis die erste Zelle
3.7V oder 3,5V erreicht hätte. Das entspräche th. 41 Tagen. Dann wäre die erste Zelle entladen
und die dritte Zelle fast noch voll. Wird der Unterschied der Zellen zu groß, könnte das
Ladegerät streiken. Dann müsste ich drauf achten, dass die Zellen nicht mehr als 0.2V
auseinander liegen (k.A., ob der Wert realistisach ist oder noch mehr geht).
Wenn die erste Zelle bei 4V wäre (z.B.) müsste ich den gesamten Akku nachladen, inkl.
Balancer am Schluss. Ich habe grob gerechnet: bis die 4V erreicht wären, wenn das Gerät
ungenutzt bleibt, könnten realistische 2 bis 5 Tage vergehen. In den Abständen müsste dann
geladen werden. Wenn das Gerät nicht ungenutzt bleibt, sondern was tut (staubsaugen bspw.) wäre
der Akku in 20min bis 1h leer und müsste geladen werden. In dem Fall würde der geringe
Entladestrom, über die Spannungsteiler, nicht ins Gewicht fallen, die Zellen würden nahezu
gleich entladen?


Ich habe keine Widerstandswerte, welche ich einsetzen könnte, für die Parallelwiderstände.
Ich bräuchte wohl 6,1k und 12.2k. Die Schaltung zu verkomplizieren, dass ich die
Spannungsteiler wegschalten kann, wenn nicht gemessen wird, habe ich nicht wirklich vor.


Die letzte Sache wäre, zwei Spannungsteiler auszubauen und nur die Gesamtspannung am
Akku zu messen. Dann könnte ich nicht beurteilen, wie voll jede Zelle wirklich ist, sondern
nur erkennen, ob der Akku eine Macke hat (weil sich die Ladezeit verlängert).


Diese Möglichkeiten habe ich.

Vielleicht denke ich irgendwo falsch, dann würde ich mich über Aufklärung freuen!

MfG

Holomino
07.10.2020, 19:14
Mit Deinen Werten gerechnet: Nur durch Deine Spannungsteiler bewirkt fließen durch:
- die oberste Zelle I3=12V/12,2k= 0,98mA
- die mittlere Zelle I2= 8V/12,2k + I3 = 0,66mA+0,98mA = 1,64mA
- die unterste Zelle I1 = 4V/12,2k+I2 = 0,33mA + 1,64mA = 1,97mA

Alle Messteiler liegen gegen Masse, d.h.
- I3 fließt durch die Zellen 1,2 und drei
- Durch Zelle 2 fließen 0,66mA in den dort angeschlossenen Spannungsteiler UND zusätzlich I3 zu Zelle3 (da muss man die Ströme addieren)
- Durch Zelle 1 fließen 0,33mA in den Spannungsteiler und alles, was durch Zelle 2 fließt

Sprich: Alleine wegen der Messteiler fließen unterschiedliche Ströme in den einzelnen Zellen. Das summiert sich bei 24/7 Anschluss und wirkt wesentlich mehr auf das Zellungleichgewicht, als natürliche Effekte, für die ein Balancieren normalerweise gedacht ist.
Bezogen auf Dein Beispiel mit 1Ah ist die unterste Zelle Deines Akkus nach ca. 500h leergesaugt, die oberste Zelle aber noch halb voll.
Um die Zeit bis zum Leersaugen zu verlängern, kannst Du höherohmige Messteiler (z.B. 120k) einbauen. Dadurch verschwindet aber dieser Effekt der unterschiedlichen Ladezustände nicht. Wenn die unterste Zelle erst nach 5000h leer ist, wird die oberste Zelle immer noch halbvoll sein.

Man kann durch regelmäßiges Balancen dagegenhalten, aber das Zellungleichgewicht ist systematisch durch den permanenten Anschluss der Spannungsteiler bedingt. Das kann man, wie oben beschrieben, durch zwei zusätzliche Widerstände kompensieren.

Die Einzelmessungen ausbauen würde ich nicht. Auch ohne 100% Genauigkeit hat man zumindest ein Monitoring und für den Notfall auch eine Abschaltinformation.

Wegen dem Gewackel der Messwerte (das bekommt man bestimmt besser hin):
Hast Du die Messpannung an den ADC-Eingängen gesiebt (einfach einen Kondensator 10..100nF parallel zum unteren Teilerwiderstand)? (Kann man bei SMD wunderbar auf den Widerstand drauflöten)
Hast Du mal eine Mittelwertbildung über mehrere Messungen probiert (16 mal aufaddieren und anschließend durch 16 teilen)?

Moppi
07.10.2020, 20:07
Man kann durch regelmäßiges Balancen dagegenhalten, aber das Zellungleichgewicht ist systematisch durch den permanenten Anschluss der Spannungsteiler bedingt.
Das ist mir klar geworden. Bloß, ich denke, das ändert nichts an der Sache, dass ich alle 2 bis 5 Tage diese 0.2V an der untersten Zelle verliere. Und dass, wenn viel Strom fließt und die Zellen schnell geleert werden,
diese Ministröme weniger ins Gewicht fallen. Trotzdem altert dann die unterste Zelle am schnellsten, weil die mehr belastet wird. Wenn ich zwei Spannungsteiler weg lasse, habe ich dieses Problem nicht.
Es ist ja durchaus üblich, bei LiPos, mit mehreren Zellen, nur die Gesamtspannung zu messen. Was ist besser? Ausgleichswiderstände sehe ich nicht, wie ich an diese Werte kommen soll, um die nachzurüsten.

Wenn das Ladegerät mit den Spannungsteilern nicht zurecht kommt, werde ich zwei ausbauen. Ich muss das ausprobieren...




Wegen dem Gewackel der Messwerte (das bekommt man bestimmt besser hin):
...
Hast Du mal eine Mittelwertbildung über mehrere Messungen probiert (16 mal aufaddieren und anschließend durch 16 teilen)?

Antwort:




Nachtrag:
-----------

Ich habe eine Funktion nachgeschaltet, welche die Werte nochmals stabilisiert. Jetzt habe ich
bei den ausgegebenen Werten keine Schwankungen mehr.

Noch eine kurze Erklärung dazu:

Ich mache sowas ähnliches, wie Du mit dem Kondensator außen, Holomino.
Bloß in der Software eben. Ich betrachte nicht einen einzelnen Messwert,
ich addiere auch nicht mehrere Messungen. Da der verrauschte Bereich
bekannt ist (habe ich mir angesehen), muss ich einen stabilen Wert
daraus generieren, ich brauche irgendeinen Filter dafür. Die Verteilung
der Werte ist recht gleichmäßig, ab und an schlägt ein Wert mehr nach oben
aus, dann nach unten. Daraus bspw. den Mittelwert zu bilden würde,
aufgrund der letzten Tatsache, wieder zu Schwankungen führen. Ich nehme
einen Wert, aus dem verrauschten Bereich, den ich verwerte, die andern Werte
ignoriere ich. Hinzu füge ich einen Wert, der mir bekannt ist, aber aus den
Messungen nicht unmittelbar von Anfang an hervor geht (den Wert könnte ich
th. auch im Betrieb, über eine längere Zeit, ermitteln). Das ist die Spanne, also
diese +/-5 bzw. +/-7.5, die es um den idealen Messwert schwankt. So erhalte
ich einen Bereich, in dem sich alle Meßwerte eines kurzen Zeitraums befinden.
Natürlich ändern sich die Messwerte, weil sich die gemessene Spannung ändert.
Beim Akkupack aber voraussehbar, nämlich stetig nach oben oder nach unten.
Aufgrund dessen führe ich meinen berechneten Bereich nach, aus dem ich
einfach den Mittelwert nehme. Die Nachführung entnehme ich den Grenzwerten
des Rauschens.



MfG

PS:

Die Werteschwankungen sind bei einfachen Wandlern normal.
Es mag bessere Wandler geben, die stabilere Werte liefern.
Ich hatte mal einen 12Bit-Wandler in den 90gern gekauft.
Funktionierte nach dem Prinzip, wie die in den ATmega328P.
Der hatte Schwankungen, die sich mindestens über die
untersten 4 Bit erstreckten. Ich habe das Teil an jemand
verschickt, der sich das auch angesehen hat. Hat den selbst
beschaltet. Der kam zu dem gleichen Ergebnis.

Holomino
08.10.2020, 11:11
Wie gesagt: Für das durch die Messteiler verursachte Ungleichgewicht sind jeweils ein Widerstand parallel zu oberer und mittlerer Zelle eine Lösung. Wenn Du die Widerstände nicht da hast, ist es ja kein akutes Problem, kann man später nachrüsten.

Zum Flirren in den AD-Werten ist meine Erfahrung, dass alleine durch den Controller (eigentlich ein richtig fettes Schaltwerk, das man da einbaut) so ziemlich alle Eingangs-Pins einen Ripple von etwa 20..30mV abbekommen. Das fällt bei der Verwendung in der Regel erst beim ADC und beim Komparator negativ auf. Mit einem Kondensator parallel zum unteren Widerstand des Teilers und nicht zu weit vom Controller weg bekommt man diesen Ripple recht gut gedämpft. Aber auch das ist eine Sache, die Du bei entsprechender Laune (Lust) einfach mal ausprobieren kannst: Kondensator einlöten, Filter weg und den Hub des AD-Wertes bei konstanter Eingangsspannung beobachten.

Muss man nicht tun, aber interessant wird's ja vielleicht für die nächste Schaltung.

Moppi
08.10.2020, 11:52
Ich kann ja mal einen Kondensator dran halten, mal sehen, was passiert.

Habe es versucht:


Mit einem Kondensator parallel zum unteren Widerstand des Teilers und nicht zu weit vom Controller weg

Kein besseres Ergebnis, also ohne C. Habe 100nF genommen. Manchmal springen die Werte sogar noch stärker.

Holomino
08.10.2020, 13:37
Ich kann leider keine Ferndiagnosen stellen, aber +/-5 Gezappel im ADC sind recht viel. Wenn Du Lust hast: Nimm Dir eine Arduino-Platine, häng eine saubere Versorgung dran und simuliere mithilfe eines Potis eine Analogspannung (in der Regel passt das ganz gut mit den Pinleisten. Mittlerer Potipin an AD-Eingang, die beiden Controllerpins drumrum kannst Du als Ausgang Low/High einstellen, damit das Poti eine Spannung zum teilen hat).
(Ich hab in meinen Anfängen auch gedacht, das sei wohl so beim AVR. Nee, ist es nicht. Da rüpelt irgendetwas in Deiner Schaltung herum. Normalerweise zappelt die Ausgabe beim AVR ADC gar nicht, im ungünstigen Fall zwischen zwei Werten. Das ist dann Quantisierungsrauschen zwischen zwei Schritten.)

Ansonsten: Die Standardbeschaltung (Kondensatoren) von VCC, AVCC und AREF hast Du/der Arduino? Und über die Masseleitung vom Akku zum Controller entnimmt niemand anders wesentlich Strom? Irgendwelche LED-Blinkereien an den benachbarten Ports finden während der Messung auch nicht statt?

Wenn Du ein schnelles Oszi hast: Masseklemme an Akku, VCC, AVCC, AREF und GND am Controller checken. Wibbelt da etwas mit mehr als 5 mV?

Moppi
08.10.2020, 17:16
Ja, ich nehme mal das Oszi und schaue. Aber ich denke, dass dort nichts ist. Wahrscheinlich wird es die Referenz sein, die herangezogen wird. Allerdings ist die Versorgungsspannung mit einem LDO-Regler erzeugt. Vielleicht ist dort ein wenig drauf. Aber davon abgesehen, bei dem 12Bit-Wandler damals, der auch so schwankte, war nur die Batteriespannung angelegt, frei von Verunreinigungen. Wenn an dem Pin nichts ist, kann der C nichts bringen.

Ich finde, die +/-5 sind recht wenig. Manche haben da +/-10, habe ich gelesen. Ich schaue mal.

....

Da ist minimal Störung auf der Versorgungsspannung, offenbar von den Treibern A4988. Aber extrem wenig. Weniger, als wenn ich einen DC/DC-Wandler einsetzen würde. Die Treiber+Motoren werden ja direkt vom Akku gespeist. Dennoch habe ich dann die Schwankungen, auch wenn die Motoren nicht drehen, sondern nur gehalten werden. Kann das aber mit meinem Oszi nur erahnen, weil so genau ist es nicht, es produiziert normal schon selber gewisse Störungen im angezeigten Signal. Nach dem 10k-Widerstand vom Spannungsteiler, sind die nicht mehr zu sehen; an der Stelle gemessen wird die AC-Linie auf dem Oszi richtig glatt gezogen (wird vielleicht der Grund sein, dass dann an der Stelle ein C nichts mehr bringt). Ich habe 10k vom LiPo-Anschluss bis an den AD-Eingang, von dort 2.2k gegen GND.

Interessant ist, wenn ich die Treiber herausnehme, dass dann die ADC-Werte absolut stabil sind. Auch ohne Korrektur per Software oder so. Insofern scheine ich also viel richtig gemacht zu haben, was die Beschaltung des 328P-PU angeht (inkl. der 100nF-Kondensatoren am unbeschalteten AREF und der Versorgung des Kontrollers). So stabile Werte vom ADC habe ich noch nie gesehen. Selbst bei meinem originalen UNO nicht.

Normal würde ich ja ohnehin messen, wenn die Treiber abgeschaltet sind. Das hatte ich aber noch nicht ausprobiert. Weil ein Fall bleibt, wo ich auch während der Fahrt messen müsste. Muss ja zwischendurch feststellen, ob die Akkus leer sind. Jetzt kann ich zwei Methoden anwenden. Während der Fahrt eine, mit Filter (diese Methode liefert stabile Werte, die aber von den tatsächlichen etwas abweichen), da muss ich nur den Entladeschluss abgleichen. Und ohne Fahrt die Messung, wenn also die A4988 auch ausgeschaltet wären. Im Ruhemodus muss ich auf Entladeschluss warten, damit dann aufgeladen wird, hier könnte ich den Punkt dann neu abgleichen (ohne Filter). Und beim Laden nach den 4.0V schauen, auch bei abgeschalteten Motortreibern. Auch das ohne nachgeschalteten Filter. Wenn die Werte dort auch so sauber wären, könnte ich mich auf die Messungen verlassen, gerade beim Laden.


MfG

- - - Aktualisiert - - -


Und über die Masseleitung vom Akku zum Controller entnimmt niemand anders wesentlich Strom? Irgendwelche LED-Blinkereien an den benachbarten Ports finden während der Messung auch nicht statt?

Das wäre der Zustand wenn die Kiste steht und nichts tut. Auch beim Laden wären nur drei Kontroller angeschaltet. Zwei für die Motortreiber, die dann nichts tun. Die Odometrie wäre abgeschaltet. Das nodeMCU wäre abgeschaltet, zusammen mit seinem Satelliten-ATmega328. Auch der Spannungsregler 7806 wäre ohne Versorgung. Nur die Relais für den Ladestrom zum Akkupack wären an. Aber in dem Zustand würde ich nicht messen. Messen würde ich nur, wenn kein Ladestrom fließt, also auch diese Relais nicht aktiv sind.

Holomino
08.10.2020, 17:28
Schön, unter Laborbedingungen scheinst Du ja die Funktion hinzukriegen. Damit sind wir auch schon im prallen Leben.
Du kannst mal nachschauen, wie Du die Masse zum Controller gezogen hast. Ist das nur ein Abzweig zwischen Akku und Treibern? Dann wird Dir wahrscheinlich die Controllermasse durch den Treiberstrom wegfloaten. Da reichen 20..30mV Spannungsabfall im Leiterbahnabschnitt zwischen Akku und Controller, um unschöne Effekte im ADC auszulösen.
Wenn Du allerdings die Masse direkt sternförmig am Akkuanschluss einmal in Richtung Controller und einmal in Richtung Treiber geführt hast, bist Du auf der sicheren Seite. Mehr kann man kaum tun.

An VCC sollte es eigentlich nicht liegen, wenn da der LDO zwischensitzt. Der LDO ist in der Regel schnell genug, hat eingangs-/ausgangsseitig auf die Regelgeschwindigkeit angepasste Siebkondensatoren und frisst damit Ripple ganz gut. Er regelt aber immer in Bezug auf seine Masse und wie gesagt, wenn die driftet, hat der ADC ein Problem.

Moppi
08.10.2020, 18:30
Bei der Masseführung habe ich aufgepasst , dass die Leitungen möglichst breit sind, die engste Stelle, zum LDO-Regler für den ATmega328 (der die Messung durchführt), ist eine Bahn mit vielleicht 3cm Länge und 1.5mm Breite. Auch bei den Treibern sind die schmalsten Bahnstücken 1.5mm breit. Die Masse zu den Treibern und die Masse zu dem LDO-Regler führen in entgegengesetzten Richtungen vom Akkupack weg und sind auf der Platine außen umlaufend durch eine 1.5mm-Bahn verbunden. Wo Platz war, sind die Masseflächen größer und überall auf der Platine verteilt, teils aber nur durch diese 1.5mm-Bahnstücken verbunden.

Spannungsregler regeln diese hochfrequenten Signale nicht weg, dafür sind die nicht gemacht. Damit hatte ich mich schon mal beschäftigt. Die Signale kommen durch den Regler dann durch. Ich habe schon im Netz darüber gelesen. Viele meinen, das ist das Chopper-Signal von den Treibern. Von der Frequenz könnte es hinkommen, das Oszi hatte da auch was von 20 bis 30kHz angezeigt, meine ich.

Nachtrag zu der Masseführung auf der Platine:

Ich habe vergessen, beide Layer anzuschauen. Sowohl Bottom als auch Top führen die Masse. Auf dem Top-Layer sieht es sogar noch besser aus: min. 1.5mm breite, wesentlich kürzere Bahnen (wenige Millimeter), die auf große Masseflächen treffen.

Moppi
09.10.2020, 06:50
So. Jetzt habe ich die gesammelten Erfahrungen und Eindrücke von gestern erst mal verarbeitet :)
Daraufhin habe ich meine Software-Funktion geändert, so dass ich die Schwankungsbreite, der Eingangsspannung, übergeben kann und den Pin, an dem ich den Analogwert lesen will.
So kann ich die Fälle abdecken, stabile und nicht so stabile Werte einzulesen.

Das Letzte war nun noch die Genauigkeit, da habe ich heute Morgen direkt gerechnet.
Wenn ich, durch den Spannungsteiler, bei ca. 11.5V einen Wert von 630 bekomme, dann sind das etwa 0,018V.
Dumm ist, dass ich während einer Fahrt schlecht die Treiber und Motoren abschalten kann. Das Ab- und Anschalten würde u.U. auch etwas störend sein. Vielleicht findet sich da noch eine Lösung, das irgendwie gekonnt hinzubekommen.
Sonst bliebe die Möglichkeit nur grob die Gesamtspannung am Akkupack zu messen, mit einer Genaugkeit von wenigsten 0.3V (wegen der dann nicht so stabilen Messwerte). Da könnte ich die Schwelle bei meinetwegen 11.5V setzen, wo das Gerät zum Laden fahren muss. Das entspräche dann im äußersten Fall 11.2V. Wenn die Zellen genauer gemessen werden können (im Stillstand, vor dem Laden z.B.) kann ich irgendwo im Speicher hinterlegen, wie viel Volt die schwächste Zelle dann hat. Dann kann dieser Punkt, diese 11.5V, nach oben verschoben werden, dass keine Gefahr besteht, die schlechteste Zelle zu tief zu entladen. Bis dann irgendwann Werte erreicht werden, wo der Akku getauscht werden muss. So in etwa sollte das funktionieren. Muss ich nur noch prüfen, ob die drei Spannungsteiler beim Laden stören.

Dann so weit erst mal Danke an alle!

MfG

Holomino
09.10.2020, 06:59
Ach, Du hattest die Motoren bislang schon angeschlossen? Und das sind Schrittmotoren mit Haltestrom?
Wenn dem so ist: Siehst Du denn mit dem Oszi diesen getakteten Haltestrom als kleine Spannungseinbrüche auf der Akkuspannung?

Moppi
09.10.2020, 07:37
Ja, aus Bequemlichkeit hatte ich die angeschlossen gelassen. Wäre ja eigentlich der Normalzustand, auch wenn das Fahrzeug steht, dass ich die Motoren nicht abschalte. Sondern das Teil soll ja stehen bleiben, da fließt dann aber der Haltestrom. Wenn die Motoren stehen, summt es auch hochtönig.

Achso: ja Nema17 ( A4988 )

Aber ich habe ja auch einen Plan dazu:

https://www.roboternetz.de/community/attachment.php?attachmentid=35088&d=1592458026

In meinem Album (https://www.roboternetz.de/community/album.php?albumid=151) ist, auf den blauen Platinen, sogar die Masseführung gut zu erkennen. Allerdings nur einseitig. Bei dem anderen Lack, auf den weißen Platinen, sieht man das nicht mehr.
Man sieht dort auch die Anordnung der Bauteile. Entspricht im Grunde dem Schaltplan, wenn man den um 90° nach links dreht.

Holomino
09.10.2020, 08:35
Dann miss doch mal mit dem Oszi die Akkuspannung. Wenn die auch im Takt der Chopperfrequenz leicht einbricht, dann wird der ADC nichts anderes messen. (Du musst aber wahrscheinlich Dein Oszi auf AC-Kopplung stellen, damit Du die Störung zoomen/triggern kannst)

Moppi
09.10.2020, 09:07
Das habe ich getan. Ich messe nur mit AC, wenn ich Störungen suche. Mit DC finde ich da nichts.
Bloß bei den sehr kleinen Signalen zeigt der mir zwar eine Frequenz an, aber ich weiß nicht, ob das dann so richtig ist.
Manche Werte (Spannung) wird auch falsch angezeigt, je nach eingestelltem Messbereich (1V, 50mV, 10mV ...). Die STörungen sind nur bei den allerkleinsten Messbereichen deutlich sichtbar. Da zeigte das Teil dann auch irgendwie etwa 27khz oder was ähnliches (ändert sich aber auch mit dem Messbereich etwas oder sogar sehr stark). Einzig, wenn ich am Spannungsteiler nach den 10k messe, zeigt das Oszi weder eine Amplitude an, noch eine Frequenz. An der Stelle ist der AC-Anteil deutlich, um einiges geringer. Ansonsten ist auf der Versorgungspsannung der Bauteile überall diese Frequenz überlagert; wenn die Motor-Treiber aktiv sind.

- - - Aktualisiert - - -

Interessant fände ich noch, wenn man, statt umfangreicher, platzraubender Filterung der hochfrequenten Überlagerungen, vielleicht das anders angeht und den Mikrokontroller über eine 3V Knopfzelle oder eine andere Minibatterie versorgt. Vielleicht auch einen Superkondensator. Nur für die Zeit der Messung dann die IC-Versorgung vom Akkupack trennen, nat. dann auch die Ladebeschaltung der Knopfzelle, bzw. des Kondensators. So dass, während der Messungen, der Kontroller nicht mehr vom Akkupack versorgt wird. Vielleicht reicht da ja schon ein FET zum Wegschalten aus, um die Störungen draußen zu halten.

Holomino
09.10.2020, 10:50
Hmmm, ich hab jetzt noch einmal einen intensiveren Blick auf Deinen Schaltplan geworfen.
Die 100nF an VCC kannst Du nicht über drei Controller sharen. Goldene Regel: Jedes IC wird einzeln abgeblockt. Kondensator nah an VCC und GND.
Das ist beim DIP AVR sehr einfach zu routen, weil GND und VCC direkt nebeneinander liegen. Es bietet sich an, den Kondensator direkt vor die beiden Pins zu setzen. Du kannst jetzt auch noch nachträglich die Kondensatoren auf der Unterseite der Platine an die Pins anlöten. Gleiches gilt für VRef. (Dranhalten bringt nix, Du musst wirklich für die Filterung der Controllerfrequenz die Beine kurzschneiden und anlöten)

Aber um endgültig zu Unterscheiden, was nun Wechselanteil auf dem zu messenden Signal und was Störung am ADC ist:
Wenn Du einen zweiten Lipo hast, steck ihn an den Balanceranschluss und verbinde nur seine Masse mit der Masse des ersten Akkus. Der zweite Lipo liefert so die Eingangsspannungen für den ADC, wird aber durch den Rest der Schaltung nicht belastet.

Seine Zellspannungen sind also garantiert stabil. Wenn die ADC-Werte dann gar nicht mehr wackeln, hast Du keine Störungen im ADC.

Moppi
09.10.2020, 12:36
Das, was Du mit dem zweiten Akku vorschlägst, wird nach meiner Vorstellung nicht funktionieren. Dazu müsste ich Leiterbahnen auftrennen, um den einen Mikrokontroller in der Versorgung von den übrigen zu trennen. Deswegen verstehe ich das auch nicht richtig, wie Du das beschrieben hast.

Da die Störungen von den A4988 kommen, müssten die dort auch entfernt werden, direkt an den Treiberbausteinen. Die Versorgungsspannung für die Motoren ist bereits mit einem 100µF-Elko versehen. Ob da ein LOW-ESR-Elko was ändern würde, weiß ich nicht. Es ist völlig unklar, an welchen Pins des Treibers die Störungen einfließen, wo will man da mit der Entstörung anfangen und mit was für Bauteilen?

Das Störsignal ist so klein, dass es nur einen AD-Wandler beeinflusst, der auf 0,0xV stabil messen sollte. Einen DC/DC-Wandler habe ich schon ausgespart, aus solchen Gründen, dort wäre das Störsignal womöglich noch viel stärker. Hätte ich Messschwankungen um 0.5V oder gar mehr, dann würde ich das allse vielleicht nochmal überdenken und eine neue Platine entwerfen. Aber dann sicher nicht mit zig Filter-Ideen, die am Ende die Störung vielleicht weiter unterdrücken, aber nicht vollständig beseitigen.

Da ich mit dem Ergebnis arbeiten kann, würde ich das jetzt einfach mal so belassen wollen.