Tag, Gerade ein kleiner Knoten im Kopf: Ich möchte eine 24V Bleibatterie mittels Atmega2561 überwachen und die Entladekurve im Eeeprom speichern. Das bedeutet also einen Spannungsbereich (mit Sicherheitsabstand) von 20V bis 30V. Von den maximal 30V interessieren mich eigentlich nur 10V, die ich gerne mit möglichst hoher Auflösung messen und speichern möchte. Problem: Mit einem herkömmlichen Spannungsteiler messe ich immer den ganzen Spannungsbereich. Wie kann ich nun das Messfenster anpassen? 30V / 10 Bit: 0.03V 30V / 8 Bit: 0.12V 10V / 10 Bit: 0.001V 10V / 8 Bit: 0.04V Dazu kommt noch, dass ich nur 4096 Bytes Eeprom habe, was bei 10bit Werten nicht mehr wirklich viel ist. Ein guter Kompromiss scheint mir zu sein, die "oberen" 10 Volt mit nur 8 Bit zu messen und zu speichern. Oder gibt es da eine ganz andere, schlauere Lösung, die ich noch nicht kenne? Gibt es einen Weg, von 10bit Messwerten (von 30V) nur den oberen Teil zu verwerten, ohne an Auflösung einzubüßen? Bin für jeden Hinweis Dankbar. Grüße, Maxe
Siehe: Differentielle Spannungsmessung zwischen zwei analogen Eingängen.
Das würde bei VRef 5V bedeuten: ADC Kanal 0: 3.3V ADC Kanal 1: Spannungsteiler 24V/GND Dann mit 10x Gain die Differenz der Beiden Kanäle messen, mit 8bit. Korrekt?
Maxe schrieb: > Von den maximal 30V interessieren mich eigentlich nur 10V, die ich gerne > mit möglichst hoher Auflösung messen und speichern möchte. Siehe hier: https://www.mikrocontroller.net/articles/Spannungsteiler#Spannungsteiler_mit_Offset.2C_passiv
Maxe schrieb: > Von den maximal 30V interessieren mich eigentlich nur 10V, die ich gerne > mit möglichst hoher Auflösung messen und speichern möchte. Dann mußt du einfach vor der Messung 20V abziehen. Schon vor undenklichen Zeiten wurde der Operationsverstärker erfunden, der (neben vielen anderen neckischen Spielereien) auch eine Spannung von einer anderen subtrahieren kann...
Habe das mal nach der Exceltabelle zusammengesteckt, komme aber bei weitem nicht auf das gewünschte Spannungsfenster... Wo ist mein Fehler?
Maxe schrieb: > Habe das mal nach der Exceltabelle zusammengesteckt, komme aber > bei weitem nicht auf das gewünschte Spannungsfenster... > > Wo ist mein Fehler? was willst du mit dem datenpaket anfangen??
je nach Belastung und Temperatur, ist die Entladekurfe unterschiedlich. da müsstest du müdestes noch den Strom und die Temperatur parallel mit aufzeichnen ...
Mit nem Opamp (Spannungsfolger) die unteren 15V am inv.-Eingang (+5V anlegen) wegsubtrahieren und die oberen 15V mittels Spannungsteiler (Spindelpoti) so justieren, dass am noninv.-Eingang bei 30V U_batt 10V anliegen. Dann hast du ne ADC-Range von 0-5V über den U_Batt_Bereich von 15-30V. Unter 15V ist eh Pille bei nem 24V-Akku.
Maxe schrieb: > Habe das mal nach der Exceltabelle zusammengesteckt, komme aber bei > weitem nicht auf das gewünschte Spannungsfenster... > > Wo ist mein Fehler? Wer lesen kann, ist klar im Vorteil: Einschränkungen bezüglich der Werte für Uein_min, Uein_max, Uaus_min, Uaus_max Uaus_min >= Uein_min Uaus_max >= Uein_max Vcc >= Uein_max
Wenn man die max Spannung etwas kleiner als 30V nimmt, so 29V dann bekommt man Spannungen von ca 22V bis 29V mit einem 10 Bit ADC in den Bereich 0x300 bis 0x3ff. Dann kann man statt 10 nur die 8 unteren Bits speichern und bei der Ausgabe einfach 0x300 dzuaddieren. 10 Bit entsprechen einer Auflösung von 0,1%. Alles was man als Schaltung baut, um Bereich und Auflösung anzupassen muß sich an diesen 0,1% messen. Ein einfacher Spannungsteiler und Offset wegrechen hat es da sicher leichter als irgendeine analoge Schaltung mit OpAmp und Referenz. MfG Klaus
@Klaus Du hast dann trotzdem die 29V auf 5V (ADC_max) abgebildet. Mit Op-Subtraktion und Spannungsteiler bildet man die oberen 15V auf die 5V des ADC ab.... und diese 15V dann mit n Bit aufgelöst ist genauer, als 29V mit n Bit...
Maxe schrieb: > Ein guter Kompromiss scheint mir zu sein, die "oberen" 10 Volt mit nur 8 > Bit zu messen und zu speichern. > > Oder gibt es da eine ganz andere, schlauere Lösung, die ich noch nicht > kenne? Die Akkuspannung wird nicht unendlich weit springen... du kannst also nur das Inkrement zum vorherigen Wert speichern und nur z.B. alle 127 Samplepoints einen Absolutwert (10-bit) speichern. Oder du suchst dir sonst eine Kompressionsmethode aus. Möglichkeiten gibt es viele
Simpel schrieb: > @Klaus > Du hast dann trotzdem die 29V auf 5V (ADC_max) abgebildet Richtig, mit einem Spannungsteiler und der entsprechenden Genauigkeit, die man mit zwei Widerständen so hinkriegt. Alles, was man mehr macht, erfordert wesentlich größeren Aufwand für wesentlich mehr Bauteile. Man muß sich zum Beispiel um die Genauigkeit der 15V (bzw des entsprechend runtergeteilten Werts) kümmern. Man erhöht die Auflösung auf Kosten der Genauigkeit, bestenfalls ein Nullsummenspiel. MfG Klaus
Zäum das Pferd doch mal von der richtigen Seite auf: 1) Dich interessieren nur 10 V von der Ent-/Lade-Kurve einer 24 V Bleibatterie. 2) Das ist richtig, da ist nur der Bereich von 18 V (Tiefentladung) bis 28 V (Überladung) interessant. 3) Das soll in 8 Bit = 1 Byte mit 256 Zwischenwerten passen. 4) 10 V / 256 = 39,0625 mV - Reichen dir die 0,039 V? Wenn nicht, kannst du die 1-Byte-Geschichte vergessen! Der Rest funktioniert mit jeder Uref. Beispiel für 5 V: 5) 5 V (Uref) / 1024 = 4,883 mV 6) 39,0625 mV / 4,883 mV = 8,0000 Also lege die Batteriespannung über einen 8:1 Spannungsteiler an den ADC. (Dann sind sogar 40 V Ubat erlaubt.) 28 V / 8 am ADC: 717 Digits 18 V / 8 am ADC: 461 Digits Nimm also den 10-Bit ADC-Wert (oder besser den Mittelwert aus mehreren ADC-Ergebnissen) und ziehe 461 ab. Ist dann das Ergebnis noch größer, als 255, begrenze es auf 255. Fertig zum Abspeichern! Beim Auslesen musst du den Wert von 0...255 mit 39,0625 mV multiplizieren und 18.000 mV addieren.
Aber wenn man gezwungen ist, einen Spannungsbereich auf einen anderen abzubilden, ist ein Nullsummenspiel immer noch erfreuchlicher als eine verlorene Schlacht.
Maxe schrieb: > Von den maximal 30V interessieren mich eigentlich nur 10V Eigentlich wurde schon alles gesagt. Ich habe das mit der Differenzmessung der AVRs gemacht. Also die Batterie-Spg an einen Spg-Teiler, so dass maximal Vref herauskommt. Dann einen 2. Spg-Teiler von Vcc an den Minus-ADC-Eingang. Die Differenz der beiden Eingänge müssen jetzt die gewünschten 10V für Vollaussteuerung des ADC ergeben. Jetzt hast du also 10V mit 10Bit aufgelöst. Das Ergebnis teilst du dann durch 4, damit der Rohwert in ein Byte passt. Damit hast du jetzt die höchst mögliche Speicherdichte im RAM. Die Auflösung im RAM ist jetzt 10V/256=39mV. Aber Vorsicht! Bei der Differenzmessung des AVR muss man einige Abstriche machen, da sie nicht sehr linear ist. Mann darf nicht bis an die Grenzen (0 und 1024 Rohwert) gehen, sonst entstehen größere Fehler. Auch der gesamte Verlauf hat eine Nichtlinearität. Ich habe ±3 Rohwerte ausgemessen, die ich dann über eine Wertetabelle korrigiert habe. Man kann die Differenzmessung natürlich auch mit einem OP-Verstärker machen.
Vielen Dank an alle! Ich denke, der Vorschlag von Kurt ist ein guter Kompromiss zwischen Genauigkeit und zusätzlichem Schaltungsaufwand. Genau keinem nämlich ;) Das war meine Wunschlösung! So wirds gemacht. Die differenzielle Messung werde ich die Tage mal ausprobieren, wenn etwas Zeit zum Spielen ist. Sollte ja auch gut gehen, aber wie Herrmann schon angedeutet hat, da lauern ein paar Fallstricke. Maxe
@Klaus Das Nullsummenspiel à la "linke Tasche-rechte Tasche" hast du mit deinem o.g. Software"trick" produziert. Obere Bits weg... obere Bits wieder dran... Was soll das für einen Vorteil bringen? Das ändert an der Auflösung von 29V/n Bits nix. Ausserdem brauchst du bei 29V->5V einen Spannungsteiler mit Ratio 5,8. Bei der OP-Variante hat man Ratio 3. D.h. sowohl die Auflösung, als auch die Genauigkeit ist bei der Op-Variante höher. Auch hier braucht man nur 1 Spannungsteiler, am nichtinv.Eingang. Der inv.-Eingang des OPs liegt auf ADC_Uref (=Vcc). @Max & Hermann Mit differentiellem Messen per ADC ist auch nix gewonnen. Dadurch dass man den Ref- bzw. Minus-Eingang des ADC hochlegt, hat man am ADC-Messeingang nur noch die Range von Vcc - V_ref_ADC zur Verfügung. Der pos. ADC_In kann nur bis max. Vcc messen. Im o.g. Beispiel von Max werden dann die 10V auf die verbleibende Range von 1,7V (5V-3,3V) des ADC abgebildet, was wieder ca. dasselbe ist, wie 30V auf 5V abzubilden. Zudem sind 2 Spannunggsteiler im Spiel. Also auch hierbei kein faktischer Gewinn. Weder an Auflösung, noch an Genauigkeit.
Mit einem ganz normalen Operationsverstärker. Auf den nichtinvertierenden Eingang gibst Du die Batteriespannung (angepasster Spannungsteiler vorausgesetzt). Auf den invertierenden Eingang gibst Du (verstärkungskorrigiert) eine positive Spannung - konstant - die sozusagen für den vertikalen Versatz (-20V) ausreicht. Die Berechnung findest Du in jedem Buch über Operationsverstärker.
Ich vergaß: Da ohne Batterie bei einem OP die Gefahr besteht, das dieser eine negative Spannung liefert, kann eine Sicherung hiergegen (Diode oder so) nicht schaden. Kein Problem bei Rail-to-Rail.
Man muss bei der ganzen Geschichte 2 Dinge auseinanderhalten: 1.) Das Fitting eines relvanten Fensters aus einem 10-Bit Wert in eine Byte-Variable. 2.) Die Erhöhung der physikalischen Auflösung durch Einsatz eines OPs, der die relevante Messrange selektiv verbreitert. Beides sind 2 Paar verschiedene Stiefel, die nichts miteinander zu tun haben. In Kombination können sie beide Vorteile miteinander verbinden.
So, gerade nochmal ein bisschen probiert. Gaaanz einfach: Spannungsteiler (Trimmer) so eingestellt, dass bei 40V Eingang genau 5V rauskommen. 1:8. Nun ergibt es sich, dass im Bereich von je ziemlich genau 20V bis 30V eines (MSB) der beiden Register immer 00000010 enthält. Ich muss also nur das LSB speichern und hinterher mit dem konstanten MSB zusammenfügen. Kurts Ansatz also nochmal komprimiert.
Sprich im Bereich 20V bis 30V gilt: V_in= 20 + (10/256) * ADC_LSB Wieder wat gelernt.
Maxe schrieb: > Nun ergibt es sich, dass im Bereich von je ziemlich genau 20V bis 30V > eines (MSB) der beiden Register immer 00000010 enthält. > > Ich muss also nur das LSB speichern und hinterher mit dem konstanten MSB > zusammenfügen. ich würde das MSB trotzdem kontrollieren (falls die Spannung doch mal unter 20V sinkt) und das LSB in dem Fall dann auf 0 setzen.
Oh, und wenn ich doch mal <20V oder >30V kommen sollte, muss ich ja nur das MSB bei Änderung (0,1,2 oder 3) speichern. Ich werd verrückt. Diese Möglichkeiten.
Simpel schrieb: > Das Nullsummenspiel à la "linke Tasche-rechte Tasche" hast du mit deinem > o.g. Software"trick" produziert. Obere Bits weg... obere Bits wieder > dran... Was soll das für einen Vorteil bringen? Ich fang mal von hinten an. Der To sagt, sein Speicher ist knapp. Also ist mein Vorschlag, speichere nur 8 Bit als uint8_t statt 10 Bit als uint16_t. Und interpretiere den Wert als Offset plus gespeichertem Wert. Das haben auch andere hier gepostet. Und das zweite: ich verschenke bewußt Auflösung und liefere eine Begründung, warum man das vertreten kann. 10 Bit heißt 0,1%, da muß man sich ganz schön Mühe geben, daß der immer notwendige Spannungsteiler das letzte Bit nicht irrelevant werden läßt. Da sich Fehler addieren, produziert jeder weitere Schaltungsteil weitere Fehler und führt dazu daß noch mehr Bits irrelevant werden. Durch die OP Schaltung mag man die 10 Bit Auflösung zwar behalten, die unteren Bits liegen aber nicht mehr im Vertrauensintervall der Messanordnung. IMHO ist es also einfacher und billiger, sich den OP zu schenken und auf die zwei unteren Bits, die sowieso nicht vertrauenswürdig sind, zu verzichten. Was daran ein "Trick" sein soll, ist mir nicht klar MfG Klaus
Nach nochmaligem Lesen gebe ich zu, im Prinzip habe ich nun erst endlich Klaus' Vorschlag vom Anfang nachvollzogen und umgesetzt. Mea culpa. Aber immerhin. Es funktioniert. Und ohne zusätzlichen Aufwand (ausser diesem Thread natürlich) besser, also es für die Anwendung letztlich nötig gewesen wäre ;) Das nennt man dann Fortschritt?!
Wenn der Speicher knapp ist, warum nicht einfach Ein externes EEPROM über I2C anschließen? Zur Messung, wie wäre es, durch Oversampling die Auflösung auf 12 bit zu erhöhen und mit einem Spannungsteiler die 30 V auf 5 V abzubilden. Das bringt eine bessere Auflösung als 10 V bei 10 bit.
Oversampling: Jaaa... aber für eine Batterieanzeige langts nun ;) Aber danke für den Denkanstoß, demnächst wird mal wieder gespielt und probiert. Maxe schrieb: > Es funktioniert. Und ohne zusätzlichen Aufwand (ausser > diesem Thread natürlich) besser, also es für die Anwendung letztlich > nötig gewesen wäre ;) Externer EEprom ja... müsste aber noch zusätzlich an das fertige Board angedübelt werden. Mit der nun gefunden KlausKurt-Lösung komme ich mit den 4kB ganz gut zurecht, denke ich.
Simpel schrieb: > Mit differentiellem Messen per ADC ist auch nix gewonnen Das stimmt so nicht! Die differenzielle Messung subtrahiert den negativen von dem positiven Eingang und die Differenz wird auf den ADC mit 10Bit Auflösung gegeben. Der Eingangs-Offset kann dabei (annähend) den gesamten Bereich von 0V bis Vcc überdecken. Also genau wie bei Einsatz eines OP. Man gewinnt also definitiv Auflösung und kann die gesamten 10Bit nutzen. Ich war auch skeptisch und habe es deshalb genau getestet. Maxe schrieb: > Gaaanz einfach: Spannungsteiler (Trimmer) so eingestellt, dass bei 40V > Eingang genau 5V rauskommen. 1:8 Damit hast du nur 40V/1024=40mV Auflösung, und der Anspruch "Auflösung erhöhen" ist nicht mehr erreicht. Klaus schrieb: > Da sich Fehler addieren, > produziert jeder weitere Schaltungsteil weitere Fehler und führt dazu > daß noch mehr Bits irrelevant werden Das ist natürlich richtig. Aber es ist bei so einem Messaufbau Pflicht, das Ergebnis zu kalibrieren. D.h. es bleiben danach nur Temperatur- und Drift-Fehler übrig. Karl schrieb: > durch Oversampling die Auflösung auf 12 bit zu > erhöhen Das mache ich auch immer. Ich taste so hoch wie möglich ab und glätte die Werte durch einen digitalen Tiefpass.
Hermann schrieb: > Das stimmt so nicht! Die differenzielle Messung subtrahiert den > negativen von dem positiven Eingang und die Differenz wird auf den ADC > mit 10Bit Auflösung gegeben. Der Eingangs-Offset kann dabei (annähend) > den gesamten Bereich von 0V bis Vcc überdecken. Also genau wie bei > Einsatz eines OP. Man gewinnt also definitiv Auflösung und kann die > gesamten 10Bit nutzen. Ich war auch skeptisch und habe es deshalb genau > getestet. > Bist du sicher? Das hiesse nach Deiner Aussage: Wenn du (bei Vcc 5V) an den Minus-Eingang des ADC +4,9V legst, kann der Plus-Eingang bis +9,9V beaufschlagt werden, um auf die max. Differenz von 5V zu kommen??? Dagegen spricht... Laut Datenblatt (Absolute Maximum Ratings): Voltage on any Pin except RESET with respect to Ground ................................-0.5V to VCC+0.5V
Simpel schrieb: > Wenn du (bei Vcc 5V) an den Minus-Eingang des ADC +4,9V legst, kann der > Plus-Eingang bis +9,9V beaufschlagt werden, Natürlich nicht! Ich habe nur gesagt, dass der Offset bis Vcc gehen kann. Also z.B. Vcc=5V; Vref=2,5V; V-=2V; V+=4,5V für Vollaussteuerung.
Warum packst du deine Entladekurve nicht in den Flashspeicher? Ingo
Ingo schrieb: > Warum packst du deine Entladekurve nicht in den Flashspeicher? > > Ingo Weil das meines Wissens nur mit einem kleinen Bootloader funktionieren würde, der zum Schreiben angesprungen werden müsste. Die Aufzeichnung der Ladekurve ist nicht wirklich die Hauptaufgabe des µC in der Schaltung, sondern v.A. die Überwachung verschiedener Zustände inkl. schneller Reaktion auf Änderungen. Da möchte ich ihn nicht mit solchen Sachen ärgern, mal ganz abgesehen vom Entwicklungsaufwand. Dann doch lieber ein externer Eeprom.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.