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?
Lesezeichen