- LiTime Speicher und Akkus         
Ergebnis 1 bis 7 von 7

Thema: Akkuspannung in Volt

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    13.09.2014
    Beiträge
    23

    Akkuspannung in Volt

    Anzeige

    Praxistest und DIY Projekte
    Hallo,
    ich möchte bei der RP6 Control das Move Programm so ändern, das bei Druck auf Taster 2 die Akkuspannung in Volt auf dem Display angezeigt werden soll (später noch Helligkeit bei Taster 3,..), bei Druck auf Taster 1 dann wieder das Aktive Verhalten. Problem ist jetzt im Display steht in Zeile 1 immer "Akku Spannung", bei Druck auf Taster 2 Steht in Zeile 2 eine 7. Sobald z.B. escape aktiv wird steht dann in Zeile 2 das aktive Verhalten (ohne das der Taster gedrückt wurde).
    Hier der code den ich geändert habe:
    Code:
    void displayBehaviour(uint8_t behave)
    {
    	static uint8_t compare = 0;
    	uint8_t key = getPressedKeyNumber(); 
    	while(getPressedKeyNumber());
    	
    	switch(key)
    	{
    		case 1:
    		compare = 0;
    		clearLCD();
    		showScreenLCD("Active Behaviour", "");
    		
    		case 2:
    		compare = behave;
    		clearLCD();
    		showScreenLCD("Akku Spannung", "");
    		clearPosLCD(1, 0, 13);
    		setCursorPosLCD(1, 0); 
    		uint16_t ubat = adcBat;
    		uint16_t UinVolts = (ubat / 100);
    		writeIntegerLCD(UinVolts, DEC);
    		
    		
    	}
    		
    	if(compare != behave)
    	{
    		compare = behave;
    		clearPosLCD(1, 0, 13);
    		setCursorPosLCD(1, 0); 
    		switch(behave)
    		{
    			case 6: writeStringLCD_P("LOW BATTERY!"); setLEDs(0b0000); break;
    			case 5: writeStringLCD_P("WAIT"); setLEDs(0b0000); break;
    			case 4: writeStringLCD_P("ESCAPE"); setLEDs(0b0110); break;
    			case 3: writeStringLCD_P("AVOID"); setLEDs(0b1001); break;
    			case 2: writeStringLCD_P("CRUISE"); setLEDs(0b0000); break;
    			case 1: writeStringLCD_P("STOP"); setLEDs(0b0000); break;
    		}
    	}
    	if(behave == 2) // If Cruise behaviour is active, show a running light...
    	{
    		static uint8_t runLEDs = 1;
    		static uint8_t dir = 0;
    		if(getStopwatch2() > 100) 
    		{
    			setLEDs(runLEDs); 
    			if(dir == 0)
    				runLEDs <<= 1; 
    			else
    				runLEDs >>= 1;
    			if(runLEDs > 7 ) 
    				dir = 1;			
    			else if (runLEDs < 2 ) 
    				dir = 0;
    			setStopwatch2(0);
    		}
    	}
    	if(behave == 6) // If Battery is low - beep all 3 seconds!
    	{
    		if(getStopwatch2() > 3000)  // We can use Stopwatch2 here and 
    		{							// for several other things because only
    			sound(200,20,20);		// one of these things can be active at 
    			sound(225,20,60);		// the same time! You could not do this if
    			sound(200,20,20);		// there were things that could be active
    			sound(225,20,0);		// at the same time!
    			setStopwatch2(0);
    		}
    	}
    }
    Außerdem steht bei Akkuspannung nur 7, ich hätte gerne das diese mit Kommastelle angezeigt wird. z.B. wenn ADC_Bat 730 ist: 730/100 = 7,3 Volt

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hi,
    ein paar Punkte:

    1. Das Programm RP6Control_10_Move_2 läuft permanent durch und darf nicht durch eine blockierende Tastaturabfrage aufgehalten werden.
    2. Die Umrechnung vom Wert in adcBat in eine Spannung U [V] geht nicht einfach mit dem Teilen durch 100, sondern: U = adcBat * 5 /1024
    3. Wenn du so U ausrechnest, brauchst du U als Fließkomma-Variable: double U;
    4. Zur Ausgabe einer solchen Zahl auf dem LCD brauchst du eine eigene Funktion:
    Code:
    /**
     * Write a floating point number to the LCD.
     *
     * Example:
     *
     *            // Write a floating point number to the LCD (no exponent):
     *            writeDoubleLCD(1234567.890, 11, 3);
     *
     * The value of prec (precision) defines the number of decimal places.
     * For 32 bit floating point variables (float, double ...) 6 is
     * the max. value for prec (7 relevant digits).
     * The value of width defines the overall number of characters in the
     * floating point number including the decimal point. The number of
     * pre-decimal positions is: (width - prec - 1).
     */
    void writeDoubleLCD(double number, uint8_t width, uint8_t prec)
    {char buffer[width + 1];
        dtostrf(number, width, prec, &buffer[0]);
        writeStringLCD(&buffer[0]);
    }
    5. Es gibt auch eine Alternative zur Fliesskommazahl (hier serielle Ausgabe!):
    Code:
            writeIntegerLength((((adcBat/102.4f)+0.1f)), DEC, 2);
            writeChar('.');
            writeIntegerLength((((adcBat/1.024f)+10)), DEC, 2);
            writeString_P("V\n");
    6. Das Programm macht schon dauernd einige LCD-Ausgaben, so dass du überlegen solltest, wie du deine Ausgaben allein auf das LCD bekommen kannst. Da muss sicher auch das Move_2 Programm geändert werden. Oder du weichst auf die serielle Ausgabe zum Terminal aus.
    Geändert von Dirk (25.09.2014 um 22:44 Uhr)
    Gruß
    Dirk

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    13.09.2014
    Beiträge
    23
    Ok, das scheint ja doch um einiges komplizierter zu sein als ich dacht. Ich werde nochmal versuchen ob ich damit eventuell etwas hinbekomme.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    131
    Zitat Zitat von Dirk Beitrag anzeigen
    2. Die Umrechnung vom Wert in adcBat in eine Spannung U [V] geht nicht einfach mit dem Teilen durch 100, sondern: U = adcBat * 5 /1024
    Hallo Dirk,
    Deine Formel geht bei mir irgendwie nicht auf! Ich sehe im Terminal die Angabe "BAT:0729" gleichzeitig messe ich am Gerät/VDD= 7,20V.
    Da komme ich mit deiner Formel nicht hin!? (729*5/1024=3,56V)
    Steh ich da auf dem Schlauch oder stimmt die Formel nicht?

    Gruß Uwe

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    ich habe es so gelöst:
    Klicke auf die Grafik für eine größere Ansicht

Name:	2014_05_26_gesamtaufbau.jpg
Hits:	20
Größe:	66,0 KB
ID:	31325
    gruß inka

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Da komme ich mit deiner Formel nicht hin!? (729*5/1024=3,56V)
    Doch. 3,56V sind VDD / 2, weil VDD auf dem RP6 Mainboard durch 2 geteilt wird durch R1/R2 (siehe Schaltplan "RP6_MAINBOARD.pdf", Blatt 1).
    Du must also das Ergebnis nur mal 2 nehmen.
    Gruß
    Dirk

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    131
    Zitat Zitat von Dirk Beitrag anzeigen
    Doch. 3,56V sind VDD / 2, weil VDD auf dem RP6 Mainboard durch 2 geteilt wird durch R1/R2 (siehe Schaltplan "RP6_MAINBOARD.pdf", Blatt 1).
    Du must also das Ergebnis nur mal 2 nehmen.
    Dachte ich doch, daß es da eine einfache Erklärung geben muß
    Danke

    Uwe

Ähnliche Themen

  1. nibobee: Akkuspannung mit ADC messen
    Von Skroete im Forum Sonstige Roboter- und artverwandte Modelle
    Antworten: 4
    Letzter Beitrag: 01.01.2010, 18:13
  2. Akkuspannung messen
    Von Jon im Forum AVR Hardwarethemen
    Antworten: 7
    Letzter Beitrag: 28.11.2009, 14:25
  3. Akkuspannung Bleiakku bei Stombelastung von 5A
    Von TomEdl im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 13.11.2009, 10:51
  4. akkuspannung während dem laden messen
    Von Roboman93 im Forum Elektronik
    Antworten: 21
    Letzter Beitrag: 12.10.2008, 15:55
  5. Erzeugung von 200 Volt aus 10 Volt Gleichspannung
    Von corone im Forum Elektronik
    Antworten: 39
    Letzter Beitrag: 12.03.2007, 21:38

Berechtigungen

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

LiTime Speicher und Akkus