Hallo mausi_mick,

Zitat von
mausi_mick
... Anfahrverhalten und das Abbremsen am Ende noch nicht optimal ...
Ich habe ja leider seit Monaten den asuro beiseite gelegt und viel an meinem Dottie gebaut. Dabei hatte ich aber (auch) sehr viel Wert auf die Regelung gelegt und hatte damit einigen Aufwand. Mittlerweile läuft die Regelung mit 405 Hz (hat sich so ergeben) recht ordentlich - alles integer, weil mit FP der Zeitaufwand viel zu hoch ist.
Ich hatte mir die Zeitkonstanten der einzelnen Motore bestimmt aus der Sprungantwort und dann ein bisschen an den Faktoren rumgepopelt. Die Motore fahre ich "entlang" der Sprungantwort hoch und stelle fest, dass das ihrer Lebensdauer bekommt (sind ja diese 5ervos ohne irgendeine eigene Elektronik, nur mein 2-Blatt-Encoder) - aber in rund 20 ms ist die Drehzahl (und die Regelung) da - wenn etwa 50 .. 70 % volle Drehzahl angesteuert wird. Ok, ich habe im Dottie einen mega168 mit 20 MHz.
Code:
/* === Regelungsroutine für Motor 12 ========================================== */
/* Die gemessene Zeitdifferenz Iz_diff0 wird zur Regelung verwendet
*/
void rgl_mo_12(void) // (Wird) Regelung für Motor 12
{
// PORTC |= (1<<PC4); // LED auf PC4/I2C/SCA einschalten = Start ISR
// PORTC &= ~(1<<PC4); // LED auf Port PC4/I2C/SCA ausschalten
// PORTC ^= (1<<PC4); // Zeitmessung: LED auf Port PC4/I2C/SCA toggeln
// Anmerkung für mausi_mick:
// tupsi = T imer U nits P er S ensor I nterrupts, Sensor = Encoder
// stupsi = Soll-tupsi
// stupsi12 = Soll-tupsi für Motor 12 (12 = Ausgänge des L293D)
// idrz = Ist-Drehzahl
//
if (stupsi12 <= 5) // Soll überhaupt gefahren werden?
{
OCR0A = 0;
return;
}
tupsi12 = Iz_diff0; // Übernahme Iz-Wert in Regelung
ndrz12 = stupsi12;
if ( tupsi12 > 100 ) { tupsi12 = 100; } // Eingrenzen
idrz12 = 1000 / tupsi12;
ie_mot12 = ndrz12 - idrz12; // Vergleich => Regelabweichung
iesum12 = iesum12 + ie_mot12;
if (iesum12 < -10) { iesum12 = -10;}
if (iesum12 > 500) { iesum12 = 500;}
iy12 = iesum12/2;
iy12 = iy12 + ie_mot12 + ie_mot12 + ie_mot12 + ie_mot12 + ie_mot12;
// Diese Rechenoperation benötigt in float 0,20 bis 0,25 ms!
if ( iy12 < 0 ) { iy12 = 0;}
if ( iy12 > 255 ) { iy12 = 255;}
OCR0A = iy12; // Ansteuerung der PWM direkt statt "setPWMlinks"
// PORTC ^= (1<<PC4); // "war-hier-Signal": LED auf PC4 toggeln
return;
}
/* ============================================================================== */
Meine Fähigkeiten in C (heisst bei mir immer noch Cäh) sind zwar recht gering und mein Code ist schauderhaft (nach interner Mitteilung eines Forummitglieds *ggggg*), aber vielleicht hilft Dir das etwas?
Lesezeichen