PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : NiboBee Spannungsmessung mit Hindernis?



Rabenauge
29.04.2010, 16:23
Halöle.
Nachdem mein Leuchtdioden-Gebastel nun inzwischen ja doch funktioniert, möchte ich wieder mal den Lötkolben schwingen.

Ich hatte schonmal wo anders deswegen angefragt, wie ich denn bei _meiner_ Biene die Akkuspannung messen kann.
workwind antwortete darauf, ich solle mir R43/44 mal ansehen und R44 gegen nen 100k austauschen, dann könne man da ganz leicht Spannungen bis 15V messen.
Toll.
Erinnern wir uns: meine Biene wird mit einem LiPo gefüttert, es ist ein 2s, der ja 7.4V bereitstellt. Danach kommt ein Spannungsregler,d er bienenverträgliche 5V draus macht, das heisst, die 7.4V kommen _nirgends_ am Board an.
Dennoch verfehlt das Ganze seinen Zweck, wenn ich an den 5V nun herum messe, denn die habe ich auch dann noch, wenn der LiPo bereits klinisch tot ist. Das passiert deutlich über 5V!
Nun will ich aber eben das verhindern. Also workwinds Tip mal beiseite genommen, Durchgangsprüfer her, Schaltplan und *grübelgrübel

Wenn ich alles richtig kapiert habe, dann kann ich folgendes tun (das Bild ist das betreffende Stück aus dem original-Schaltplan mit den Änderungen, die mich meine, vornehmen zu müssen).

http://img443.imageshack.us/img443/4238/umbauspannungsmesserbie.jpg (http://img443.imageshack.us/i/umbauspannungsmesserbie.jpg/)

Ist das so richtig?
Verliere ich dadurch irgendeine andere Funktion? Auf die, die tatsächliche Bordspannung zu ermitteln, kann ich gut verzichten. ;)

radbruch
29.04.2010, 18:16
Hallo

Das würde schon gut hinhauen: 7,4V/147k*100k ergibt ca. 5,03V. Aber (war ja klar;) werden die Lipos nicht bis weit über 8V geladen? Das wäre dann nämlich übel, denn soweit ich weiß, darf die Spannung am ADC-Pin die Versorgungsspannung (oder war's die Referenzspannung?) nicht überschreiten. Vorsichtshalber, man kann es ja später noch ändern, würde ich als R44 einen 68k-Widerstand vorschlagen. Das ergäbe bei 8,5V Lipospannung am ADC auch ungefährliche 8,5V/(68+47)*68=5,03V

Gruß

mic

Rabenauge
29.04.2010, 18:40
Hab eben bemerkt: ich hab nen Fehler drin: ](*,)


Du kannst einfach den R43 auslöten und durch einen 100 kOhm Widerstand ersetzen, den Du direkt an den Akku anschliesst.
Damit lässt sich eine Spannung von bis zu 15 V messen. Guck Dir einfach mal den Spannungsteiler aus R43 und R44 an ...

Damit dürfte der Spannungsabfall doch schon grösser sein, richtig?
Jedenfalls, soweit ich das mit den Spannungsteilern noch irgendwo im Hinterkopf habe.

Und ja, Ladeschlusspannung bei LiPo`s ist 4.2V pro Zelle.

radbruch
29.04.2010, 19:01
Hallo

Der "Fehler" liegt wohl in der Referenzspannung. Für ein System mit ungeregelter Spannung verwendet man die interne 2,56V-Referenz. Deshalb wird in der orginalen Schaltung die Akkuspannung durch R43/R44 (47k/47k) halbiert.

Deine Biene kann aber die stabilisierte Spannung des Reglers als Referenz verwenden, deshalb darf der Spannungsteiler auf 5V am ADC-Pin abgestimmt sein. So erklärt sich auch das "Damit lässt sich eine Spannung von bis zu 15 V messen." 15V/147k*47k=4,8V ;)

Gruß

mic

Rabenauge
30.04.2010, 17:20
Gut.
Nun möchte ich das Ganz softwareseitig natürlich auch nutzen.
Und wie immer: ich hab keinen Plan. [-(

Vorerst möchte ich es ohne Umbau versuchen, indem ich am entsprechenden Pin einfach die Bordspannung messe.
Dürfte dann später ja nur ein anderes Ergebnis herauskommen, oder?

Ich las schon, dass in der NiboBee-Bibliothek dazu was vorhanden sein soll, aber diese Bibliothek ist nach wir vor für mich eins der vielen, böhmischen Dörfer.
Immerhin habe ich ein Makro gefunden:
#define AN_VBAT 4
Fein, da gibts also doch irgendwas.
Da ich mehr oder weniger im dunklen tappe habe ichs so versucht:

volt=analog_getValue(AN_VBAT/100); // durch Hundert weil ich sonst immer bei 512 lande

volt ist uint16_t.
Nun bekomme ich als Ausgabe eine 171.
Wusste gar nicht, dass die Biene so hohe Spannungen verträgt... :-b
Was mache ich immer noch verkehrt?

radbruch
30.04.2010, 17:49
Ne, ne, ne, so geht's nun aber nicht :)

Die Funktion analog_getValue() erwartet als Parameter die Nummer des ADC-Kanals. Die VBAT wird mit Kanal 4 (das ist Pin 36 ADC4 oder PA4) gemessen, deshalb ist AN_VBAT mit 4 definiert. Du übergibst aber als Parameter 4/100...

Ein prima Grundlagenprojekt von Skroete zur Messung der Batteriespannung bei der Biene findest du hier:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=51863

Dort wird auch erklärt, warum man für die Batteriemessung bei Versorgung ohne Spannungsregler die interne Referenz verwenden sollte.

Gruß

mic

Rabenauge
30.04.2010, 22:06
Ich wusste dass da was nicht hinaut. [-(

Wenn ich es richtig mache erhalte ich Werte um die 512, 513, in der Gegend.
Was auch immer die mir Sagen, die Bordspannung beträgt eiserne (da geregelte) 5V.

Jetzt habe ich das Programmstück von Skroete auch mal probiert, das liefert mir Werte um die 992 herum zurück.
Und: ich gebe zu, dass ich _davon_ 80% _nicht_ verstehe.

Und nu? Irgendwie ist beides nicht ganz das, was ich haben möchte.

radbruch
30.04.2010, 22:53
Hallo

Das passt doch gut. Werte um 512 waren mit der Funktion aus der Lib zu erwarten, denn da die zu messende Spannung zugleich die Referenz ist, wird durch R43 und R44 die halbe Bordspannung gemessen. Natürlich unabhänig von Ladezustand der Akkus...

Das Programm von Skroete verwendet die interne 2,56V-Referenz. Bei 992 beträgt die gemessene Spannung 2,56V/1023*992=2,48V Da dies die halbe Bordspannung ist liefert dein Regler 4,96V, inklusive der Toleranz von R43/44.

Für deine Anwendung würde aber die Funktion der Lib ausreichen, da bei dir der Kontroller ja am Spannungsregler hängt und deshalb die Referenz ziemlich genau 5V beträgt. Für deine zwei Lipos würde sich dann auch der schon oben berechnete 68k-Widerstand als Ersatz für R44 anbieten. Lipo bitte erst anschliesen wenn der Widerstand angepasst wurde!

Gruß

mic

Rabenauge
30.04.2010, 23:22
Hm, klingt gut (probiere ich _nach_ dem aufstehen erst).
Was mich noch interessiert ist, woher diese Formel (2,56V/1023*992=2,48V ) eigentlich kommt . Sie halbe Spannung wegen den Widerständen?

Es geht mir echt weniger drum, irgendeine _fertige, funktionierende_ Lösung zu haben, sondern ich möchte echt verstehen, wie`s gemacht wird.
Dadurch,dass ich nun aber funktionierende Lösungen habe, kann ich dann mit meiner Eigenkreation vergleichen.
Schlussendlich will ich in jedem Programm ein Unterprogramm einbauen, dass von Zeit zu Zeit den Akku mal checkt und rechtzeitig Alarm schlägt, wenn er zur Neige geht. Durch die Spannungsstabilisierung und die Tatsache, dass _meine_ LiPos (SLS ZX) eine durchgehend recht hohe Spannungslage haben, merke ich im Betrieb nämlich nix, wenn er anfängt, nachzulassen.
Und wenn man mal munter am spielen ist, ist die Biene schonmal etliche Stunden am Stück an.

radbruch
30.04.2010, 23:58
Die Formel kommt so zustande:

Der ADC hat eine Auflösung von 10 Bit, er kann eine Spannung in 1023 Schritten digitalisieren. Wenn die gemessene Spannung gleich der Referenzspannung ist, erhält man als Messwert 1023, der Rest ist Dreisatz:

Referenz/1023 ist gleich gesuchte Spannung/gemessener Wert oder
Referenz/1023*Messwert=gesuchte Spannung

Die Widerstände bilden einen Spannungsteiler und sind so ausgewähkt, dass am Messeingang nie eine Spannung anliegt die größer als die Referenz ist:
http://www.rn-wissen.de/index.php/ADC_(Avr)#Referenzspannung
http://www.mikrocontroller.net/articles/AVR_Tutorial:_ADC (http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC)

Gruß

mic

Rabenauge
01.05.2010, 10:30
Hm, wenn ichs nun richtig kapiert habe, sollte ich die externe Referenz (also die Methode der Bibliothek) verwenden, weil die Referenzspannung nicht niedriger als der Messwert sein soll.
Das klappt bei der internen zwar, wird aber knapp.
Also die Bibiotheken-Methode.
Bisher hab ich noch nichts umgebaut, noch versuche ich, das Ergebnis _sinnvoll_ zu visualisieren.
Die 512 hat ja _noch_ nichts mit der tatsächlichen Spannung zu tun, sondern ist lediglich der Wert, der vom ADC (ich hasse das, früher sagte man Wandler, nach AD-Wandler hab ich nämlich gesucht ;) ) geliefert wird.
Das heisst, ich muss nun 5(V,Referenz)/1024*Messwert rechnen.
Das Ganze mal zwei (@Spannungsteiler) und habe die richtige Spannung?

Wenn dem so ist, liegt nun das nächste Problem vor mir: das Display ist am I2C und weigert sich ganz offenbar, eine Fliesskommazahl auszugeben.
Ich habe (sonst wird das berechnen nicht klappen, oder?) "Messwert" als double deklariert (bei float gibts eine Compilerwarnung), wenn ich schreibe

printf("%f",volt);
)
Das ergibt, als Ausgabe 0.

Schreibe ich es so:
volt_mess=analog_getValue(4);

volt= (5/1023*volt_mess)*2;
lcd_setCursor(1,1);
printf("%f",volt);

(volt_mess ist hier der Wert vom ADC als int16_t und volt ist ein double, damit ich mit Kommastellen rechnen kann) kommt offenbar irgendwas überhaupt nicht mit, es wird ein Fragezeichen ausgegeben.
Toll, _das_ hab ich auch im Gesicht.

Per Taschenrechner funktioniert es, aber die Biene scheint genauso verwirrt wie ich zu sein.
Ich weiss, für spätere Programme, in denen einfach nur Alarm geschlagen werden soll, wenn die Spannung einen bestimmten Wert unterschreitet, ist das relativ unerheblich, aber so lerne ich gleich noch was.

radbruch
01.05.2010, 13:18
Hallo

Das Ausrechnen ist eigentlich eine neue Aufgabe;)

Bei 5/1023 bleibt immer nur 0 als Ergebniss übrig, weil wir ja Integerrechen. Wenn man die Formel passend umstellt, erhält man mit

5V*Messwert/1023=gesuchte Spannung

zumindest ein ausreichend genaues Ergebniss. Das funktioniert, weil der Messwert nie über 1023 sein wird und 5*1023=5115 locker in eine 16Bit-Variable passt.

Grundsätzlich kannst du auch mit den orginalen R43/44 brauchbare Messungen anstellen. Dazu muss lediglich, wie du oben schon geplant hast, R43 anstatt nach Vcc nach VLipo gehen. Bei 8,4V Lipospannung sollte mit der Lib-Funktion ein Messwert von 1023*4,2V/5V=859, für 7,2V entsprechend 1023*3,6V/5V=737 ermittelt werden können. Das sollte eigentlich so passen, die Gegenprobe: Die Differenz der Messwerte beträgt 859-737=122, das entspricht 5V*122/1023*2=1,2V;)

Zur Anzeige auf dem LCD: Da ich finde, ein Mikrokontroller fühlt sich nur beim Integerrechnen richtig wohl, würde ich vielleicht so ansetzen: Bei Messwert 737 z.B. errechnen sich die Volt etwa so:

Ganzevolt=2*5V*737/1023
Zehntelvolt=2*5V*737/102-10*Ganzevolt

Ganzevolt=7
Zehntelvolt=72-70=2

Mein RP6 (mit Mega32) zeigt damit

vt100_set_cursor(5,1);
uint16_t GanzeVolt=10*737/1023;
writeChar(GanzeVolt+'0');
writeChar(',');
writeChar(10*737/102-10*GanzeVolt+'0');
writeChar('V');

vt100_set_cursor(6,1);
GanzeVolt=10*859/1023;
writeChar(GanzeVolt+'0');
writeChar(',');
writeChar(10*859/102-10*GanzeVolt+'0');
writeChar('V');


7,2V
8,4V

an :)

Gruß

mic

Rabenauge
02.05.2010, 10:56
Grundsätzlich kannst du auch mit den orginalen R43/44 brauchbare Messungen anstellen. Dazu muss lediglich, wie du oben schon geplant hast, R43 anstatt nach Vcc nach VLipo gehen. Bei 8,4V Lipospannung sollte mit der Lib-Funktion ein Messwert von 1023*4,2V/5V=859, für 7,2V entsprechend 1023*3,6V/5V=737 ermittelt werden können. Das sollte eigentlich so passen, die Gegenprobe: Die Differenz der Messwerte beträgt 859-737=122, das entspricht 5V*122/1023*2=1,2V;)



Ja, das klappt nur, wenn ich die Bordspannung als Referenz benutze, richtig?
Hatte ich auch schon vermutet.

Was die Rechnerei angeht: wenn ich _einen_ Wunsch an die Zukunft habe, dann diesen (nach reichwerden usw.): EIN Zahlensystem für alle. \:D/

Hab schon befürchtet, dass ich nicht drum herum kommen werde, das Ergebnis in Vor- und Nachkommastellen aufzuteilen.
Ich hab`s mal schnell umgesetzt und erhalte als Ausgabe brav 5.0V angezeigt nun.
Da die Spannungsstabilisierung artig 5.05V abdrückt, haut das so hin.

Im Moment (da Testbetrieb) läuft das Programm noch als Schleife und misst einmal pro Sekunde, nun werde ichs mal umstricken, dass mittels Timer alle paar Sekunden gemessen wird, und somit die meiste Zeit für andere Dinge zur Verfügung steht, ich will das Ganze ja später in jedes Programm einbauen, als kleines Unterprogramm, was timergesteuert per ISR ab und an aufgerufen wird.

BirgerT
02.05.2010, 12:09
Schon mal einen Blick auf die Lib von s.frings geworfen? https://www.roboternetz.de/phpBB2/viewtopic.php?t=53543&sid=fcd35271d21d492d8ea503f51dfcaea3

Mir gefällt die Lösung der Spannungskontrolle, und ich finde sie ausreichend. Spannungsteiler (schon dimensioniert?) und Grenzwerte im Programm einstellen.

Und reich werden geht am besten so: Flasche Wein für 3 Euro kaufen und für 6 wieder verkaufen. Von den 3% kann man prima leben... :-s

Rabenauge
02.05.2010, 14:32
Ehrlich gesagt: nein.
Ich bin froh, dass ich mit der Nicai-Bibliothek weitgehend klarkomme für den Moment.
Deshalb möchte ich auch nicht wechseln, allerdings werd ich sie mir _irgendwann_ ganz sicher ansehen.

So, nun habe ich umbebaut: R43 an einem Ende rausgelöter (das Ende, was normal an + liegt natürlich) und mittels nem kleinen Kabel mit dem Balancerstecker meines Akkus verbunden.
Da der so beschaltet ist, dass er einen Abgriff in der Mitte und den anderen quasi am Ende hat, liegt dort die volle Akkuspannung an.
Es funktioniert: aktuell zeigt mir das Bienchen brave 7.9Volt an, in Wirklichkeit liegen (laut Multimeter) 7.78V an, ich schätze, die kleine Differenz ergibt sich aus den Bauteiltoleranzen.
Kann man mit leben, meine ich, vielleicht, wenn ich irgendwann Lust habe, messe ich da mal genauer und wenn die Abweichung immer gleich ist, kann man den winzigen Fehler ja herausrechnen.

radbruch
02.05.2010, 15:12
Hallo

Prima. Die "Bauteiletoleranzen" kannst du bei Bedarf ja noch "rausrechnen" wenn du es mit dem Multimeter kalibrierst. (Welche Spannung kannst du eigentlich an AVCC (Pin30) oder AREF (Pin32) messen?) Aber mir scheint das Ergebniss so völlig ausreichend. Glückwunsch :)


Schon mal einen Blick auf die Lib von s.frings geworfen?Dieser Blick bringt keine Änderung weil auch in dieser Lib die Bordspannung als Referenz für die Messung der Bordspannung verwendet wird:


// Initialize the ADC
// Enable ADC in single conversion mode with 117khz clock rate (F_CPU/128)
// Which defines a performance of approx. 1000 samples/sec each of the 16 channels
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) | (1<<ADIE) | (1<<ADSC);
// Use AVCC as reference
ADMUX = REF_VCC;
(Aus der Funktion nibobee_init() (https://www.roboternetz.de/phpBB2/viewtopic.php?p=494774#494774))

Da die Lipobiene einen Spannungsregler an Bord hat funktionieren alle Ansätze mit 5V-Referenz. Messung der Bordspannung bei einer Standartbiene mit interner 2,56V-Referenz:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=51863

Gruß

mic

Rabenauge
02.05.2010, 23:29
Sodele. Schnell noch ein bisschenwas drum herum gebastelt und


// Spannungswächter Lithium-Biene
// ****** by Rabenauge ******
// Misst die aktuelle Bordspannung und gibt sie auf Zehntel Volt genau auf Display aus
// Diese Messung wird alle zwei Sekunden wiederholt,
// ausserdem wird nach rund einer Minute die Displaybeleuchtung ausgeschaltet, kann aber
// mit dem linken Fühler nach hinten jederzeit wieder für eine Minute eingeschalten werden
// Als Demo blinken die beiden gelben LED`s abwechselnd im Sekundentakt, nur, damit _irgend-
// was_ getan wird.
// Unterschreitet die Akkuspannung einen bestimmten Wert (konkret 6.5V), wird die Display-
// beleuchtung eingeschalten, ein Achtungssignal ausgegeben und die beiden roten LED
// eingeschalten.
// Alles läuft Timergesteuert, über Timer 0, die delay()-Funktion wird nicht benötigt
// HINWEIS: das Programm ist ausgelegt auf NiboBee mit 2s LiPo als Stromversorgung, die
// per Spannungsstabilisierung auf 5V gebracht wird, es wird aber die tatsächliche Akku-
// Spannung gemessen. Da die bei Standard-NiboBee`s gleich der Bordspannung ist, wird die
// Messung dann _so_ nichts bringen, da die 5V als Referenz benutzt werden!


#include <nibobee/iodefs.h>
#include <nibobee/i2cmaster.h>
#include <nibobee/lcdi2c.h>
#include <nibobee/led.h>
#include <nibobee/analog.h>
#include <nibobee/sens.h>
#include <stdio.h>

//------------------------------------------- Variablen & Co ----------------------------

uint16_t volt=0;
uint16_t volt_zehntel=0;
uint16_t volt_mess=0;
int16_t count_backLight=0;
int8_t count=0;
//----------------------------------------- Spannungsüberwachung ------------------------

int Batterie(void)
{
volt_mess=analog_getValue(4); // Analogeingang 4 abfragen
volt= 10*volt_mess/1023; // Ganzevolt=2*5V*737/1023
volt_zehntel= 10*volt_mess/102-10*volt; // Zehntelvolt=2*5V*737/102-10*Ganzevolt
lcd_setCursor(3,1); // Messwert ausgeben
printf(" %1d",volt);
printf(".");
printf("%1d",volt_zehntel);
printf(" Volt");
if (volt==6&&volt_zehntel<5) // Falls Spannung zu niedrig wird (unter 6.5V)
{
lcd_setBacklight(0); // Licht an
lcd_setCursor(7,2); // Alarm schlagen
printf(" ACHTUNG");
led_set(LED_L_RD,1);
led_set(LED_R_RD,1);
count_backLight=0;
}


return 0;
}
//------------------------------------ Beleuchtung aus/Stromsparmode --------------------

int Beleuchtung(void) //Unterprogramm Displaybeleuchtung
{ //schaltet nach ca.1Minute die Display-
if(count_backLight > 60*57) //Beleuchtung ab
{
lcd_setBacklight(1);
}
return 0;
}
//------------------------------------ Hauptprogramm ------------------------------------

int main(void)
{
TCCR0 = (1<<CS02)| (1<<CS00); // Normal Mode, kein OC0-Pin, prescaler /1024
TIMSK |= (1<<TOIE0); // Timer0 Overflow-Interrupt erlauben
i2c_init(); // I2C initialisieren
lcd_init(0x27); // LCD initialisieren, Adresse festlegen
analog_init(); // Analogeingänge initialisieren
led_init(); // LED`s initialisieren
set_output_group(IO_SENS); // Pull-ups aktivieren
enable_interrupts(); // Interrupts einschalten
lcd_setBacklight(0); // Licht an
lcd_setCursor(1,0);
printf(" Bordspannung"); // Programmname
lcd_setCursor(0,2);
printf("<<Licht");

while(1)
{
enable_interrupts();
int8_t status_L = sens_getLeft();
if(status_L < 0) //mit linkem Fühler nach hinten
{ //Licht wieder anmachen
lcd_setBacklight(0);
count_backLight=0;
}
if(count == 57) // nach 1 Sekunde
{
led_set(LED_R_YE,1); // LED an
led_set(LED_L_YE,0); // andere aus
Batterie(); // Akkuspannung messen
}
if(count > 2*57) // nach 2 Sekunden
{
led_set(LED_R_YE,0); // LED aus
led_set(LED_L_YE,1); // andere an
Beleuchtung(); // Licht aus?
count=0; // Sekundentimer zurücksetzen
}
}
return 0;
}
//--------------------------------- Timer-ISR -------------------------------------------

ISR(TIMER0_OVF_vect)
{
count++; // fürs blinken
count_backLight++; // für HG-Licht ausschalten
}
//----------------------------------- ENDE ----------------------------------------------


Das Programm spielt mit den Leuchtdioden, und gibt alle zwei Sekunden die aktuelle Akkuspannung aus.
Ausserdem wird ein "Alarm" ausgelöst, wenn die Akkuspannung unter 6.5V fällt.
Zusätzlich habe ich (jaha, ich _hatte_ grad Langeweile) noch eine kleine Routine eingebaut, die nach einer Minute die Hintergrundbeleuchtung des Displays ausschaltet (man kann sie jederzeit wieder einschalten), und _das_ gibt eine verwirrende Erkenntnis:
Wenn z.B. die Akkuspannung bei 7.6V ist, und das Display AUS, dann habe ich, wenn ich das Display wieder einschalte, mindestens 1/10V _mehr_ auf der Anzeige.
Merkwürdig, bedeutet das, das Display braucht bei eingeschaltener Hintergrund-Beleuchtung WENIGER Strom als ohne sie?
Sowas ähnliches las ich heute doch schon mal an anderer Stelle?

Übrigens wäre es schön, wenn die Profis (bin ich ja weit, weit weg von noch...) sich den Code mal anschauen, und eventuelle Kritikpunkte anmerken, nur so lernt man schliesslich was.

Rabenauge
03.05.2010, 10:02
Nachtrag: die Geschichte, wie beschrieben, funktioniert: mit Einschränkungen!
Es gibt nämlich da ein Problem: ich habe gestern abend noch mal die Bordspannung gemessen (per Multimeter) und hatte nur noch 4.85V!
Beim Grübeln fiel mir dann ein, was da wohl schief gelaufen sein mag: irgendwo hörte ich mal, dass die Spannungsstabilisatoren mindestens 2V mehr am Eingang brauchen, als sie herausgeben sollen??

Das bedeutet, wenn der LiPo unter 7V fällt (was ihm noch lange nichts ausmacht), fällt auch die Bordspannung der Biene unter 5V (auch das macht nix).
ABÄR: da ja die Bordspannung nunmal die Referenz ist, zeigt die Biene ab dann eine falsche (nämlich höhere) Akkuspannung an!

Ich schätze, mittelfristig bleibt da nichts anderes übrig, als den Spannungsteiler umzubauen und dann eben _doch_ die interne Referenzspannung zu benutzen.
Für den Moment habe ich obiges Programm einfach angepasst, der Alarm wird nun bei unter 7.2V ausgelöst, das ist zwar viel zu früh, aber reicht allemal aus vorerst, und es ist, wenn Alarm geschlagen wird, noch jede Menge Reserve vorhanden, nur weiss ich _dann_, dass den Messwerten nicht mehr zu trauen ist.
Umgebaut werden muss wohl trotzdem (nich heute, andermal), denn wenn der LiPo schon zum Teil entladen war, und man die Biene dann einschaltet, wird nie Alarm gegeben...

Stimmt das mit den 2V Differenz?

radbruch
03.05.2010, 13:14
Hallo

Der schon erwähnte 68k-Widerstand, diesmal zwischen R43 und dem Lipo, wäre auch hier nicht schlecht:

8,4V/(47k+47k+68k)*47k=2,44V
6,0V/(47k+47k+68k)*47k=1,74V

(bei 8,4V/(47k+47k+56k)*47k=2,63V wären wir zu hoch)

Gruß

mic

Rabenauge
03.05.2010, 17:03
Womit wir wieder bei Variante 1 wären, wie sie mir workwind bereits vorschlug: R43 ganz einfach durch einen 100k ersetzen und _dann_ mit der internen Referenzspannung (2.56V) arbeiten.

Oder meinst du was anderes?

radbruch
03.05.2010, 17:40
Ich meinte die Verbindung zwischen R43 und dem Lipo durch einen 68k-Widerstand ersetzen und _dann_ mit der internen Referenzspannung (2.56V) arbeiten.

Rabenauge
03.05.2010, 17:56
Verstehe ich nicht.
R43 _ist_ direkt mit den 8V vom LiPo verbunden. Das muss auch so bleiben, denn nur, wenn ich direkt an die 8V vom LiPo gehe, habe ich zuverlässig das, was im akku wirklich drin ist.

Wenn ich dazwischen nun noch einen 68k setze, habe ich 47k (R43) plus 68k und lande also bei 110, da kann ich doch auch den 100k _anstelle_ R43 benutzen?

radbruch
03.05.2010, 18:00
Klar kannst du den R43 auch auslöten und ersetzen. Mach wie du willst. Ich denke, das Prinzip hast du nun verstanden ;)

Gruß

mic

Rabenauge
03.05.2010, 18:33
Na hoffentlich.;)

Mal sehen ob ich heute Lust habe, den Lötkolben _nochmal_ zur Hand zu nehmen...wäre eigentlich schon schön, das gleich _endgültig_ zu erledigen.

Rabenauge
03.05.2010, 22:39
Oha, jetzt weiss ich, wieso du lieber die 47k+68k-Variante vorgeschlagen hast. ;) bei meinem 100k komme ich auf eine Spannung (nach R43) von über 2,6V- wenn der Akku frisch geladen ist. [-X
Damit mehr, als der ADC herausrückt (da ich ja nun doch die zuverlässigere, interne Referenz nutze), er zeigt fröhlich die 1023 an *grmbl

Würde zwar nicht grundsätzlich stören (wenn die Spannung später abnimmt, klappt es ja) aber ich hänge halt noch den ausgebauten 47k hintendran (hab gerade nichts anderes passendes zur Hand), dann lande ich (eben fliegend probiert) bei ADC-Werten um die 800.
So habe ich eine _ordentliche_ Lösung, die eben _auch_ als echte Spannungsanzeige zu gebrauchen ist.

Da er nun drinnen ist, weiss ich: klappt.

Jetzt noch "flugs" die Formel entsprechend anpassen (mal sehen, wie lange ich brauchen werde :-$ ) und _dann_ ists richtig.

Rabenauge
05.05.2010, 19:32
Sodele, fertig.
Jetzt habe ich eine, von der externen Referenz _unabhängige_ Spannungsmessung, deren Abweichung <0.1V ist.
Nein, ich hab jetzt fürs Ändern der Formel keine zwei Tage gebraucht, sondern ungefähr eine halbe Stunde, inzwischen habe ich die ganze Geschichte eine volle Akkuladung lang beobachtet und von Zeit zu Zeit mit dem Multimeter überprüft.
Hat ein bisschen gedauert, ehe ich die richtige Formel fand, weil mir erst nach mehreren Stunden Grübelns die Idee kam, den tatsächlichen Messwert mal aufs Display zu geben und dann einfach gegenzurechnen.
Wie immer: aufs einfachste kommt man zuletzt. :D

workwind
06.05.2010, 18:48
Es ist auch möglich die Versorgungsspannung intern, ohne Verwendung eines analogen Eingangs, zu messen:
Man misst die 1.22V Bandgap-Spannung mit Vcc als Referenz (ADMUX=0x5e).
Für die Versorgungsspannung gilt dann:

Vcc = (1.22 V * 1024) / ADC