PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Drehgeber Enc. zählt falsch



Astro
07.09.2007, 21:42
Hallo ich hab da ein Enc. (GP1A038RBK) Code der einfach die Hälfte auf der Scheibe Zählt ich hab 120 schw. linien aber da er nur 60 davon zählt also fährt dieser das Doppelte des Weges wo liegt der Fehler!
Davon abgesehen denk ich das ich noch Probleme mit der Prell Zeit habe wenn mir da Jemand weiter helfen könnte das währe glasse!



SoccerBoard board;

//Prozedur für das Auslesen eines Encoders
void WaitForEncoder(int p,int stepps)
{
bool portstatus=board.digital(p);
int zaehler = 0;
while(zaehler <= stepps)
{
if(board.digital(p)!=portstatus)
{
if(portstatus) zaehler ++;
portstatus=!portstatus;
}
}
return;
}
int main(void){
board.ledOn(0);
board.ledOn(1);
board.waitForButton(0);
board.motor(0,255);
board.motor(1,-255);
WaitForEncoder(0,1200); 10 oder stimmen 20 umdr.
board.motorsOff();
board.ledsOff();
}

beppo
07.09.2007, 22:18
Normalerweise würde man eine Flankendetektion einbauen: Merke den letzten Zustand, wenn sich der aktuelle Zustand vom letzten Zustand unterscheidet, hast du eine Flanke erkannt und der Zähler zählt um eins hoch. Auf diese Weise hättest du sogar eine Auflösung von 240! Man kann natürlich auch nur die Flanken in eine Richtung zählen, wenn man will...

widerhole biz Zähler voll {
wenn alter Zustand != Zustand dann Zähler = Zähler + 1
alter Zustand = Zustand
}

Astro
07.09.2007, 22:33
Hallo
Das mit der Flanke höhrt sich gut an mir reicht es wenn er seine 120 zählt im moment sieht das nicht toll aus er solte einfach ur die 120 anstatt 60 zählen und das prellen weg lassen

beppo
07.09.2007, 22:43
... na dann würde die Zeile heissen

wenn alter Zustand = 0 und Zustand = 1 dann zähle

Astro
07.09.2007, 22:50
Wo hängts denn sorry aber ich mach das noch nicht so lange

void WaitForEncoder(int p,int stepps)
{
bool portstatus=board.digital(p);
int zaehler = 0;
while(zaehler <= stepps)
{
if(board.digital(p)!=portstatus)
{
if(portstatus=0 portstatus =1 zaehler ++);
portstatus=!portstatus;
}
}
return;
}

beppo
07.09.2007, 22:58
Probiers doch mal so:

void WaitForEncoder(int p,int stepps)
{
bool portstatus=board.digital(p);
int zaehler = 0;
while(zaehler <= stepps)
{
if(portstatus==0 && board.digital(p) ==1)
{
zaehler ++;
}
portstatus=board.digital(p);
}
return;
}

Astro
07.09.2007, 23:11
Irgendwie funktioniert das nicht so !
Es höhrt nicht mehr auf zu drehen und das ich eien 1Watt Wiederstand genommen hab kann nciht der Fehler sein vorher hatte ich ein signal aber bei dem code nehmen die Runden kein Ende.


SoccerBoard board;

//Prozedur für das Auslesen eines Encoders
void WaitForEncoder(int p,int stepps)
{
bool portstatus=board.digital(p);
int zaehler = 0;
while(zaehler <= stepps)
{
if(portstatus==0 && board.digital(p) ==1)
{
zaehler ++;
portstatus=board.digital(p);
}
}
return;
}

beppo
08.09.2007, 00:18
portstatus=board.digital(p);
muß aus der inneren Klammer raus.

Astro
08.09.2007, 21:11
Hallo beppo
ich hab jetz { } weg gemacht aber irgendwie ist das nicht auf mein board zu spielen compilieren ja aber es geht nicht auf mein board.

Wenn ich da einfach die 3ms eingehb wegen der Prellzeit ? ich würde dies ja mal testen aber ich weiss nicht so wo ich die Einfügen soll!

beppo
09.09.2007, 08:45
Ich kenn deinen Encoder nicht, aber eine Prellzeit gibts normalerweise nur bei mechanischen Kontakten, also Schaltern, Relais, usw.

Ich würde mich zuerst um das Problem mit dem Board kümmern.

Dein Sourcecode sollte jetzt so ausschauen:

//Prozedur für das Auslesen eines Encoders
void WaitForEncoder(int p,int stepps)
{
bool portstatus=board.digital(p);
int zaehler = 0;
while(zaehler <= stepps)
{
if(portstatus==0 && board.digital(p) ==1)
zaehler ++;
portstatus=board.digital(p);
}
return;
}