Go Down

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

RIN67630

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.

Code: [Select]


// *** 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.

combie

#46
Aug 13, 2017, 11:12 am Last Edit: Aug 13, 2017, 03:29 pm by combie
Quote
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.


3. 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

Code: [Select]
const float Steigung = 14.89/1008; // bitte eigene ausgemessene Werte einsetzen

Nochmal als Ganzes:
Code: [Select]

/**
 * 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




Ob ein Mensch ein Gentleman ist,
erkennt man an seinem Benehmen denjenigen Menschen gegenüber,
von denen er keinen Nutzen hat.
Autor: William Lyon Phelps

meister_q

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.

combie

#48
Aug 13, 2017, 04:43 pm Last Edit: Aug 13, 2017, 04:55 pm by combie
Quote
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.


Quote
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.



Ob ein Mensch ein Gentleman ist,
erkennt man an seinem Benehmen denjenigen Menschen gegenüber,
von denen er keinen Nutzen hat.
Autor: William Lyon Phelps

meister_q

Gut.

Folgendes hab ich gemacht:

Code: [Select]

/**
   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?


combie

#50
Aug 13, 2017, 06:11 pm Last Edit: Aug 13, 2017, 06:13 pm by combie
Code: [Select]
/**
 * 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.
Ob ein Mensch ein Gentleman ist,
erkennt man an seinem Benehmen denjenigen Menschen gegenüber,
von denen er keinen Nutzen hat.
Autor: William Lyon Phelps

meister_q

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.

Go Up