AUFRUF
an die Regelung***perten.
Mit diesem Code bemühe ich mich, die beiden Motoren meines MiniD0 gleichmässig auf die geforderte Geschwindigkeit einzuregeln.
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: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; } /* ============================================================================== */
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?







Zitieren

Lesezeichen