1. PID-Reglern einfach den kompletten Regelparametersatz vor die Füße zu schmeißen und auf ein gutes Ergebnis zu hoffen, funzt in der Regel nicht. Setz mal iGain und dGain zuerst auf 0 und erhöhe pGain langsam, bis Ist möglichst nahe am Soll landet und nicht überschwingt.
2. Der Tausch von Ist und Soll bei der Übergabe tauscht zwar das Vorzeichen von "error", für "position" wird dann allerdings der Sollwert weiter verwendet. Zumindest der dTerm wird damit zum Quatsch.
3. Auch ohne Verständnis der ganzen Mathematik eines PID sollte man zumindest mal grob abschätzen, was der Code treibt.
Mit
pGain=120,
referenceValue=x
measuredValue = x+/-2
hängt Deine PWM bereits bei einem error=+/-2 voll am jeweiligen Anschlag pwmMin/pwmMax.
Also: Zuerst einmal den Debugger/Simulator mit Testwerten bemühen und daran testen, ob die Funktion auch das zurückgibt, was Du erwartest/ selber errechnet hast. Ansonsten siehst Du den Wald vor lauter Bäumen nicht.
Nachtrag: Diese Richtungsdreherei passt man üblicherweise durch Wechsel der Vorzeichen in den Regelparametern an.
In der Realität ist, wenn Ist<Soll, der Fehler negativ (z.B. ich liege um -10° am Soll vorbei). Wenn die Stellgröße jetzt aufgedreht werden müsste, ginge das nur über negative Regelparameter (z.B. iGain=-0.8 ).
Es ist jetzt nicht so, dass es den Quellcode stört, wenn sämtliche Berechnungen und Parameterangaben, wie oben angewendet, im Vorzeichen getauscht werden. Zur Klarheit der Sache trägt diese Optimierung allerdings nicht bei.
Lesezeichen