ADR
29.03.2007, 03:05
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.
#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;
}
//***************************************Aufsummiere n
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);
}
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.
EDIT:meine kommentare etwas an die größe des codefensters angepasst und Titel geändert
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.
#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;
}
//***************************************Aufsummiere n
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);
}
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.
EDIT:meine kommentare etwas an die größe des codefensters angepasst und Titel geändert