Bist du dir sicher das der Fehler in diesem Code-Fragment ist?
Hallo,
Ich hab ein kleine Demo Funktion geschreiben und ich finde den Fehler nicht denn ich bekomme imer nur 000 als Akku Spannung raus.
ich habe ihn in C geschreiben, bitten nicht lachen denn ich hab vorher nur
c++ borland builder, und in c# gecodet.
Der Code ist für den RP6.
Ich brauch nur einen Denkanstoss wo der fehler sein kann.Code:uint16_t SpannungsMessungen[11], Anzahl = 10; // Angabe wie oft gemessen wird ( Pro Funktion aufruf ). uint16_t Spannung = 0, Temp = 0; int AkkuC0 = 0; void AkkuCheck(void) { AkkuC0++; if(AkkuC0 >= 500) // Alle 500 Aufrufe wird die Funktion ausgeführt. { AkkuC0 = 0; for(int Messung = 0; Messung < Anzahl; Messung++) { SpannungsMessungen[Messung] = adcBat; // 10 mal wird die AkkuSpannung gemessen. if(Messung == Anzahl) { for(int Zaehlen = 0; Zaehlen < Anzahl; Zaehlen++) { Temp = Temp + SpannungsMessungen[Zaehlen]; // Die 10 Messwerte werden Addiert. if(Zaehlen == Anzahl) Spannung = Temp / Anzahl; // Die 10 Messwerte werden und 10 geteilt. } } } } // Test ausgabe writeString_P(" || Akku Spannung: "); writeIntegerLength(Spannung, DEC, 3); writeChar('\n'); }
MFG Oliver G
Bist du dir sicher das der Fehler in diesem Code-Fragment ist?
Hi Hubert.G,
Ja denn was anders hab ich nicht drin nur noch:
MFG Oliver GCode:int main(void) { initRobotBase(); powerON(); while(true) { task_RP6System(); AkkuCheck(); } return 0; }
Kann ich mit nicht ganz vorstellen.
Wo ist adcBat deklariert und wie kommt der Spannungswert in diese Variable.
Hi Hubert.G,
Das hab ich vergessen zu schreiben adcBat kommt aus
#include "RP6RobotBaseLib.h"
Denn in einen domo Snippet kommen diese Codezeilen vor:
Die demo file heisst: RP6Base_LightDetection. Nur zur infoCode:// Show Battery voltage: writeString_P(" || UBAT: "); writeIntegerLength(adcBat, DEC, 3); writeChar('\n'); if(adcBat < 600) { writeString_P("WARNING: BAT IS LOW!\n"); writeChar('\n'); } setStopwatch1(0);
Also so wie ich des jetzt mitbekomm ist in meien Code kein fehler drin ( C Syntax ) Ok.jetzt Check ich nix mehr. da fällt mir nur eins ein " Der Geist in der Maschine ".
bekommst du auch 000 geliefert wenn du einfach nur in main-loop
den Batteriewert ausliest und an den PC sendest ?
Bist du dir sicher das der ADC läuft und auch ein Ergebnis liefert.
@shedepe Nein, aber bei den Test Code unten geht es aus, ist ja das selbe ( ob es in der while schleife selbst drin ist oder ob es von da aus aufgerufen wird).
@Hubert.G
Ja der läuft und es ich bekomm werte raus, ich hab ein kleinen Test Code geschrieben ohne schnick schnack.
Hir der Test Code:
Als ergebnis bekomme ich 804.Code:#include "RP6RobotBaseLib.h" void Test(void) { // Show Battery voltage: writeString_P(" || UBAT: "); writeIntegerLength(adcBat, DEC, 3); writeChar('\n'); } int main(void) { initRobotBase(); powerON(); while(true) { task_RP6System(); Test(); } return 0; }
MFG Oliver G
Also so wie ich das sehe liest du die Variable adcBat einfach aus.
Die Frage die ich mir jetzt stelle:
Wie kommt der Wert von ADC in die Variable adcBat hinein?
Ich glaub nicht, dass der RP6 im Hintergrund immer den Wert vom ADC liest und in dieser Variable speichert.
In der RP6RobotBaseLib.c gibts eine Funktion (task_ADC()), die alle Channels nacheinander ausliest und in die definierten Variablen abspeichert, so auch adcBat.
D.h. vor jeder Messung musst du wohl die task_ADC() Funktion aufrufen um den aktuellen Wert in adcBat gespeichert zu bekommen.
EDIT:
ok das übernimmt dan die task_RP6System() Funktion.
Das Problem ist dann, dass du 500 mal aus dem ADC ausliest, aber du kannst ja trotzdem nur einen Wert in adcBat speichern und den liest du dann 10 mal aus und dividierst ihn anschließend durch 10.
Soll das auch so sein?
Hi Kenny5020,
Ich will Fehlmessungen vermeiden, die durch den Motor erzeugt werden ( schneller fahren, richtungswechsel usw...)
Nein, die funktion void AkkuCheck(void) wird durch die while dauert dauernd aufgerufen, erst wenn AkkuC0 >= 500 ist wird die akkuspannung 10 mal ausgelesen und dann durch 10 dividierst. Und AkkuC0 = 0;
ich ermittel den mittelwert der akkuspannung.
Und es beginnt von vorne .
z.b. :
(-1,5 + 2,5) / 2 = Mittelwert 0,5
Lesezeichen