Archiv verlassen und diese Seite im Standarddesign anzeigen : Drehgeber Enc. zählt falsch
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();
}
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
}
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
... na dann würde die Zeile heissen
wenn alter Zustand = 0 und Zustand = 1 dann zähle
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;
}
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;
}
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;
}
portstatus=board.digital(p);
muß aus der inneren Klammer raus.
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!
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;
}
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.