Go Down

Topic: Spannung messen (maximal 15V) (Read 851 times) previous topic - next topic

meister_q

Moin Leute,

mal wieder das Thema Spannung Messen.

Ich bin dran, die Spannung von 12 KFZ Batterien zu messen.

Ich weiss, dass die Batterien beim Laden nie 15V erreichen werden, aber ich dachte, 15V als maximale Spannung festzulegen, ist nicht schlecht, so kann ich den Spannungsteiler mit 10kOhm zu 5kOhm auslegen.

So habe ich die Schaltung auch aufgebaut (siehe Schaltplan).

Als Spannungsquelle nutze ich momentan einen DCDC Wandler den ich auf 12V eingestellt habe. Jetzt messe ich ja 0-5V an dem 5kOhm Widerstand was ja 0-1023 entspricht.

Habe mir folgenden Code zusammengebaut:

Code: [Select]

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F, 16, 2);

const int messungen = 20;

int batterie1Pin = A0;
float messung[messungen];
float spannung = 0.0;
float gesammtmessung = 0.0;


void setup()
{
  Serial.begin(9600);
  pinMode(batterie1Pin, INPUT);

  lcd.begin();          // LCD Starten
  lcd.backlight();      // LCD backlight aktivieren
  lcd.clear();          // LCD Säubern

}

void loop()
{
  for (int i = 0; i < messungen; i++)
  {
    messung[i] = analogRead(batterie1Pin); // anstatt i dann den Sensorwert rein
  }

  for (int i = 0; i < messungen; i++)
  {
    gesammtmessung = gesammtmessung + messung[i];
  }

  gesammtmessung = gesammtmessung / messungen;

  //  gesammtmessung = (messung[0] + messung[1] + messung[2] + messung[3] + messung[4]) / messungen;



  spannung = gesammtmessung * 15 / 1023;

  Serial.print("AR: ");
  Serial.println(gesammtmessung);
  Serial.print("Spannung: ");
  Serial.print(spannung);
  Serial.println("V");
  LCD();
  delay(2000);
}

void LCD()
{
  lcd.setCursor(0, 0);
  lcd.print("B1: ");
  if (spannung < 10)
  {
    lcd.print(" ");
    lcd.print(spannung);
    lcd.print("V");
  }
  else
  {
    lcd.print(spannung);
    lcd.print("V");
  }
}


Der Code ist nur zum Testen, sonst würde ich niemals delay benutzten.

Bei 12,65V eingestellt am DCDC Wandler (mit Multimeter eingestellt), misst der Arduino aber 15.54V (wenn das Poti auf 5kOhm gestellt wird.

Drehe ich das Poti jetzt runter, bis mir Arduino und Multimeter das selbe anzeigen, hat das Poti einen Wert von 3,66kOhm (mit Multimeter gemessen).

Kann man in dem falle sagen, dass ich das ganze so verlöten und verbauen kann, oder ist das pfusch?

2. Punkt: wird das mit Schaltplan und Board so funktionieren? (Habe keinerlei erfahrung mit Eagle und PCB design)

Danke!

Tommy56

Zum Testen kannst Du das mit Potis machen, zum realen Betrieb würde ich es nicht machen.
Potis neigen im Laufe der Zeit dazu, den Wert zu ändern (z.B. durch Oxydation am Schleifer).

Die Abweichungen kommen wohl von den Toleranzen der Widerstände. Lieber durch geeignete Widerstandskombinationen den Wert mit Festwiderständen optimieren.

Ich weiß nicht, wie belastbar Deine Quelle ist (ist es direkt die Spannung im Fahrzeug?). Wenn sie das ab kann, würde ich die Widerstände um den Faktor 10 niedriger nehmen, das verringert die Störanfälligkeit.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

meister_q

Danke für die Antwort.

Also es sind 2 Batterien im Boot. 120Ah und.. 100Ah wenn ich mich nicht irre.

Also sollte ich Widerstände mit 0.1% Toleranz wählen? 1k und 500Ohm wäre ja Faktor 10 kleiner.

Tommy56

Das wären 10 mA Dauerstrom. Wie lange bleiben die Batterien ohne dass sie geladen werden?
Ich war von Auto/Motorrad ausgegangen, die ja öfter benutzt und dabei geladen werden.
Wobei Du die Akkus wahrscheinlich in der Winterpause sowieso ausbaust.

Entweder präzise Widerstände nehmen oder aus der Bastelkiste ausmessen und evtl. kombinieren (also z.B. noch 10 Ohm in Reihe, wenn da was fehlt).

Dir ist auch bewußt, dass die Betriebsspannung des Arduino mit in die Messung eingeht, weil sie im Normalfall als Referenz genommen wird und rechnerisch mit 5V betrachtet wird.

Wenn es genauer sein soll, die interne Referenz benutzen oder eine externe Referenzspannungsquelle benutzen. Du kannst den Unterschied auch in der Software rausrechnen.

Das hängt stark davon ab, wofür Du den Messwert brauchst. Wenn es nur eine Info sein soll, reicht +-0,5V durchaus. Das wissen wir aber nicht.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

meister_q

Nun, die Batterie wird im Hafen (bei nichtbenutzung) permanent über ein Ladegerät am leben erhalten. Bei fahrt wird sie klar durch den Motor geladen, und ansonsten steht das Boot höchstens eine Nacht irgendwo ohne geladen zu werden irgendwo rum.

Das mit der Betriebsspannung ist mir auch bewusst, allerdings verstehe ich nicht wie. Die erklärungen dazu im Netz finde ich merkwürdig.

Das ich die Aref irgendwie nutzen muss, ist mir bewusst. Nur wie?

Mein Schwager hat mich beauftragt, eine Spannungsanzeige für seine 2 Batterien zu bauen. Also soll nur die aktuell anliegende Spannung anzeigt werden.

Ein Tiefenentladeschutz ist separat verbaut (ein Kaufteil, da mir schon bewusst war, dass das nicht so einfach ist).

Tommy56

Ok, dann sind die 10 mA kein Problem.

Der Arduino benutzt (ohne besondere Einstellungen) seine Betriebsspannung als Referenzspannung und definiert diese als 5V.

Das klappt auch meistens, wenn die Messignale aus dieser Betriebsspannung abgeleitet werden (z.B. Fotowiderstand am Spannungsteiler, aber aus 5V Arduino gespeist).

Du hast das Problem, dass die zu messnde Spannung eine Fremdspannung ist, also nicht von der Arduino-Betriebsspannung abhängt.

Du gehst also entweder
1) -- auf die interne Referenz von 1,1V = 1023 und dimensionierst Deinen Spannungsteiler darauf,
2) -- schließt eine externe 5V-Referenz an (da gibt es spezielle IC/Platinen mit Temperaturkompensation)
3) -- misst die reale Versorgungsspannung des Arduino ond setzt diese in die Berechnung ein (nicht Temperaturstabil)
4) -- nimmst die Spannung so, wie sie ist und rechnest die ermittelte Differenz raus (nicht temperaturstabil)

Für eine Anzeige der Batteriespannung halte ich die Variante 3 für ausreichend.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

meister_q

Achso, verstehe!

Von den 4 Wegen gefällt mir der 3. weg sehr gut, wie du es ja auch schon gesagt hast.

Kommt meine nächste frage: Wie rechne ich die reale Versorgungsspannung mit ein? Ich messe zwischen Aref und GND von der Platine 4,33V. Das ist also meine Versorgungsspannung?


Tommy56

Dreisatz?

1024 Schritte entsprechen 4,33 V
input (0-1023 also 1024 Schritte) entspricht Spannung

Spannung = input * 4,33 /1024

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

meister_q

Ich hab ja

Code: [Select]

  spannung = gesammtmessung * 15 / 1023;


Also ersetze ich die 15 mit 4,33, und Teile wieder durch 1024?

Ich steh gerade auf dem schlauch.

combie

#9
Aug 08, 2017, 09:45 pm Last Edit: Aug 09, 2017, 12:28 am by combie
Quote
1) -- auf die interne Referenz von 1,1V = 1023 und dimensionierst Deinen Spannungsteiler darauf,
Das halte ich für das Mittel der Wahl!
100nF Kerkos an den A Pins erlauben dann hohe Messwiderstände.
z.B: 10K zu 150K
Die Kombination hält Störpulse außen vor.
Die Betriebsspannung spielt keine Rolex mehr.

Wenigstens eine 1 Punkt Kalibrierung ist sinnvoll
Damit sind dann auch die konkreten Widerstandswerte egal, solange sie im Rahmen bleiben.
Und auch die 10%ige Toleranz der 1,1V Referenz wird gleich mit erschlagen.

Den Kalibrierwert(Steigung) kann man im EEPROM ablegen.

Einfacher und genauer bekommt man es nicht.
*persönliche Ansicht*


"Freiheit, Gleichheit, Brüderlichkeit!"
Aber wie gelangen wir zu den Tätigkeitswörtern?
Quelle: Stanislaw Jerzy Lec

Tommy56

Dann so, den Spannungsteiler habe ich ignoriert.

Das Ergebnis musst Du noch mit Deinem gemessenen Spannungsteilerverhältnis multiplizieren.

Also Umess (am Arduino) = R2 (am Arduino) /(R1+R2) * Ubatterie


Spannung = input * 4,33 /1024

mit input = Umess

Spannung = R2 / (R1+R2) * 4,33/1024

Ich hoffe, ich habe mich nicht verhauen. Da korrigiert mich aber jemand.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Tommy56

@combie: Das ist auf jeden Fall genauer und auch nicht mehr Aufwand.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Doc_Arduino

Hallo,

ich muss den derzeitigen Mess- und Testaufbau kritisieren. Egal welche Umrechnungsformel du verwendest, sobald du am 5k Poti drehst verstellst du alles. Das geht so nicht. Der Messspannungsteiler am analogen Eingang muss fest sein. Ansonsten verstellst du permanent das Teilerverhältnis und es muss Mist rauskommen. Bleibe meinetwegen bei den 10k und 5k (oder andere wie vorgeschlagen) aber mit Festwiderständen. Am Eingang des Messspannungsteiler, also oben am 10k, dort kannste mit einem Poti drehen wie die lustig bist. Dann ändert sich nur die Eingangsgröße am festen Teiler.

Nochwas. Du misst die Batteriespannung nicht im Auto? Die Batterien stehen wo rum und die willst du messen.

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

meister_q

#13
Aug 08, 2017, 10:25 pm Last Edit: Aug 08, 2017, 10:31 pm by meister_q
Dann so, den Spannungsteiler habe ich ignoriert.

Das Ergebnis musst Du noch mit Deinem gemessenen Spannungsteilerverhältnis multiplizieren.

Also Umess (am Arduino) = R2 (am Arduino) /(R1+R2) * Ubatterie


Spannung = input * 4,33 /1024

mit input = Umess

Spannung = R2 / (R1+R2) * 4,33/1024

Ich hoffe, ich habe mich nicht verhauen. Da korrigiert mich aber jemand.

Gruß Tommy
Das Teste ich morgen mal, danke.


Nochwas. Du misst die Batteriespannung nicht im Auto? Die Batterien stehen wo rum und die willst du messen.
Nein, im Boot. Bei Betrieb, weil die anzeige ja egal ist, wenn das Boot im Hafen steht.

Ich hab mir jetzt 1% Widerstände in allen Größen geordert. Damit baue ich den Messaufbau erneut auf.

Doc_Arduino

Hallo,

das mit dem Festspannungsteiler haste hoffentlich gelesen.
Wenn du im Boot misst, also bei laufenden Motor und damit laufender Lichtmaschine, wirst du sicherlich wie im Auto Störungen auf dem Bordnetz haben. Dann funktioniert die Schaltung so nicht bzw. nur kurze Zeit.
a) Spannungsversorgung für den Arduino schützen
b) Messeingang schützen
c) damit musst du auch den Spannungsteiler größer wählen, womit für mich die interne 1,1V Referenz unbrauchbar wird
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Go Up