AUFRUF
an die Regelungsexperten.

Mit diesem Code bemühe ich mich, die beiden Motoren meines MiniD0 gleichmässig auf die geforderte Geschwindigkeit einzuregeln.
Code:
// =================================================================================
// ===  HAUPTProgramm ==============================================================
// Initialisierungen, LED1 kurzblinken als Signal für Programmstart,
.....
  Kp12         =    2;  // Regelfaktor P-Anteil !!! Divisor ### war 5 (=1/5), dann 4
  Kp34         =    2;  // Regelfaktor P-Anteil !!! Divisor
  Ki12=Ki34    =   30;  // Regelfaktor I-Anteil !!! Divisor
  Kd12=Kd34    =    4;  // Regelfaktor D-Anteil !!! Divisor
.....                          
// =====  Ende des main =====
// ================================================================================


// =================================================================================
// ===  Regelungsroutine für Motor 34  =============================================
// Die gemessene Zeitdifferenz Iz_diff1 zwischen zwei Encoderinterrupts
//   wird zur Regelung verwendet
                                  
  void rgl_mo_34(void)          // Regelung für Motor 34
{                                 
                                  
  if (sspeed34 <= 15)           // Soll überhaupt gefahren werden?
  {                               
    OCR0A = 0;                  // Unter x mm/s soll nicht gefahren werden
    return;
  }                            
  tupsi34      = Iz_diff1;              // Übernahme Iz-Wert in Regelung
  ndrz34       = sspeed34;                
                                          
  ix34         = 8300 / tupsi34;        // => Ist-Geschwindigkeit in mm/s
  ie_mot34     = ndrz34 - ix34;         // Vergleich => Regelabweichung
                                          
  if (tupsi34 > 500) {tupsi34 = 500;}   // 22apr09-0847 Begrenze auf 500 statt 250
                                          
  isum34      += ie_mot34;                 
  if  (isum34  < -1000) { isum34  = -1000;}
  if  (isum34  >  1000) { isum34  =  1000;}
                                  
  iyp34        = ie_mot34 / Kp34;       // P-Anteil berechnen; Kptheor = 0,25 !!
  iyi34        = isum34 / Ki34;         // I-Anteil berechnen
  iyd34        = (ie_mot34 - ie_alt34) / Kd34;         // D-Anteil berechnen
                                   
  iy34         = iyp34 + iyi34 + iyd34;	// Gesamtkorrektur berechnet
                                  
  ie_alt12     = ie_mot12;
                                
  if ( iy34    <   0 )   { iy34   =    0;}
  if ( iy34    > 255 )   { iy34   =  255;}
                                    
  OCR0A = iy34;                 // Ansteuerung der PWM direkt statt "setPWMxxx"
//  PORTC ^=  (1<<PC4);           // "war-hier-Signal": LED auf PC4 toggeln
                                    
  return;                          
}               
/* ============================================================================== */
Das obige Video zeigt, dass mit meiner Odometrie und dieser Regelung die Fahrt recht genau sein kann. Es gibt natürlich auch andere Videos - maximale Abweichung nach Rückkehr des MiniD0 rund 3 cm - nach etwa insgesamt 80 cm Fahrtstrecke (ohne Turn gerechnet), mit vier und 1/4 Vollkreisen, der 180°- und der 90°-Kurve. Sprich: die Reproduzierbarkeit der Fahrten ist unbefriedigend. Die Abweichungen haben wohl mehrere Gründe:

1) Ungleiches Anfahren aus dem Stillstand. Als Abhilfe habe ich jedesmal beim Anfahren die PWM für einen Zyklus auf 250 gestellt . . .
2) Mir fehlt natürlich die Kopplung der Antriebe bzw. eine Art Software-Differential, mit dem ich Nachhinken oder Vorlauf eines Antriebs in die Regelung bzw. die Vorgaben des anderen Antriebs übertragen kann. Dies könnte ja im schlimmsten Fall zu unkontrollierbaren Schwingungen führen.

Frage: Wie mache ich so eine softwareseitige Verbindung der jeweiligen Abweichungen der beiden Antriebe - mit der die Fahrstrecken z.B. alle fünf bis 20 mm (hier also etwa fünf bis 20 Regelzyklen oder mehr) aufeinander abgestimmt werden können?