Volt der aktiven Stromversorgung von Adafruit Trinket messen?

Hi,

ich habe mir kürzlich ein 5V Trinket von Adafruit besorgt und wollte damit ein recht kleines Projekt mit machen.
Die wichtigste Funktion ist für mich momentan:
Volt der eigenen Stromversorgung auslesen die hier mit zwei 3V Knopfzellen erfolgt. Angezeigt werden soll der Ladestatus später per RGB-LED, was hier für euch aber recht uninteressant sein sollte :wink:
Auf meinem Breadboard habe ich einen Spannungsteiler mit 2x 10k Widerständen gebaut, und die Werte im Code durch Messungen mit einem Multimeter kalibriert.
Das mit dem Ablesen der Stromversorgung habe ich anfangs mit meinem Arduino UNO über den Serial getestet, was wunderbar funktionierte:

/*--------------------------------------------------------------
  Program:      volt_measure

  Description:  Reads value on analog input A2 and calculates
                the voltage assuming that a voltage divider
                network on the pin divides by 11.
  
  Hardware:     Arduino Uno with voltage divider on A2.
                
  Software:     Developed using Arduino 1.0.5 software
                Should be compatible with Arduino 1.0 +

  Date:         22 May 2013
 
  Author:       W.A. Smith, http://startingelectronics.org
--------------------------------------------------------------*/

// number of analog samples to take per reading
#define NUM_SAMPLES 10

int sum = 0;                    // sum of samples taken
unsigned char sample_count = 0; // current sample number
float voltage = 0.0;            // calculated voltage

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

void loop()
{
    // take a number of analog samples and add them up
    while (sample_count < NUM_SAMPLES) {
        sum += analogRead(A0);
        sample_count++;
        delay(10);
    }
    // calculate the voltage
    // use 5.0 for a 5.0V ADC reference voltage
    // 5.015V is the calibrated reference voltage
    voltage = ((float)sum / (float)NUM_SAMPLES * 5.01) / 1024.0;
    // send voltage for display on Serial Monitor
    // voltage multiplied by 11 when using voltage divider that
    // divides by 11. 11.132 is the calibrated voltage divide
    // value
    Serial.print(voltage * 2.03);
    Serial.println (" V");
    sample_count = 0;
    sum = 0;
}

Später fand ich dann heraus, dass es nicht so einfach ist die eigene aktive Stromversorgung des Trinkets zu messen. Gibt es da generell eine Möglichkeit dieses Problem mit dem Trinket zu lösen?
(Anbei noch eine Zeichnung meines Aufbaus)

Vielen Dank und liebe Grüße,
Alvaro

Die 5V nach dem Spannungsregler kann man ohne externe Beschaltung messen, wenn dir das reicht:

http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/

Dabei misst man die interne 1.1V Referenz mit den 5V als Referenzspannung und rechnet dann auf die Referenzspannung zurück.

Vielen Dank für die schnelle Antwort! Den Link habe ich mir auch schon angesehen, aber es scheint ja schon recht unzuverlässig und auch ungenau zu sein... Ich bräuchte für mein Vorhaben jedoch eine genaue und zuverlässige Lösung.

Das hängt letztlich von der Genauigkeit der internen Referenz ab. Die hat eine relativ hohe Toleranz, aber da ist auch ein Korrekturfaktor dabei. Siehe der Abschnitt "Improving Accuracy"

Wenn ich es richtig verstehe, bezieht sich die Toleranz auf mehrere Arduinos. Wenn Du also eine Massenprodukltion vor hast, wäre das ungünstig. Bezogen auf einen Arduino ist ein einmaliges Kalibrieren notwendig, danach sollten die Werte hinreichend genau sein. Eine kleine Meßreihe mit Veränderung anderer Parameter (Temperatur) könnte darüber Aufschluß geben.

Hast Du einen Trinket mit ATtiny85 oder einen Trinket PRO mit ATmega328?

Das oben gesagte gilt für den ATmega328. Ich weiß nicht ob es die gleiche Funktion im ATtiny85 gibt.

Die 1,1V haben eine relativ große Tolleranz (ca 10%) aber die Spannung ist stabil, daß heißt wenn Du mal weißt welche Spannung die 1,1V sind ( zB 1,2V) dann kannst Du mit diesem Referenzwert ziemlich genau messen.

Du kannst Aber ein externe Spannung zb einer Z-Diode oder besser einer Spannungsreferenz mit niedrigem Stromverbrauch (weiß Dir aber auf die schnelle keien nennen) am analogen Eingeng messen und daraus die Referenzspannung sprich Spannungsversorgung errechenen.

Ach nochwas. Die Neopixel funktionieren nicht mit 3V. Sie brauchen mindestens 3,5V ansonsten gibt es sehr wenig blaues Licht.

Grüße Uwe

uwefed:
Das oben gesagte gilt für den ATmega328. Ich weiß nicht ob es die gleiche Funktion im ATtiny85 gibt.

Schau dir den Code an. Der berücksichtigt mehrere AVR und ATtiny Prozessoren

#elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)

o0k, Habt mich überzeugt.
Grüße Uwe

Super, das hilft mir hier auf jeden Fall alles schonmal weiter! Ich werde mich gleich mal dran setzen und das mit der 1,1V Referenz ausprobieren. Eine Frage habe ich aber noch: Ab wann sollte ich mit der LED signalisieren, dass jetzt die Batterie gewechselt werden sollte - sprich bis wann kann man eine zuverlässige Nutzung gewähren? Final wären am Trinket später nur zwei einzelne RGB LED's von Adafruit angeschlossen und es würde z.B. jede Sekunde eine kleine Zahl per digital Pin übermittelt werden.

Wenn ich im Datenblatt in die Grafik "Output Voltage vs. Input Voltage" schaue, muß die Eingangsspannung 10% über der Ausgangsspannung liegen. Aber Du hast Uwes Frage noch nicht beantwortet, welchen Trinket Du hast: 3,3V, 5V oder Pro?

Achso, ich habe das 5V Trinket:

Noch Fragen bevor Du eine sinnvolle Antwort bekommst:

Welche Batterie willst Du verwenden und sollen die LEDs immer eingescheltet sein oder nur manchemal?
Ich wiederhole noch mal die NEO-Pixel funktionieren nicht mit 3V.

Grüße Uwe

agmue:
muß die Eingangsspannung 10% über der Ausgangsspannung liegen.

Allerdings hast du bei der Art der Messung nur die Ausgangsspannung und die ist idealerweise immer 5V solange die Eingangsspannung hoch genug ist. Sie sollte allerdings sinken, wenn die Eingangsspannung niedriger wird als "5V + Spannung die am Regler abfällt". Wenn die Spannung der Batterie soweit absinken kann, sollte man das feststellen können.

Wenn man doch die Batteriespannung direkt messen muss dann muss man sie per Spannungsteiler auf maximal 1,1V runter-teilen und dann statt den 5V die 1,1V als Referenz nehmen. Per analogReference()

uwefed:
Noch Fragen bevor Du eine sinnvolle Antwort bekommst:

Welche Batterie willst Du verwenden und sollen die LEDs immer eingescheltet sein oder nur manchemal?
Ich wiederhole noch mal die NEO-Pixel funktionieren nicht mit 3V.

Grüße Uwe

Ich wollte Knopfzellen benutzen, da diese kompakter und damit für mein Vorhaben besser geeignet sind. Zur Zeit benutze ich hier 2x CR2016.
Die LED's werden später nicht durchgehend am leuchten sein.

Serenifly:
Allerdings hast du bei der Art der Messung nur die Ausgangsspannung und die ist idealerweise immer 5V solange die Eingangsspannung hoch genug ist. Sie sollte allerdings sinken, wenn die Eingangsspannung niedriger wird als "5V + Spannung die am Regler abfällt". Wenn die Spannung der Batterie soweit absinken kann, sollte man das feststellen können.

Wenn man doch die Batteriespannung direkt messen muss dann muss man sie per Spannungsteiler auf maximal 1,1V runter-teilen und dann statt den 5V die 1,1V als Referenz nehmen. Per analogReference()

Entschuldige die Frage, ich kenne mich da jetzt noch nicht so gut aus :smiley: Aber ich habe ja momentan auch einen Spannungsteiler der die 6V auf 3V teilt. Was macht das dann genau für einen Unterschied wenn ich auf 1,1V runter-teile? Ich verstehe noch nicht so genau den Zusammenhang :slight_smile:
Und klar, solange die Batterie >5V ist werde ich wahrscheinlich nur max. 5V messen können, aber unter 5V werde ich dann wahrscheinlich die korrekten Ladung der Batterie auslesen können wenn ich das richtig verstehe?

Der Punkt ist, dass du für die Messung der Batteriespannung vielleicht nicht die 5V nehmen solltest, die aus der Batteriespannung erzeugt werden.

Und um das klar zu stellen:
Was ich in #Reply 1 gepostet habe misst die 5V nach dem Spannungsregler. Es kann sein dass das ausreicht. Eventuell kannst du da feststellen wenn die Spannung zu weit absinkt. Du hast dann nicht die Spannung der Batterie. Aber eventuell merkst du ob die Spannung zu weit abgesunken ist um die 5V richtig zu erzeugen. Aber keine Ahnung ob das wirklich so zuverlässig geht.

Bei dem was ich in #12 gepostet habe geht es darum die Spannung vor dem Regler an der Batterie zu messen. Also was du auch am Anfang gemacht hast. Aber mit 1,1V als Referenz. Nicht mit den 5V, die nicht stabil sind. Da muss man im Code lediglich einen Faktor anpassen.

Serenifly:
Der Punkt ist, dass du für die Messung der Batteriespannung vielleicht nicht die 5V nehmen solltest, die aus der Batteriespannung erzeugt werden.

Und um das klar zu stellen:
Was ich in #Reply 1 gepostet habe misst die 5V nach dem Spannungsregler. Es kann sein dass das ausreicht. Eventuell kannst du da feststellen wenn die Spannung zu weit absinkt. Du hast dann nicht die Spannung der Batterie. Aber eventuell merkst du ob die Spannung zu weit abgesunken ist um die 5V richtig zu erzeugen. Aber keine Ahnung ob das wirklich so zuverlässig geht.

Bei dem was ich in #12 gepostet habe geht es darum die Spannung vor dem Regler an der Batterie zu messen. Also was du auch am Anfang gemacht hast. Aber mit 1,1V als Referenz. Nicht mit den 5V, die nicht stabil sind. Da muss man im Code lediglich einen Faktor anpassen.

Wenn ich das jetzt richtig verstanden habe, dann müsste ich den Aufbau wie oben in meiner Skizze machen, dann aber (sagen wir es würde die Widerstände geben) 16.333 Ohm und 3666 Ohm Widerstände nehmen um von 6V auf 1,1V zu teilen und die analogReference am Arduino auch auf 1,1V umstellen. Richtig? :smiley:
Liebe Grüße

Mir schwirrt eine Idee durch den Kopf:

Bei UBAT > 5,5 V ist der Meßwert für die Referenz 1023*1,1/5 = 225. Bei UBAT < 5,5 V müßte der Meßwert dann größer 225 werden.

Stimmt das oder Denkfehler?

Ach DU nimmst 2 Li Batterien.
Das Datenblatt zB: http://data.energizer.com/PDFs/cr2016.pdf nennt als Kapazität der Batterie 90mAh bei einer Entladung von 0,1mA bei 21°C und Entladeschlußspannung 2,0V.

Laut Diagramm "Discharge Characteristics on pulse load" auf Seite 2 von http://www.sony.net/Products/MicroBattery/cr/pdf/cr2016.pdf errechnet sich der Innenwiderstand der Batterie bei 23°C: 2,6V bei 100Ohm Last (30mA) auf 16 Ohm die bei -10°C dann 50 Ohm wird.

Wenn Du ein 2 RGB-Led weiß leuchten läßt (120 mA oder 41Ohm bei 5V) dann fällt die Batteriespannung sehr stark ab. Schätzungsweise auf 1,6V

Die CR2016 ist für diese Anwendung unterdimensioniert.

Grüße Uwe

uwefed:
Ach DU nimmst 2 Li Batterien.
Das Datenblatt zB: http://data.energizer.com/PDFs/cr2016.pdf nennt als Kapazität der Batterie 90mAh bei einer Entladung von 0,1mA bei 21°C und Entladeschlußspannung 2,0V.

Laut Diagramm "Discharge Characteristics on pulse load" auf Seite 2 von http://www.sony.net/Products/MicroBattery/cr/pdf/cr2016.pdf errechnet sich der Innenwiderstand der Batterie bei 23°C: 2,6V bei 100Ohm Last (30mA) auf 16 Ohm die bei -10°C dann 50 Ohm wird.

Wenn Du ein 2 RGB-Led weiß leuchten läßt (120 mA oder 41Ohm bei 5V) dann fällt die Batteriespannung sehr stark ab. Schätzungsweise auf 1,6V

Die CR2016 ist für diese Anwendung unterdimensioniert.

Grüße Uwe

Danke Uwe für die Antwort! Würdest du generell von zwei Knopfzellen abraten, oder würdest du mir eher empfehlen zu einer anderen zu wechseln, und wenn, hättest spontan eine Idee für eine passende Knopfzelle?
Wie gesagt, ich komme leider nicht aus dem Elektrobereich, kann noch nicht so viel mit den ganzen Daten anfangen, versuche aber alles so langsam zu verstehen, da ich in nächster Zeit viel in diesem Bereich machen muss.

Liebe Grüße :slight_smile:

Dazu mußt Du uns mal sagen wie das Projekt funktionieren soll und wie lange die Batterien halten sollen.
Grüße Uwe