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.
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);
}
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