- 3D-Druck Einstieg und Tipps         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: Probleme mit PID-Regelung (Drehzahl)

  1. #11
    HaWe
    Gast
    Anzeige

    Praxistest und DIY Projekte
    Der P-Anteil integriert den Wert (Soll - Ist) Da diese Differenz zwischen den Abtastungen konstant bleibt, erhöht der P-teil bei jedem Aufruf die Stellgrösse, ohne zu bemerken, was die letzte Änderung des Stellwerts ausgerichtet hat.
    hier meinst du sicher den I-Anteil (I=Integral=Summe aller bisherigen Fehler),

    I vergisst zum Einen nichts (alte Werte werden als Teil der Fehler-Summe ewig mitgeschleppt, wenn sie nicht intern im Algorithmus gedämpft werden), und daher ist I auch sehr träge und reagiert folglich (als Teil aller PID-Parameter im Gesamtzusammenhang) vor allem bei relativem Stillstand der Regelung ("Verrecken kurz vor dem Ziel").
    Da die Abtastfrequenz des OP sehr gering ist, wird daher I dermaßen langsam reagieren, dass sich erst nach -zig Sekunden oder gar Minuten der Stellwert ändert, und daher kann man eigentlich hier I von vornherein auf Null lassen: damit wird das Ganze zum PD-Regler, der auch sicher für diese Zwecke ausreicht.

  2. #12
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    Zitat Zitat von HaWe Beitrag anzeigen
    hier meinst du sicher den I-Anteil (I=Integral=Summe aller bisherigen Fehler),
    Sorry, war ein Typo. Habe es korrigiert, also nicht wundern, weil das Zitat nicht mehr stimmt.

    - - - Aktualisiert - - -

    ich habe jetzt die Bibliothek nochmals genauer unter die Lupe genommen.

    Der Regler rechnet stur alle, Default 200ms, alles durch. Im obigen Fall merkt er aber nicht, dass sich der Ist-Wert nur alle 2s ändert.
    Der Regler rechnet also nach 200ms nochmals mit dem alten Ist-Wert und kommt zum Schluss, dass die letzte Änderung des Stellwertes nichts gebracht hat .....

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  3. #13
    Benutzer Stammmitglied
    Registriert seit
    08.06.2017
    Beiträge
    37
    Welche Einheiten haben denn deine Kp/Ki/Kd-Faktoren?
    Deine Reglereingangsgröße kommt als Drehzahl, also in 1/min, 1/s etc. pp.
    Was ist deine Stellgröße? Eine Spannung? Strom? PWM-Tastverhältnis?

    Mach dir darüber erstmal Gedanken, dann kann man die Größenordnung der Reglerparameter für gewöhnlich schonmal durch reines Nachdenken abschätzen.
    Aus deinem Startpost entnehme ich mal dass du willkürliche Werte für Kp gewählt und dann vervielfacht hast. Bist du bei den anderen Parametern genauso vorgegangen?


    Also irgendwie kommen mir die Werte so "klein" vor.
    Aber D darf ich nicht größer als 0 machen. Dann dreht das Teil völlig am Rad und fängt wie wild an zu schwingen.
    Siehe oben. Ohne Information über die Größenordnung und Einheit der Ein- und Ausgangsgrößen wertlose Informationen.
    Vielleicht liegen die idealen Reglerparameter für deinen Anwendungsfall ja bei Kp=0.00001, Ki=0.004, Kd=0.000000003?

  4. #14
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.652
    Hallo Andreas.
    .. Ich versuche gerade einen bürstenlosen Außenläufer .. zu regeln. Ziel ist es zunächst, das eine Drehzahl gehalten wird ..
    Als ich vor dieser Aufgabe stand, hatte ich mal im RNWissen nachgesehen - da gibts eine sehr gute Abhandlung über Regelungstechnik. Das muss man nicht (aber kann es) durcharbeiten. Besonders für Dich wichtig ist der Abschnitt über digitale Regler. Dort gibts dann im nachfolgenden Kapitel auch Ratschläge zur experimentellen, geschätzten oder regelrechten Bestimmung der Regelfaktoren.

    Meine erste Notiz, damit auch der Beginn meiner Reglersoftwarekonstruktion, dazu war ein Aufzeichnen (m)eines Regelkreises

    ......Bild hier  

    mit den zugehörigen Werten (siehe auch hier) - zu guten Teil stehen da meine Variablennamen.

    Folge: das entsprechende Wägelchen fährt dann mit zwei UNABHÄNGIG von einander angesteuerten, getrennten Motoren bei Vorgabe gleicher WErte schnurgeradeaus *ggg*.
    Ciao sagt der JoeamBerg

  5. #15
    Benutzer Stammmitglied
    Registriert seit
    08.03.2010
    Beiträge
    66
    Zitat Zitat von Peter(TOO) Beitrag anzeigen
    Sorry, war ein Typo. Habe es korrigiert, also nicht wundern, weil das Zitat nicht mehr stimmt.

    - - - Aktualisiert - - -

    ich habe jetzt die Bibliothek nochmals genauer unter die Lupe genommen.

    Der Regler rechnet stur alle, Default 200ms, alles durch. Im obigen Fall merkt er aber nicht, dass sich der Ist-Wert nur alle 2s ändert.
    Der Regler rechnet also nach 200ms nochmals mit dem alten Ist-Wert und kommt zum Schluss, dass die letzte Änderung des Stellwertes nichts gebracht hat .....

    MfG Peter(TOO)
    Das verstehe ich nicht. Eigentlich rechnet er mit myPID.Compute();

    Zu den Stellgrößen:
    Da ich den Motor mittlerweile direkt an den Arduino-Regler angeschlossen habe und für die PWM die Lib "Servo" verwende, muss ich nun leider Wete von 0-180 angeben.
    Wobei 90 die Mitte, also 1500µs darstellt.

    ich lasse den PID-Regler für mich verständliche Werte in µs ausgeben:
    myPID.SetOutputLimits(1538, 1800);
    Die 1538µs sind kurz vor der langsamsten Drehzahl.

    Dann mappe ich den ermittelten Wert auf das, was die Servo LIB benötigt:
    myservo.write(map(servoval, 1000, 2000, 0, 180));

    Welche Einheit oder Größe P, I, und D haben weiß ich nicht. Es sind für mich einheitslose Faktoren.

    Mag ich gar nicht, da ich durch diese bekloppte 0-180 Grenze Genauigkeit verliere.
    Ich könnte das auch selber machen ohne die Servo LIB, aber dann muss ich mit millis(); arbeiten.
    Aber in der Vergangenheit hatte ich immer den Eindruck, das Millis(); und Micros(); abweichungen von mehreren 1/10 sek hat.
    Wobei man bei den fertigen libs ja nie so genau weiß, ob da nicht irgend wo nen delay drin ist....Was das dann verursacht.
    Ich weiß auch nicht wie das bei UART und I2C in Verbindung mit Millis(); und Micros(); aussieht...Aber ich schweife ab.

    Ich hatte zunächst die Drehzahl entweder alle 200000 durchläufe oder alkle 2 Impulse berechnet.
    Das hatte den Vorteil, das ich sowohl langsame, als auch schnelle Drehzahlen gut berechnen konnte.
    Den PID-Regler habe ich unmittelbar nach der Messung gefüttert.
    Das hatte zur folge, das, je schneller der Motor drehte, der PID auch öffter rechnete.

    Da ihr aber meintet, zeitliche abtastung wäre besser, habe ich jetzt alle 1000 Zyklen festgelegt.
    Damit kann ich drehzahlen unter circa 600 u/min nicht mehr erfassen. Aber ist nicht so schlimm.
    Das hat jetzt auch den Nachteil, das ich mir die aktuelle Drehzahl nicht mehr via UART ausgeben kann, da UART nicht mehr funktioniert.
    Später wird das mögl. weise noch ein Problem. Ob I2C noch funktioniert...keine Ahnung.

    Wenn ich das aber alles ignoriere und so tue als ob die Kommunikation nur in eine Richtung laufen müsste hat es jetzt folgendes ergeben:
    D darf ich immer noch nicht >0 setzen. Nach wie vor dreht das Teil komplett am Rad, wenn ich es nur wage.
    Ohne I schwingt er etwas, mit I kaum.
    In nur 1-2 Sekunden hat er die neue Drehzahl erreicht (welche das ist, k.a. da UART ja nicht mehr funktioniert)
    Also im prinzip ist es jetzt wie vorher, nur das ich statt P=0.03, I=0.04 jetzt P=0.02, I=0.03 habe.

    Was mir letztendlich komisch vorkommt, wieso darf ich bloß D nicht verwenden....
    Ich habe gelesen das ein double auf dem Arduino auch nicht mehr wie 2 Nachkommastellen hat, oder?
    Sonst hätte man es ja mit 0.001 versuchen können... Vielleicht ist 0.01 schon der Vorschlaghammer.



    ------Ergänzung-------
    Der Motorsteller ist ein gewöhnlicher Steller aus dem Modellbaubereich.
    Er erwartet ein PWM-Signal von etwa 1000-2000 µs
    Wobei 1500µs +- ~30 den Totbereich um den Stillstand des Motors darstellen.
    >1500 gilt als Vorwärtslauf, <1500 gilt als Rückwärtslauf
    Geändert von MechMac (29.08.2017 um 19:48 Uhr)

  6. #16
    HaWe
    Gast
    double ist bei Arduino AVRs das selbe wie float, und float hat ca. 6-7 Dezimalstellen Genauigkeit, gemessen ab der 1. signifikanten Stelle ab der letzten führenden Null.
    Sie werden bei Arduino Serial nur bei der Ausgabe nie alle angegeben, sondern immer nur 2 Nachkommastellen, es sei denn, du forderst diese Genauigkeit ausdrücklich.
    Intern wird aber immer mit allen Stellen gerechnet.


    ps,
    du kannst die Sample Time definieren mit (wer hätte's gedacht) SetSampleTime(int milliseconds)
    https://playground.arduino.cc/Code/P...ySetSampleTime

    sie muss also nicht so wie per default bleiben.

  7. #17
    Benutzer Stammmitglied
    Registriert seit
    08.06.2017
    Beiträge
    37
    Das verstehe ich nicht. Eigentlich rechnet er mit myPID.Compute();
    Nein!
    Deine PID Library rechnet, sofern möglich, mit der eingestellten Taktung. Default sind glaube ich alle 100ms, also 10Hz.
    Bei jedem Ausführen der PID.Compute() fragt die Library ab, ob die Berechnung erfolgen soll oder nicht, also ob seit der letzten Berechnung eine Sampletime abgelaufen ist. Daher solltest du PID.Compute unabhängig von der eingestellten Sampletime so oft wie möglich ausführen.

    Da ich den Motor mittlerweile direkt an den Arduino-Regler angeschlossen habe und für die PWM die Lib "Servo" verwende, muss ich nun leider Wete von 0-180 angeben.
    Die Library hat auch einen Befehl um die Einschaltzeit des PWM-Signals auszugeben statt eines Winkels. Nutze ich immer so.
    Der Befehl lautet servo.writeMicroseconds(1500).

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. 10A Mikroschrittkarte - Probleme mit Strom-Regelung
    Von Kaiser-F im Forum Elektronik
    Antworten: 84
    Letzter Beitrag: 07.12.2010, 18:39
  2. Regelung mit PIC
    Von Shunth im Forum PIC Controller
    Antworten: 4
    Letzter Beitrag: 25.06.2010, 20:49
  3. Antworten: 4
    Letzter Beitrag: 04.11.2008, 17:39
  4. PWM-Regelung
    Von eis im Forum Elektronik
    Antworten: 0
    Letzter Beitrag: 20.05.2007, 11:03
  5. Antworten: 13
    Letzter Beitrag: 17.09.2004, 20:09

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad