PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ADC-Batteriespannung



patrick-rp6
17.05.2010, 21:13
Also.... ich hab nen kleines programm geschrieben, welches die batteriespannung ausliest:


void ubat_mess (void)
{
task_ADC();

uint16_t ubat_feld [MESSWERTE]; //Feld für die Anzahl der MESSWERTE
uint16_t ubat_ges=0, u_mittel, u_korrekt;
uint8_t i;

startStopwatch1(); //Stoppuhr wird gestartet
if(getStopwatch1() > ZEITZYKLUS) //erreicht die Stoppuhr den Wert so wird die Messung durchgeführt
{
for(i=0; i<MESSWERTE; i++) //Schleife für definition der einzelnen feldelemente
{
ubat_feld[i] = adcBat; //jedes feldelement bekommt einen wert zugewiesen
ubat_ges=ubat_ges+ubat_feld[i]; //die gesamtspannung wird ermittelt

mSleep(0.26); //260us warten //******FRAGE****


}

u_mittel=ubat_ges/MESSWERTE; // der Mittelwert wird berechnet
u_korrekt=u_mittel * 0.9815;
//AUSGABE von Batteriespannung


writeString_P("Batteriespannung:");
writeInteger(u_mittel, DEC);
writeString_P("\n");

writeString_P("Batteriespannung mit Korrektur:");
writeInteger(u_korrekt, DEC);
writeString_P("\n");
setStopwatch1(0);
}
}


Meine Frage: Ist es wichtig nach jedem Beschreiben eines Feldelementes ne pause(msleep) zu machen, damit ich die neuen daten aus dem adc dataregister lese und nicht ein neues feldelement mit alten daten beschreibe?

Nächste Frage: ist es ok, wenn ich einen berechneten korrekturfaktor einfach mit dem ermmittelten wert des adc multipliziere?

Gruß patrick

uwegw
17.05.2010, 22:14
Ohne den RP6 und seine lib zu kennen einfach mal geraten: Könnte es sein, dass die AD-Wandlung mit task_ADC(); ausgelöst wird? Wenn ja (bitte in der Doku nachsehen!), dann einfach dies Funktion an Stelle des delays aufrufen.


Und noch als Tipp: Wenn du einen Mittelwert berechnen willst, musst du nicht alle Einzelwerte in einem Array speichern. Du kannst auch einfach alle Werte in einer Variablen aufsummieren, und brauchst so viel weniger Speicherplatz.

patrick-rp6
18.05.2010, 14:40
danke für deine antwort!

Ich das jetzt nen bisschen umgeschrieben und du hattest recht, task_ADC() startet automatisch und führt für alle kanäle die ad-wandlung durch.
Hier mein neuer code:


void ubat_mess (void)
{


uint16_t ubat; //Feld für die Anzahl der MESSWERTE
uint16_t ubat_ges=0, u_mittel, u_korrekt;
uint8_t i;

startStopwatch1(); //Stoppuhr wird gestartet
if(getStopwatch1() > ZEITZYKLUS) //erreicht die Stoppuhr den Wert so wird die Messung durchgeführt
{
for(i=0; i<MESSWERTE; i++) //Schleife für definition der einzelnen feldelemente
{
task_ADC();
ubat = adcBat; //jedes feldelement bekommt einen wert zugewiesen
ubat_ges=ubat_ges+ubat; //die gesamtspannung wird ermittelt
}

u_mittel=ubat_ges/MESSWERTE; // der Mittelwert wird berechnet
u_korrekt=u_mittel * 0.9815;
//AUSGABE von Batteriespannung


writeString_P("Batteriespannung:");
writeInteger(u_mittel, DEC);
writeString_P("\n");

writeString_P("Batteriespannung mit Korrektur:");
writeInteger(u_korrekt, DEC);
writeString_P("\n");
setStopwatch1(0);
}
}