PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Akkuspannung in Volt



StGla90
25.09.2014, 16:30
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:


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

Dirk
25.09.2014, 22:34
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:

/**
* 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!):

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.

StGla90
26.09.2014, 14:39
Ok, das scheint ja doch um einiges komplizierter zu sein als ich dacht. Ich werde nochmal versuchen ob ich damit eventuell etwas hinbekomme.

basteluwe
21.02.2016, 15:24
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

inka
21.02.2016, 16:09
ich habe es so gelöst:
31325

Dirk
21.02.2016, 19:26
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.

basteluwe
22.02.2016, 08:38
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ß :cool:
Danke

Uwe