PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Akku Spannungs Messung Code Fehler



RP5-System
22.09.2010, 12:17
Hallo,

Ich hab ein kleine Demo Funktion geschreiben und ich finde den Fehler nicht denn ich bekomme imer nur 000 als Akku Spannung raus.
ich habe ihn in C geschreiben, bitten nicht lachen denn ich hab vorher nur
c++ borland builder, und in c# gecodet.

Der Code ist für den RP6.



uint16_t SpannungsMessungen[11], Anzahl = 10; // Angabe wie oft gemessen wird ( Pro Funktion aufruf ).
uint16_t Spannung = 0, Temp = 0;
int AkkuC0 = 0;
void AkkuCheck(void)
{
AkkuC0++;
if(AkkuC0 >= 500) // Alle 500 Aufrufe wird die Funktion ausgeführt.
{
AkkuC0 = 0;
for(int Messung = 0; Messung < Anzahl; Messung++)
{
SpannungsMessungen[Messung] = adcBat; // 10 mal wird die AkkuSpannung gemessen.
if(Messung == Anzahl)
{
for(int Zaehlen = 0; Zaehlen < Anzahl; Zaehlen++)
{
Temp = Temp + SpannungsMessungen[Zaehlen]; // Die 10 Messwerte werden Addiert.
if(Zaehlen == Anzahl) Spannung = Temp / Anzahl; // Die 10 Messwerte werden und 10 geteilt.
}
}
}
}
// Test ausgabe
writeString_P(" || Akku Spannung: ");
writeIntegerLength(Spannung, DEC, 3);
writeChar('\n');
}



Ich brauch nur einen Denkanstoss wo der fehler sein kann.

MFG Oliver G

Hubert.G
22.09.2010, 14:22
Bist du dir sicher das der Fehler in diesem Code-Fragment ist?

RP5-System
22.09.2010, 14:44
Hi Hubert.G,

Ja denn was anders hab ich nicht drin nur noch:



int main(void)
{
initRobotBase();
powerON();
while(true)
{
task_RP6System();
AkkuCheck();
}
return 0;
}


MFG Oliver G

Hubert.G
22.09.2010, 17:37
Kann ich mit nicht ganz vorstellen.
Wo ist adcBat deklariert und wie kommt der Spannungswert in diese Variable.

RP5-System
22.09.2010, 18:49
Hi Hubert.G,

Das hab ich vergessen zu schreiben adcBat kommt aus

#include "RP6RobotBaseLib.h"

Denn in einen domo Snippet kommen diese Codezeilen vor:



// Show Battery voltage:
writeString_P(" || UBAT: ");
writeIntegerLength(adcBat, DEC, 3);
writeChar('\n');
if(adcBat < 600)
{
writeString_P("WARNING: BAT IS LOW!\n");
writeChar('\n');
}
setStopwatch1(0);


Die demo file heisst: RP6Base_LightDetection. Nur zur info

Also so wie ich des jetzt mitbekomm ist in meien Code kein fehler drin ( C Syntax ) Ok. ](*,) jetzt Check ich nix mehr. da fällt mir nur eins ein " Der Geist in der Maschine ".

shedepe
22.09.2010, 19:04
bekommst du auch 000 geliefert wenn du einfach nur in main-loop
den Batteriewert ausliest und an den PC sendest ?

Hubert.G
22.09.2010, 21:33
Bist du dir sicher das der ADC läuft und auch ein Ergebnis liefert.

RP5-System
22.09.2010, 22:32
@shedepe Nein, aber bei den Test Code unten geht es aus, ist ja das selbe ( ob es in der while schleife selbst drin ist oder ob es von da aus aufgerufen wird).

@Hubert.G

Ja der läuft und es ich bekomm werte raus, ich hab ein kleinen Test Code geschrieben ohne schnick schnack.

Hir der Test Code:



#include "RP6RobotBaseLib.h"

void Test(void)
{
// Show Battery voltage:
writeString_P(" || UBAT: ");
writeIntegerLength(adcBat, DEC, 3);
writeChar('\n');
}


int main(void)
{
initRobotBase();
powerON();
while(true)
{
task_RP6System();
Test();
}
return 0;
}


Als ergebnis bekomme ich 804.

MFG Oliver G

Kenny5020
22.09.2010, 22:43
Also so wie ich das sehe liest du die Variable adcBat einfach aus.
Die Frage die ich mir jetzt stelle:
Wie kommt der Wert von ADC in die Variable adcBat hinein?
Ich glaub nicht, dass der RP6 im Hintergrund immer den Wert vom ADC liest und in dieser Variable speichert.

In der RP6RobotBaseLib.c gibts eine Funktion (task_ADC()), die alle Channels nacheinander ausliest und in die definierten Variablen abspeichert, so auch adcBat.

D.h. vor jeder Messung musst du wohl die task_ADC() Funktion aufrufen um den aktuellen Wert in adcBat gespeichert zu bekommen.

EDIT:
ok das übernimmt dan die task_RP6System() Funktion.
Das Problem ist dann, dass du 500 mal aus dem ADC ausliest, aber du kannst ja trotzdem nur einen Wert in adcBat speichern und den liest du dann 10 mal aus und dividierst ihn anschließend durch 10.
Soll das auch so sein?

RP5-System
22.09.2010, 23:06
Hi Kenny5020,

Ich will Fehlmessungen vermeiden, die durch den Motor erzeugt werden ( schneller fahren, richtungswechsel usw...)
Nein, die funktion void AkkuCheck(void) wird durch die while dauert dauernd aufgerufen, erst wenn AkkuC0 >= 500 ist wird die akkuspannung 10 mal ausgelesen und dann durch 10 dividierst. Und AkkuC0 = 0;
ich ermittel den mittelwert der akkuspannung.

Und es beginnt von vorne .

z.b. :
(-1,5 + 2,5) / 2 = Mittelwert 0,5

RP5-System
22.09.2010, 23:13
Soory für den doppel post!

ich glaub ich wich weiss wo der fehler ist ich mus in der for schleife task_RP6System(); mit aufrufen. dane an Kenny5020
leider kann ich es jetzt nicht testen den mein RP6 Tankgerade.





uint16_t SpannungsMessungen[11], Anzahl = 10; // Angabe wie oft gemessen wird ( Pro Funktion aufruf ).
uint16_t Spannung = 0, Temp = 0;
int AkkuC0 = 0;
void AkkuCheck(void)
{
AkkuC0++;
if(AkkuC0 >= 500) // Alle 500 Aufrufe wird die Funktion ausgeführt.
{
AkkuC0 = 0;
for(int Messung = 0; Messung < Anzahl; Messung++)
{
task_RP6System();
SpannungsMessungen[Messung] = adcBat; // 10 mal wird die AkkuSpannung gemessen.
if(Messung == Anzahl)
{
for(int Zaehlen = 0; Zaehlen < Anzahl; Zaehlen++)
{
Temp = Temp + SpannungsMessungen[Zaehlen]; // Die 10 Messwerte werden Addiert.
if(Zaehlen == Anzahl) Spannung = Temp / Anzahl; // Die 10 Messwerte werden und 10 geteilt.
}
}
}
}
// Test ausgabe
writeString_P(" || Akku Spannung: ");
writeIntegerLength(Spannung, DEC, 3);
writeChar('\n');
}

.


Ich werde es morgen test und euch bescheid sagen ob es gefunzt hat.

RP5-System
23.09.2010, 11:15
Ok ich hab des kleine fehler gefunden es waren sogar 2 / 3 der dritte war ein schönheits fehler.

Zu den fehlern ich hab nicht daran gedacht das die bei 0 beginne und so nie 10 ereichen können wenn die nur 10 mal zählen. ](*,)

Fehler eins: if(Messung == Anzahl) -> if((Messung + 1) == Anzahl)
Fehler zwei: if(Zaehlen == Anzahl) -> if((Zaehlen + 1) == Anzahl)
Schönheits fehler: if(AkkuC0 >= 500) -> if(AkkuC0 == 500)

Und hir der ganze Code, OK den kann man noch verbessern. Was ich auch machen werde. O:)

Code:



uint16_t SpannungsMessungen[10], Anzahl = 10;
uint16_t Spannung = 0, Temp = 0;
int AkkuC0 = 0, I =0;
void AkkuCheck(void) // Angabe wie oft gemessen wird ( Pro Funktion aufruf ).
{
AkkuC0++;
if(AkkuC0 == 500) // Alle 500 Aufrufe wird die Funktion ausgeführt.
{
AkkuC0 = 0;
Spannung = 0;
Temp = 0;
for(int Messung = 0; Messung < Anzahl; Messung++)
{
task_RP6System(); // Nur zur sicherheit
SpannungsMessungen[Messung] = adcBat; // 10 mal wird die AkkuSpannung gemessen.
if((Messung + 1) == Anzahl)
{
for(int Zaehlen = 0; Zaehlen < Anzahl; Zaehlen++)
{
Temp = Temp + SpannungsMessungen[Zaehlen]; // Die 10 Messwerte werden Addiert.
if((Zaehlen + 1) == Anzahl) Spannung = Temp / Anzahl; // Die 10 Messwerte werden und 10 geteilt.
}
}
}
}
// Test ausgabe
writeString_P(" || Akku Spannung: ");
writeIntegerLength(Spannung , DEC, 3);
writeChar('\n');
}



Es dauert aber bein ersten abfrage ein wenig bis die daten kommen der zähler muss ja erste 500 erreichen. ( Das mit den zähler han ich gemacht dammit der CPU nicht soviel rechnen muss. O:)


MFG OLiver G