Hi,
Ich habe mich mal an einem Programm zur synchronisation der Drehzahlen versucht. Nach langem probieren war es dann vorgestern endlich soweit, dass mein Asuro geradeaus fuhr und nicht immer nur Linkskurven. Habe mich gefreut und ersteinmal das Programm etwas gerafft (Überflüssige Schleifen und Variablen entfernt alles etwas schöner gemacht).
Das dumme ist nur, es funktioniert jetzt nicht mehr. Das Programm in der Form in der es funktionierte habe ich nicht mehr und ich finde den Fehler nicht.
Vielleicht hat ja jemand Zeit mal drüber zu schauen, und etwas zu entdecken das immer übersehe. Oder das Ganze mal auf den eigenen Asuro laden um zu schauen wie es sich da benimmt.
Vielen Dank schon mal.
Achja das Problem ist, dass der rechte Motor(den linken regle ich nicht) entweder konsequent schneller gemacht wird oder eben langsamer, abhängig davon wie der wert MITTELWERTPUFFER definiert ist. Für 0 wie im Code oben geht er auf maximalspeed für werte ab 40 wird er langsamer. Auch werte dazwischen bringen keine abhilfe, der Fehler muss woanders sein. Dankeschön.Code:#include <asuro.h> #define STARTSPEEDL 180 #define STARTSPEEDR 180 #define STARTODOZYKLEN 1000 #define ODOZYKLEN 1000 #define MITTELWERTPUFFER 0 #define TRUE 1 #define FALSE 0 int n; //zählvariable int Lmotorspeed=STARTSPEEDL,Rmotorspeed=STARTSPEEDR; //motorgeschw. unsigned long int odomittelwertL,odomittelwertR;//mittlere helligkeit der ododaten unsigned long int odosummeL=0,odosummeR=0;//aufsummierte ododaten eines zyklus unsigned int ododata[2]; //nimmt die ododaten auf short int Luebermittelwert=FALSE,Ruebermittelwert=FALSE; void start() //initialisiere { Init(); StatusLED(RED); MotorSpeed(Lmotorspeed,Rmotorspeed); for(n=0;n<STARTODOZYKLEN;n++) //erstmal werden die ododaten { //aufsummiert OdometrieData(ododata); odosummeL=odosummeL+ododata[0]; odosummeR=odosummeR+ododata[1]; } odomittelwertL=(odosummeL/STARTODOZYKLEN);//erster Mittelwert wird ermittelt odomittelwertR=(odosummeR/STARTODOZYKLEN); odosummeL=0; //...wir wollen ja gleich eine neue summe bilden odosummeR=0; if (ododata[0]>odomittelwertL) //weisses oder schwarzes Feld vor dem Sensor Luebermittelwert=TRUE; if (ododata[1]>odomittelwertR) Ruebermittelwert=TRUE; StatusLED(GREEN); } void reglespeed() { unsigned int Lswcount=0,Rswcount=0;//zähler für schwarzweissÜbergänge //Schleife um Übergänge zu zählen //FOR SCHLEIFE BEGINN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ for(n=0;n<ODOZYKLEN;n++) { OdometrieData(ododata); //****************************************LINKE SEITE if ( (ododata[0]>(odomittelwertL+MITTELWERTPUFFER)) && (Luebermittelwert!=TRUE) ) //wenn ein schwarzes feld vor dem sensor ist... { //..und eben nicht auch schon war.. Lswcount++; // zähle einen übergang Luebermittelwert=TRUE; //und merke dirs für nächste runde } if ( (ododata[0]<(odomittelwertL-MITTELWERTPUFFER)) && (Luebermittelwert!=FALSE) ) { Lswcount++; Luebermittelwert=FALSE; } //****************************************RECHTE SEITE if ( (ododata[1]>(odomittelwertR+MITTELWERTPUFFER)) && (Ruebermittelwert!=TRUE) ) { Rswcount++; Ruebermittelwert=TRUE; } if ( (ododata[1]<(odomittelwertR-MITTELWERTPUFFER)) && (Ruebermittelwert!=FALSE) ) { Rswcount++; Ruebermittelwert=FALSE; } //***************************************Aufsummieren odosummeL=odosummeL+ododata[0]; odosummeR=odosummeR+ododata[1]; } //FORSCHLEIFE ENDE+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ odomittelwertL=odosummeL/ODOZYKLEN; //neuer Mittelwert wird ermittelt odomittelwertR=odosummeR/ODOZYKLEN; odosummeL=0; //...nächste runde neue summe odosummeR=0; //Geschwindigkeit des rechten Motors wird angepasst //(der rechte meines Asuros ist stärker) //der Linke bleibt immer auf Anfangsgeschw. if (Lswcount>Rswcount) Rmotorspeed=(Rmotorspeed+5); if (Lswcount<Rswcount) Rmotorspeed=(Rmotorspeed-5); if (Rmotorspeed<100) Rmotorspeed=100; //obere und untere grenze if (Rmotorspeed>250) Rmotorspeed=250; MotorSpeed(Lmotorspeed,Rmotorspeed); } int main() { start(); while(1) { reglespeed(); } return(0); }
EDIT:meine kommentare etwas an die größe des codefensters angepasst und Titel geändert
Lesezeichen