Spannung messen (maximal 15V)

HotSystems:
Das wird dem TO sicher nicht reichen.
Wenn er etwas mit einem Arduino machen möchte, dann sicher nicht nur messen.

HotSystems:
Ganz einfach...wenn ich etwas mit einem Arduino mache, möchte ich immer noch mehr damit erledigen.
Mit dem Messen fängt er an...

Einfach nur eine Funktion ausführen, da langweilt Ardu der sich doch und kündigt. :wink: :wink:

Ja mal sehen, aber es ist nichts weiter geplant, außer die Spannungsmessung und Anzeige, vielleicht irgendwann mal mehr, weil das ist ja wirklich keine aufgabe für den kleinen :stuck_out_tongue:

gregorss:
Woraus schließt Du das? Ich habe den Thread nur überflogen, aber IMO ist da immer nur die Rede von „Spannung messen“.

Gruß

Gregor

Richtig.

gregorss:
Wenn er es denn einmal hinbekäme. Von „danke, klappt“ habe ich leider noch nichts gelesen.

Dieser Thread hat schon zwei Seiten mit über 20 Postings. Das alles nur, um eine Spannung zu messen?! Ich bin mal gespannt, nach wieviel hundert Postings oder Seiten I²C drankommt ...

Gruß

Gregor

Bitte? Lass mir mal bitte etwas mehr Zeit als weniger 24 stunden. Ich bin noch garnicht dazu gekommen.

gregorss:
Wenn er es denn einmal hinbekäme. Von „danke, klappt“ habe ich leider noch nichts gelesen.

Dieser Thread hat schon zwei Seiten mit über 20 Postings. Das alles nur, um eine Spannung zu messen?! Ich bin mal gespannt, nach wieviel hundert Postings oder Seiten I²C drankommt ...

Gruß

Gregor

Hör bitte auf sachen, die hier nicht relevant sind, einzubinden. Ich habe nichts von I²C oder SPI erzählt, und dabei bleibts. Außerdem macht man dazu WENN einen neuen Thread auf.

HotSystems:
Woher nimmst du jetzt diese Annahme ?
I2C steht doch auf einem anderen Blatt. :wink:

So ist es.

combie:
Das Problem ist noch keine 24H alt.
Und schon drängeln?

Vielen Dank :slight_smile:

MiReu:
Er will auch Öltemp und Lade-/Entladeströme messen.

Sein Schwager stellt mehr Ansprüche als nur die Spannungsanzeige.

Natürlich kommt noch I²C oder SPI oder wie sollen die Werte angezeigt werden? :wink:

Und was erzählst du jetzt, was mein Schwager haben will? Kennst du ihn etwa? Hör auf hier Bullshit zu schreiben weil dir langweilig ist.

MiReu:
In dem Thread wo es um Öltemp und dem wo es um Strom geht. Beim Öltemp hast du dich doch auch schon beteiligt (Strom weiß ich gerade nicht) :wink:

Pingelheimer :smiley: :wink: dann kommt halt dies zur Sprache. Wobei ich nicht glaube das er da noch genug Ausgänge zur Verfügung hat, mit dem ganzen anderen Gerödel - ist nur ne Vermutung.

Der Ölthread ist was ganz anderes. Da geht es um was völlig anderes. Bitte genau lesen.

MiReu:
Na ich bin doch Anfänger und da lese ich (fast) alles und versuche mir auch zu merken wer was wie schreibt um zu wissen wer hier die Guten und wer die "Wichtigmacher" sind.

Dich zähle ich übrigens jetzt schon zu den Guten.

Manchmal versuche ich etwas Witz in meine Posts zu bringen. Wenn dies hier nicht gerne gesehen wird, dann bitte ich dies mir mitzuteilen - Danke (zur Bemerkung Pingelheimer)

Danke, bitte den "Mist" unterlassen. Anscheinend bist du einer der Wichtigmacher?

Tommy56:
Wer ist denn hier nicht entspannt?

Gruß Tommy

Tommy, du bist nicht gemeint! Du hast von anfang an sehr sachlich geholfen. Hast auch schon Karma von mir bekommen. Ich habe nur noch keine zeit gehabt das zumzusetzen, weil ich mich gerade mit Quoten und Kommentieren sinnloser und hilfreicher Kommentare beschäftigen muss.

Doc_Arduino:
Hallo,

also wenn ich mir den Thread so anschaue, frage ich mich schon warum der wieder einmal versaut wurde mit sinnlosen Querinformationen die der TO hier in diesem Thread nie gestellt hat. Hier dreht es sich allein um eine Spannungsmessung. Nicht mehr und nicht weniger. Der Rest sind wirklich nur eingestreute Vermutungen die alles verkomplizieren aber niemanden nutzen. Und was ich gar nicht leiden kann ist, wenn man erst Druck macht, dass sich der TO melden soll, danke sagen soll und ähnliches, wofür es noch keinen Grund gibt, kam ja noch nicht das gewünschte Ergebnis für ihn raus und in der nächsten Minute verlangt man Lockerheit. Ne Leute, dass passt vorne und hinten nicht zusammen. Das muss ich mal ganz klar sagen. Meister_Q muss sicherlich nicht erst locker werden. Er ist es zum Glück.

Danke für die Unterstützung.


Sooo....

Ich werde bescheid geben, sobald ich meine Widerstände der E96 Reihe erhalten habe. (1% Toleranz sollte mir genügen).

Und bis dahin bitte ich alle anderen, die mir nicht helfen wollen, sondern sinnlose sachen hier rein Posten, dieses zu unterlassen, damit man den Überblick nicht verliert.

Evtl kann ein Mod ja mal die Sinnlosen sachen löschen.

VIELEN DANK AN ALLE DIE WAS SACHLICHES ZU DIESEM THEMA BEITRAGEN!!!

meister_q:
Der Ölthread ist was ganz anderes. Da geht es um was völlig anderes. Bitte genau lesen.

Danke, bitte den "Mist" unterlassen. Anscheinend bist du einer der Wichtigmacher?

Das könnte man so interpretieren, weil es dort um ein Straßenfahrzeug und nicht um ein Boot geht ;).

Gruß Tommy

meister_q:
... Bitte? ...

Was meine Beiträge zu diesem Thread angeht, bitte ich um Entschuldigung. Ich habe heute versucht, drei - zeitweise vier - Dinge gleichzeitig zu machen und habe wohl hinlänglich bewiesen, dass ich dann nicht auch noch posten sollte (weil ich je nach (nicht-) Aufmerksamkeit auch mal Dinge durcheinanderbringe).

meister_q:
VIELEN DANK AN ALLE DIE WAS SACHLICHES ZU DIESEM THEMA BEITRAGEN!!!

Nun denn, ich werde versuchen, mich zu bessern.

Gruß

Gregor

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

Ich benötige dazu nochmal hilfe.

Bezüglich der Widerstände:

Ich habe jetzt angedacht 10k und 1k zu nehmen. Bei 15V sollte an R2 eine Spannung von 1,36V anliegen.

Wie gehe ich mit der realen Versorungsspannung von 4,25 an meinem Arduino jetzt daran?

Ich habe den zitierten Post nicht ganz verstanden?

Spannung = analogRead(A0) * 4,25 / 1024;
Spannung = 10000 / (100000+10000) * 4,33 / 1024;

?

Wie gehe ich mit der realen Versorungsspannung von 4,25 an meinem Arduino jetzt daran?

Aus meiner Sicht:
Noch nicht einmal ignorieren!

Klarer:
Nimm die Versorgung als schwankend an.
Damit liegst du richtiger, als mit allen anderen möglichen Annahmen..

meister_q:
Ich benötige dazu nochmal hilfe.

Wie gehe ich mit der realen Versorungsspannung von 4,25 an meinem Arduino jetzt daran?

Das wichtigste ist, wie Du deinen Arduino mit Strom versorgt.

a) über USB am Computer: dann musst du unbedingt die Spannung kompensieren.
b) über Vin mit einer Spannung zwischen 6,5 und 9 V und sonst wenig Stromverbraucher am 5V das Arduinos, dann kannst du 5 V annehmen, wenn du nicht zu großer Genauigkeit erwarten willst.
c) über 5V mit einer gut geregelte Stromversorgung dann entspricht eine Messung die Qualität der Stromversorgung.

Für den Fall a) Hier ist noch eine Funktion, die die eigene Spannung des Arduinos versucht zu evaluieren. Die Genauigkeit ist relativ aber immer noch besser, als einen falschen Vcc Wert anzunehmen.

// *** Function to obtain chip's actual Vcc voltage value, using internal bandgap reference ***
// Function to obtain chip's actual Vcc voltage value, using internal bandgap reference
// This provides ability to maintain A/D calibration with changing Vcc in case of analogReference (DEFAULT)
// For 328 chip only, mod needed for 1280/2560 chip

int getBandgap(void)
{
  // REFS1 REFS0          --> 0 1, AVcc internal ref.
  // MUX3 MUX2 MUX1 MUX0  --> 1110 1.1V (VBG)
  ADMUX = (0 << REFS1) | (1 << REFS0) | (0 << ADLAR) | (1 << MUX3) | (1 << MUX2) | (1 << MUX1) | (0 << MUX0);
  // Start a conversion
  ADCSRA |= _BV( ADSC );
  // Wait for it to complete
  while ( ( (ADCSRA & (1 << ADSC)) != 0 ) );
  // Scale the value
  unsigned int results = (((internalReferenceVoltage * 1024L) / ADC) + 5L) ;
  return results;
}

"internalReferenceVoltage" solltest du am Pin Aref bei AnalogReference(INTERNAL) ein Mal messen und als Konstante im Sketch angeben.

Die Funktion gibt dir 10*Vcc zurück.

Das wichtigste ist, wie Du deinen Arduino mit Strom versorgt.

Das wichtigste ist, dass Du deinen Arduino mit Strom versorgt.

Das messen der Versorgungsspannung des Arduinos macht manchmal Sinn.
Hier allerdings nicht.

Im Gegenteil, es lenkt vom Problem ab.
Bringt eine zusätzliche Hürde rein.

Gemessen werden, soll die Spannung von 12V Batterien.(Messbereich bis 15V)
Und da interessiert die Versorgungsspannung des Arduinos im Geringsten nicht.
Von 1,8V bis 5,5V ist alles völlig egal.
Von mir aus darf sie auch wackeln, wie ein Lämmerschwanz.

Anleitung, wie so etwas zu tun ist:

  1. Datenblatt lesen.
    Erkenntnis daraus:
    A: die interne 1,1V Referenz ist recht stabil
    B: die interne Referenz unterliegt einer 10%igen Toleranz(Bauteilstreuung)
    C: Ein hoher Widerstand des Spannungsteilers verringert nicht die Genauigkeit, sondern verlängert den Messzyklus

  2. Spannungsteiler berechnen
    Die Referenz liefert uns im Extremfall 1,0 V oder 1,2 V.
    Nehmen wir hier den unteren Wert.
    Also 1,0 V.
    Unterer Widerstand, also zwischen GND und A Pin, willkürlich auf 10K festgelegt.
    Also maximal 1V Spannungsabfall am 10K
    Bleiben noch 14V, welche am oberen (zwischen Batterie und A Pin) abfallen müssen.
    Also sollte er 140k, oder geringfügig mehr haben.

Fix einen 100k und einen 47k Widerstand in Reihe geschaltet.

  1. Die EinPunktKalibrierung.

Interne Referenz aktivieren.
Testspannung an den Spannungsteiler anschließen.
Testspannung so groß wählen, dass der Endstand des ADC von 1023 gerade nicht erreicht wird.

Angenommene Testspannung: 14,89V
ADC Wert bei dieser Testspannung: 1008

const float Steigung = 14.89/1008; // bitte eigene ausgemessene Werte einsetzen

Nochmal als Ganzes:

/**
 * Datenblatt des ATMega328P :
 * http://www.atmel.com/Images/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf
 * 
*/




const float Steigung = 15.6/1014; // meine gemessenen Werte


void setup() 
{
  Serial.begin(9600);
  analogReference(INTERNAL);
}



void loop()
{ 
  float value = Steigung * analogRead(A0);
  Serial.println(value);
  delay(100);
}

Damit ist das Problem erschlagen!
Und wie man sieht gehen weder die Betriebsspannung, die exakte Referenzpannung, als auch die konkreten Widerstandswerte in die Berechnung ein.
Alles dieses braucht man im Programm nicht.

Mögliche Verbesserungen:
Ein kleiner Kerko zwischen A Pin und GND.
Den µC während der Messung schlafen legen
Einen gleitenden Mittelwert berechnen

Vielen dank für die Ausführliche erklärung combie!

Zu Punkt 2:

Ich habe hier 1k 10k und 100k rumliegen, 47k hab ich leider nicht.

Was ist wenn ich 1470 (270 + 100 + 100 + 1000Ohm) zu 100 Ohm nehme?

Damit sollte ich die Kalibierung wie du sie dann bei Punkt 3 erläutert hast, auch hin bekommen?

Zu den Verbesserungen:

Im Startcode habe ich ja bereits die Berechnung des Mittelwertes.
Das mit dem Kondensator werde ich dann bei erfolgreicher Messung einfügen.

Im Startcode habe ich ja bereits die Berechnung des Mittelwertes.

Ja.
Ich sprach vom "gleitenden Mittelwert"
Der frisst weniger Speicher.

Soll mir allerdings auch egal sein.
Denn für ungenutzten Speicher gibt es kein Geld zurück.

Nimm einfach das, was du für richtig hältst.

Was ist wenn ich 1470 (270 + 100 + 100 + 1000Ohm) zu 100 Ohm nehme?

Kannst du tun!
Die niedrigen Widerstände führen zu einem höheren Strom.
Wenn du damit leben kannst, ist alles gut.

Auch 100k mit 100k parallel macht 50K, also etwas mehr als 47K.

Wenn du in meiner obrigen Überschlagsrechnung deine konkrete Referenzspannung verwendest, kannst du den Spannungsteiler vielleicht noch knapper auslegen. Das würde die Steigung kleiner machen, und damit mehr Schritte bis 15V erlauben, also etwas mehr Genauigkeit..

Das von mir gepostete Beispiel läuft mit 10k zu 134k
(weil ich gerade nichts anderes da hatte und die Höhe meiner Referenz mir die Chance lässt)

Mein Tipp:
Spiele mit den Werten.

Gut.

Folgendes hab ich gemacht:

/**
   Datenblatt des ATMega328P :
   http://www.atmel.com/Images/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf

*/


float value = 0.0;

const float Steigung = 14.98 / 909; // Spannung 14.98V bei analogWert 909

float analogWert = 0.0;

void setup()
{
  Serial.begin(9600);
  analogReference(INTERNAL);
}



void loop()
{
  analogWert = analogRead(A0);
  value = Steigung * analogWert;
  Serial.print("A: ");
  Serial.println(analogWert);
  Serial.print("Value: ");
  Serial.println(value);
  delay(100);
}

Habe 909 am analogen Pin, bei 14.98V (laut Multimeter) am DCDC Wandler, der mir meine Spannung liefert. Schaut nach einem passenden ergebniss aus!

Vielen dank!

Wie berechne ich den den gleitenden Mittelwert?

/**
 * Datenblatt des ATMega328P :
 * http://www.atmel.com/Images/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf
 * 
*/


float gmw = 0.0; // Gleitender Mittelwert
const float Steigung = 15.6/1014;
float Faktor = 0.1; // 0 < Faktor < 1

void setup() 
{
  Serial.begin(9600);
  analogReference(INTERNAL);
  gmw = Steigung * analogRead(A0); // GMW Vorbesetzen
}



void loop()
{ 
  int v = analogRead(A0);
  float value = Steigung * v;
  gmw = gmw - gmw*Faktor + value*Faktor;
  Serial.print(value,1);
  Serial.print(" ");
  Serial.println(gmw,1);
  delay(100);
}

Kleiner Faktor bewirkt große Dämpfung
Den Erfolg kann man sich schön im seriellen Plotter ansehen.

Mit der Rechnung passt es ganz gut. Bei eingestellten 12,83V (mit Multimeter gemessen), zeigt es mir im Seriellen Monitor 12.7V an. die 0.13V differenz sollte vernachlässigbar sein, da die Spannung ja nicht zum Schutz gegen Tiefenentladung genutzt wird.

Vielen dank nochmal combie, und alle anderen für eure Mühe.

Das Ergebniss reicht mir so, und an alle folgenden die in diesem Thread landen: Gelöst wurde es mit Combies letzten Posts.