PID Regler

Hallo ihr Lieben,

ich möchte mit einem Arduino Nano eine Servoelektronik programmieren.
Den P-Regler habe ich verstanden. Beim I-Regler wird die abweichungsdauer gemessen und gegengesteuert. Den D-Regler habe ich nicht verstanden, dass er in die Zukunft guckt. Hat jemand eine gute Erklärung? Das Servo soll durch einen E-Motor mit Fahrtenregler und Poti aufgebaut werden. Hat vielleicht jemand einen Code zum probieren von Kp, Ki, Kid?

(deleted)

Den D-Regler habe ich nicht verstanden, dass er in die Zukunft guckt

Das würde ich auch nicht verstehen.
Der I Anteil berücksichtigt Abweichung * Zeit (wie du es auch verstanden hast),
der D Anteil berücksichtigt die Änderung der Abweichung (je Zeiteinheit).
Bremst also schonmal im Voraus, wenn die Regel-Abweichung schnell kleiner wird.
Oder hält mehr dagegen, wenn die Abweichung größer wird.

Das Servo soll durch einen E-Motor mit Fahrtenregler und Poti aufgebaut werden

Das wiederum verstehe ich nicht. Was willst du anders machen als bei einem fertigen Servo?

Hi, ich möchte Servos mit beliebigem E-Motor aufbauen können.

Hi

Gibt's schon - nennt sich 'Servo-Antrieb' und kostet ein Schweinegeld!
Sorry - Der musste sein :wink:

Lass Dich nicht aufhalten - ein schnell aber präzise einstellbaren DC (oder BLDC) Motor könnte ich auch noch gebrauchen.

Zu PID gibt's tausende Seiten in den Tiefen des WWW.
nimm Dir Eine davon, Die Dir halbwegs zusagt und bastel die Formeln im Arduino nach.
Wichtig für I und D ist der gleichmäßige Aufruf, da hier ja die Zeit mit rein spielt (oder man müsste Das kitten, indem man die Zeit auch noch verrechnet ... besser, für Regelmäßigkeit sorgen, macht die Berechnung auch schneller)

MfG

bastel die Formeln im Arduino nach

...und/oder schau dir den fertigen Arduino PID-Regler zumindest mal an.
Ich fürchte, je nach Motor und Last musst du die Regelparameter anpassen.

Hi, ich konnte ein Projekt bei Google mit Inkrementalgeber(Encoder) finden. Leider nichts mit Poti. Hat jemand funktionierenden Code?

Hi

Dazu wäre vll. ein Link durchaus toll gewesen - vll. suchen Andere ja 'nur' Etwas mit Encoder.

Wo ist Dein Problem, den Zählerwert des Encoder durch den analogRead des Poti zu ersetzen?

MfG

"Wo ist Dein Problem, den Zählerwert des Encoder durch den analogRead des Poti zu ersetzen?"

Ja, genau das ist mein Problem.

volatile int lastEncoded = 0; // Here updated value of encoder store.

Würde schauen, wo diese Variable verarbeitet wird.
Da der Encoder an zwei ISR-Pins hängt, wird sich die ISR (oder zwei davon) um das Zählen kümmern.
Unterm Strich kommt ein Zählerstand heraus - Der allerdings um Vieles größer ist, als Dir der ADC liefern kann.

Jupp - encoderValue wird dem PID als SOLL vorgeworfen - scheint so, daß die Library die Variable 'input' zwingend braucht.

  • Schmeiße die ISR und die attachInterrupt raus. (Zeile 34,35,78-90)
  • input=analogRead(PotiPin); (Zeile 61)

Gucken, was passiert.

mfG

Ok, danke, werde ich gleich probieren, wenn ich meinen Lötkolben gefunden habe.

Liebe Grüsse