-         

Ergebnis 1 bis 3 von 3

Thema: ADC-Batteriespannung

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    17.05.2010
    Ort
    unna
    Alter
    29
    Beiträge
    5

    ADC-Batteriespannung

    Anzeige

    Also.... ich hab nen kleines programm geschrieben, welches die batteriespannung ausliest:

    Code:
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    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.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    17.05.2010
    Ort
    unna
    Alter
    29
    Beiträge
    5
    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:

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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •