PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wo ist der denk fehler ?



NumberFive
03.11.2004, 00:34
die vairable Volt hat immer den wert 0
in fuktion get bat power
result ist aber 427

board ist ein rn-control

ich möchte die battire spannung messen

03.11.2004, 06:21
Hallo

int Ref = 5 / 1023; //5V / 8 Bit
int Volt = 0;

sind doch alles ganzzahlige Variablen. Versuch doch mal float.

MFG

Bomberman
03.11.2004, 11:38
Hallo Numberfive,

Habe in C schon ähnliche Probleme gehabt.
Ich steige nicht vollständig durch Deinen Quelltext durch, weil Zeit und teils auch Wissen fehlt.
Allerdings vermute ich einen Fehler in den folgenden Zeilen:

Volt = Result * (5/ 1023); *kommt hier eine Ganzzahl heraus?*
itoa(Volt,buffer2,10);
SendString(buffer2);
Volt = Volt * 5,2941; *kommt hier eine Ganzzahl heraus?*

Du solltest mit dem Modulo-Operator arbeiten:

Das funktioniert so:

Eine Division liefert einen Ganzzahligen Rest, so wie wir das ganz zu Anfang in der Schule mal gemacht haben.

Syntax:

Rest = Wert % Divisor

Beispiel:

1 = 13 % 4 * 13 : 4 ergibt 3 Rest 1*

Andere Möglichkeit:

Die Division durch eine Schleife voll Subtraktionen ersetzen

Viel Erfolg
Patrick

martin
03.11.2004, 11:48
Hallo,


Volt = Result * (5/ 1023);

Volt ist ein Integer-Wert. Result danke ich auch mal, oder macht der AD-Wandler 10 bit?

Aber es passiert folgendes: du hast (5/1023) geklammert. Bei dieser Operation kommt für Int-Zahlen immer 0 raus. Mit dieser 0 wird dann dein Result Multpliziert. Ergebnis ist wieder 0.

Grüsse, Martin

05.11.2004, 18:23
"C" kommt von cast:
du mußt schreiben ((float)5 / (float) 1023) )
:-)

NumberFive
07.11.2004, 15:45
Hallo Leute,

sory das ich jetzt erst schreibe aber konnte nicht schneller.




WORD Result = 0;
float Volt = 0;
float Teiler = 5.2941;

CLEARBIT(ADCSRA,ADEN); // aus schlaten damit ich den port wechseln kann
// Messen an port 6
CLEARBIT(ADMUX,MUX4);
CLEARBIT(ADMUX,MUX3);
SETBIT(ADMUX,MUX2);
SETBIT(ADMUX,MUX1);
CLEARBIT(ADMUX,MUX0);
SETBIT(ADCSRA,ADEN);
// Bit invertieren messung starten
ADCSRA |=_BV(ADSC);
waitforad = 1;
// warten bis messung abgesclossen ist und wert gültig
while(waitforad != 0)
{
//warten auf den adwandler;
};
// den wert aus dem register holen
char buffer2[20];
SendString("Messe :");
Result = ADCH*256 + ADCL;

itoa(Result,buffer2,10);
SendString(buffer2);

Volt = ((Result * 5)/ 1023)*Teiler;
// Berechnung Volt gemessen bei Ref von 5V

SendString("Volt :");
itoa(Volt,buffer2,10);
SendString(buffer2);

if(Volt > 11)
{
if(Volt >=12)
{
if(Volt >= 13)
{
SendMCData(2,100); // frisch geladen
}
else
{
SendMCData(2,50); // Bat OK aber bald
}
}
else
{
SendMCData(2,20); //fast leer
}
}
else
{
SendMCData(2,0); // Batt ist leer
}


Damit stimmt es schon fast also die die Gemessen 2,x Volt scheine wohl zu passen aber es kommen immer 10 volt raus mein multi meter zeig aber
11.8 Volt an und jetzt ?

Gruß

NumberFive
07.11.2004, 17:25
So jetzt tut es wohl




WORD Result = 0;
double Volt = 0;

CLEARBIT(ADCSRA,ADEN); // aus schlaten damit ich den port wechseln kann
// Messen an port 6
CLEARBIT(ADMUX,MUX4);
CLEARBIT(ADMUX,MUX3);
SETBIT(ADMUX,MUX2);
SETBIT(ADMUX,MUX1);
CLEARBIT(ADMUX,MUX0);
SETBIT(ADCSRA,ADEN);
// Bit invertieren messung starten
ADCSRA |=_BV(ADSC);
waitforad = 1;
// warten bis messung abgesclossen ist und wert gültig
while(waitforad != 0)
{
//warten auf den adwandler;
};

// den wert aus dem register holen
Result = ADCH*256 + ADCL;

Volt = (((Result * 5)/ 1.024)*((float)22000+5100))/5100;
// Berechnung Volt gemessen bei Ref von 5V
// * 1000 für die komma stellen
// Mit Spannungsteiler 22k 5,1 k

// Das If grab an passen wenn mal die Akkus wirklich daran hängen
if(Volt > 11)
{
if(Volt >=12)
{
if(Volt >= 13)
{
SendMCData(2,100); // frisch geladen
}
else
{
SendMCData(2,50); // Bat OK aber bald
}
}
else
{
SendMCData(2,20); //fast leer
}
}
else
{
SendMCData(2,0); // Batt ist leer
}


nicht ganz genaue aber ich denk besser wird es nicht die ganz zahl stimm jetzt wenigstens.

es kommen 11,08 raus und mit dem muti meter messe ich 11,66

Gruß