Go Down

Topic: Volt der aktiven Stromversorgung von Adafruit Trinket messen? (Read 1 time) previous topic - next topic

Guppinator

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 ;)
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:

Code: [Select]
/*--------------------------------------------------------------
  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


Serenifly

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.

Guppinator

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.

Serenifly

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"

agmue

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.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

uwefed

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

Serenifly

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

Code: [Select]

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

uwefed


Guppinator

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.

agmue

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?
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Guppinator

Achso, ich habe das 5V Trinket:
https://www.adafruit.com/products/1501

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

Serenifly

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()

Guppinator

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.

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 :D 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 :)
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?

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.

Go Up