meine ersten Ideen:
Einheit aller Timestamps immer in identischen Einheiten berechnen (also immer micros oder immer millis)
Du solltest die Zeit pro Schleifendurchlauf exakt stoppen (machst du glaube ich per cycletime)
Ta müsste exakt die Dauer des aktuellen Schleifendurchlaufs sein, also Ta=(float)cycletime (kannst du auch direkt einsetzen, ohne zusätzliches Ta)
Die delays pro Schleife würde ich so wählen, dass ca. 10 millisec = 10000 micros pro Schleife anfallen
Kp, Ki und Kd können theoretisch durchaus Werte zwischen 0.001 bis 1000000 annehmen, also nicht begrenzen
Ki allerdings neigt zu übermäßigem Aufsummieren, daher zusätzlich mit einem Dämpfungsfaktor multiplizieren:
esum = 0.7*( esum + e);
edit:
der Dämpfungsfaktor (hier 0,7) mag irgendwo zwischen 0,5 und 0,9 liegen
Lesezeichen