Seltsamer Offset bei averaged Spannungsmessung

Ich wollte gerne nen Lipo möglichst genau messen komme abernicht mehr weiter nachdem ich die Readings stabilisiert habe komme ich auf einen Offset von 0.2V. Meine Frage ist jetzt warum?

Hier der Code den Ich benutze:

#include "Arduino.h"

const int numReadings = 100;

float readings_Sensor[numReadings];      // the readings from the analog input
int readIndex_Sensor = 0;              // the index of the current reading
float total_Sensor = 0;                  // the running total
float average_Sensor = 0;                // the average
float R2 = 98.3f;
float R1 = 21.65f;


void setup()
{
	Serial.begin(9600);
	pinMode(A0,INPUT);
	pinMode(10,OUTPUT);
	digitalWrite(10,1);

	for (int thisReading = 0; thisReading < numReadings; thisReading++) {
		readings_Sensor[thisReading] = 0.0f;
	}
}
void loop()
{
	  // subtract the last reading:
	  total_Sensor = total_Sensor - readings_Sensor[readIndex_Sensor];
	  // read from the sensor:
	  readings_Sensor[readIndex_Sensor] = (R2/R1) * readSuppVol() * float(analogRead(A0)) / 4096.0f;  // LiPo battery
	  // add the reading to the total:
	  total_Sensor = total_Sensor + readings_Sensor[readIndex_Sensor];
	  // advance to the next position in the array:
	  readIndex_Sensor = readIndex_Sensor + 1;

	  // if we're at the end of the array...
	  if (readIndex_Sensor >= numReadings) {
	    // ...wrap around to the beginning:
		  readIndex_Sensor = 0;
	  }

	  average_Sensor = float(total_Sensor / float(numReadings));

	  Serial.print("Battery Voltage = ");Serial.println(average_Sensor,5);
	  delay(50);
}

float readSuppVol(){
  //https://code.google.com/archive/p/tinkerit/wikis/SecretVoltmeter.wiki
  //https://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/
  long result; // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));
  result = ADCL;
  result |= ADCH<<8;
  result = 1126400L / result; // Back-calculate AVcc in mV

  return result/1000.00;
}

Und hier der Output nach ca 200 Sampels:

Battery Voltage = 3.66333
Battery Voltage = 3.66352
Battery Voltage = 3.66362
Battery Voltage = 3.66357
Battery Voltage = 3.66327
Battery Voltage = 3.66340
Battery Voltage = 3.66345 
Battery Voltage = 3.66345
Battery Voltage = 3.66342
Battery Voltage = 3.66297
Battery Voltage = 3.66297
Battery Voltage = 3.66297
Battery Voltage = 3.66293

Wobei mein Multimeter 3.87V anzeigt.
Hat der Nano noch interne Pullups standartmäßig an ? Oder liegt es am BC337? Immoment ist es auf nem Breadboard wobei die jumper mx. 2Ohm haben.

Am Transistor sollte es nicht liegen, das UCEsat in diesem Betriebspunkt ca. bei 20mV liegt.

~~Vermutung 1: Deine Versorgungsspannung geht in die Messung mit ein. Stimmt die?~~edit: grad erst Code gelesen, du verwendest die interne Referenz
Vermutung 1: Deine Referenz ist zwar stabil, aber ungenau. Überprüfe mal, wo sie liegt.
Vermutung 2: Stimmen Nano und Multimeter bei anderen Messungen überein, oder ist dies eine prinzipielle Abweichung
Vermutung 3: Der AD erwartet eine Quelle <10k Impedanz, bei dir sind es 17k. Sollte noch kein Problem sein, aber mach mal an A0 einen Kerko 100nF, und warte zwischen Einschalten und Messung >20ms.
Vermutung 4: fließen über die Leitung mir der Arduino GND mit dem LIPO verbunden ist, noch andere Ströme? Am besten den Verbraucher und den Arduino jeweils mit eigener Leitung direkt am Akku anschliessen.

result = 1126400L / result; // Back-calculate AVcc in mV

wenn der µc wirklich 1,1V Reference hat, sollte das 1100mV * 1023 = 1125300 sein.
Wenn nicht kannst du hier den Offset ausgleichen.

Hallo

mal was anders. Hast du eine externe 4,096V Reference dran? Die Formel deutet darauf hin fehlt aber im Schaltplan. ???
Was sagt dein Messgerät am A0 Eingang?

.
3,85V / 119,95 * 98,3 = 3,155V
3,80 = 3,114V
3,75 = 3,073V
3,70 = 3,032V

Wenn ich mir das so anschaue bringt der Teiler gar nichts. Eigentlich kannste doch auf das ganze Gerassel von Teiler und Transistor komplett verzichten, wenn die externe Ref dran ist. Momentan reduziert der Teiler nur deine Auflösung die der interne A/D jedoch gut gebrauchen könnte.

wenn der µc wirklich 1,1V Reference hat, sollte das schon

1100mV * 1024 / result = 1126400L / result sein.

Wie kommst du auf 1023, ardubu ?
Idealerweise werden die 1.1V auf 1024 gleiche Intervalle aufgeteilt, so dass jedes Bit 1.074 mV entspricht. Alles unterhalb 1mV wäre 0 und alles ab 1099 mV würde dann theoretisch und idealerweise als 1023 gemeldet. Ab 1.1V würde dann die Begrenzung auf 10 bit (1023) greifen.

Aber das ist Theorie und die “Vref=1.1V” sind zwar relativ konstant, aber nur auf 10% genau beim atmega328 (Nano), also ein individuell einigermaßen konstanter Wert zwischen 1.0 und 1.2 Volt.

3.66 / 3.87 wären sogar innerhalb der 10 %

Ausserdem sind am durchgeschalteten BC337 sicher VCE = 0.2 V oder mehr. Hast du die mal gemessen?

Und wie genau ist dein R1 + R2 Spannungsteiler?

Eigentlich kannste doch auf das ganze Gerassel von Teiler und Transistor komplett verzichten

Sehe ich auch so.
Wenn du mal die 5V USB Versorgung nachmisst, oder schaust, wie genau der 5V Regler ( Bei 7 … 9V an Vin ) arbeitet, kriegst du sicher Werte, die einigermaßen exakt den Ladezustand deiner LiPos repräsentieren…

Danke an alle für die Anregungen. Der Nano wird derzeit noch durch klapperiges usb versorgt mit common ground zum Akku. Natürlich könnte ich das alles sein lassen aber das soll nachher auf einen Attiny85 weshalb der Teiler auf max 3,3 V bei 4,2 max Akku gerechnet ist. Beim BC337 fallen bei mir 0,037V ab die erklären aber auch nicht den Unterschied. Muss jetzt noch das mit der Impedanz von guntherb überprüfen und ansosnten schlag ich den fehlbetrag auf die 1,1 Ref auf.

Laut meinem Multimeter liegen am 5V pin sogar nur 4,535V an wobei bei meiner VCC-Funktion 4,54 - 4,56 rauskommt was also nahezu perfekt ist und im Idealfall sogar den Wert noch verbessert. Jetzt bin ich aber ratlos wo mir die 0,2V flöten gehen.

Hallo,

aha, Zielsystem ATtiny85 mit 3,3V Ub, dann macht der Teiler Sinn. Wofür der Transistor? Wenn der sperrt liegt die komplette Akkuspannung am µC Eingang an. Größer Ub! Wenn dann mit PNP - wenn es schaltbar sein muss.

Laut meiner Messung fließt aber kein Strom mehr vom Lipo wohingegen beim geschlossenen Transistor ein Strom von 31,6MikroAmp vom Lipo kommt. Also erfüllt seinen Zweck vom Stromsparen. (Nachher kommt ein PNP versprochen).

Doc_Arduino:
aha, Zielsystem ATtiny85 mit 3,3V Ub, dann macht der Teiler Sinn. Wofür der Transistor? Wenn der sperrt liegt die komplette Akkuspannung am µC Eingang an. Größer Ub! Wenn dann mit PNP - wenn es schaltbar sein muss.

janb14:
Laut meiner Messung fließt aber kein Strom mehr vom Lipo wohingegen beim geschlossenen Transistor ein Strom von 31,6MikroAmp vom Lipo kommt. Also erfüllt seinen Zweck vom Stromsparen. (Nachher kommt ein PNP versprochen).

Das passt schon, wenn auch wohl mehr aus Zufall:
3,3V am Contoller, + 0,7V Vorwärtsspannung der Schutzdiode = 4V (wohl eher 3,9V) ab denen Strom fließt.
Mit der LiPo Spannung haut es also grad noch so hin.

Hallo,

ich würde aber nie im Vorfeld die Schutzdiode darauf verwetten. Ich halte das schon für etwas fahrlässig.

OK ich denke ich hab mich dafür entschieden den Attiny85 komplett ohne Regler direkt von der Zelle zu betreiben, was laut Datenblatt kein problem sein sollt. So muss ich nur die VCC mit korrigierter Band-Gap-Referenz ermitteln und tada hab die Akkuspannung. Vorteil ich brauch keine extra Bauteile und die Genauigkeit sollte mit fallender Spannung immer weiter zunehmen.
Was meint ihr?

Edit: Ok hab jetzt die Referenzzeile auseinandergezogen und kalibriert:

result = long(1050L*1024L) / result; // Back-calculate AVcc in 1100mV * 1024

Bin auf den Wert 1,05 gekommen und es passt ziemlich gut.
Multimeter : 3.84V
Attiny85 : 3.8454V

Hallo,

das ist nicht nur gut, dass ist perfekt. Genauer gehts nicht. Den µC direkt mit dem Akku zu versorgen ist natürlich am Besten. Haste zudem keine Wandlerverluste. Und wenn er nicht ständig messen muss, kannste ihn zwischendurch schlafen legen. Damit verlängerste die Akkulaufzeit. Das noch so am Rande.

janb14:
OK ich denke ich hab mich dafür entschieden den Attiny85 komplett ohne Regler direkt von der Zelle zu betreiben, was laut Datenblatt kein problem sein sollt. So muss ich nur die VCC mit korrigierter Band-Gap-Referenz ermitteln und tada hab die Akkuspannung. Vorteil ich brauch keine extra Bauteile und die Genauigkeit sollte mit fallender Spannung immer weiter zunehmen.
Was meint ihr?

Edit: Ok hab jetzt die Referenzzeile auseinandergezogen und kalibriert:

result = long(1050L*1024L) / result; // Back-calculate AVcc in 1100mV * 1024

Bin auf den Wert 1,05 gekommen und es passt ziemlich gut.
Multimeter : 3.84V
Attiny85 : 3.8454V

Hat dein LiPo einen eingebauter Entladeschutz?
Wenn nein, doch noch so ein Schutzstrip am Akku löten, damit die Akkuspannung niemals unter die Mindestspannungs des LiPos kommt, sonst ist dein Akku nur noch Sondermüll!.

Der Spannungsteiler zum Messen der LiPo Spannung sollte -entgegen anderslautenden Aussagen hier- ziemlich hochohmig (ca.500k) sein, du willst ja nicht mehr Strom im Teiler verbrauchen, als der Attiny selbst braucht!
Dabei wird der Analogeingang ziemlich träge, muss man softwaremäßig im Sketch berücksichtigen.

Hi

Bei hochohmigem Spannungsteiler einen Kondensator am analogIn vorsehen, daß der interne S&H-Kondensator geladen werden kann (vom hochohmigen Spannungsteiler kommt dafür zu wenige Strom nach, Das muß der Kondensator liefern - da Dieser um Größenordnungen größer ist, als der S&H-Kondensator im µC ist, singt die Puffer-Spannung (nahezu) nicht dabei ein.

MfG

Hallo,

Jungs & Mädels, nur mal so, er benötigt keinen Spannungsteiler mehr ... bevor jetzt noch mehr Antworten in dieser Richtung kommen. :slight_smile:

Nochmal danke an alle aber wie gesagt verzichte ich auf den Teiler und auch den Transistor. Weniger ist manchmal mehr :slight_smile:
Ich benutze die LGDAS318650, welche laut Hersteller ein eingebauten Tiefenentladeschutz haben sollten. Ansonsten muss ich mir nochmal überlegen wie ich gegen Tiefenentladung schütze. Vllt kann ich die Brown-Out vom Attiny so setzen das er einfach nicht mehr angeht oder ich lass ihn nurnoch schlafen (Verbrauch ~0,3 microampere).

Ansonsten danke an alle und für die rege Beteiligung :slight_smile:

postmaster-ino:
Hi

Bei hochohmigem Spannungsteiler einen Kondensator am analogIn vorsehen, daß der interne S&H-Kondensator geladen werden kann (vom hochohmigen Spannungsteiler kommt dafür zu wenige Strom nach, Das muß der Kondensator liefern - da Dieser um Größenordnungen größer ist, als der S&H-Kondensator im µC ist, singt die Puffer-Spannung (nahezu) nicht dabei ein.

MfG

Wenn man sich mit der Messung Zeit nimmet, klappte es auch ohne Kondensator. Im Sketch einfach mehrmals hintereinander abrufen. Kann man so tun, wenn man nicht auf die Mikrosekunde angewiesen ist.