Forum: Digitale Signalverarbeitung / DSP PID Regler.Eingangswert glätten?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Richard R. (nbger)


Bewertung
0 lesenswert
nicht lesenswert
Hallo an alle Regler-Experten,

Ich habe einen PID-Regler für die Geschwindigkeitsregelung eines 
DC-Getriebemotors (300 U/Min). Geregelt wird per Arduino.

Mein Feedback ist ein AS5600 Sensor. Der gibt 0..5V aus je nach Winkel. 
Der Arduino hat 10 Bit Analog-Eingänge, so dass ich 1024 Werte pro 360 
Grad habe. Aus der Winkeländerung pro Zeit berechne ich mir die U/Min.

Ich kann Sensorauswertung und Regler bis zu einem Takt von 10ms 
aufrufen. Allerdings jittert mein Sensor-Signal umso mehr, je schneller 
ich abtaste (hab ja nur ein paar wenige Digits pro Zeitintervall).

Jetzt meine Frage: Macht es Sinn, den Eingangswert zu glätten (z.B. 
Mittelwert) oder verschlechtere ich dadurch die Reaktionszeit meiner 
Regelstrecke?

von Lach (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Richard R. schrieb:
> oder verschlechtere ich dadurch die Reaktionszeit meiner
> Regelstrecke?

Wie schnell soll denn die Reaktionszeit sein.
Schneller als die Mechanik das kann macht keinen Sinn und führt nur zu 
Problemen.
Wie berechnest du denn aus den Messwerten deine Drehzahl, schliesslich 
sagst du du regeslt auf Drehzahl.

von Richard R. (nbger)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Lach schrieb:
> Wie schnell soll denn die Reaktionszeit sein.
> Schneller als die Mechanik das kann macht keinen Sinn und führt nur zu
> Problemen.
> Wie berechnest du denn aus den Messwerten deine Drehzahl, schliesslich
> sagst du du regeslt auf Drehzahl.

der Motor bewegt keine große Last, so dass er recht schnell reagiert. 
Ich dachte an eine Abtastung von 20ms.
Die Drehzahl berechne ich so:
Pro Takt messe ich die Zeit in Millisekunden (Arduino-Systemzeit) und 
ermittle die Differenz der Winkelstellung beim letzten Takt. Aus diesen 
beiden Werten kann ich dann eine Drehzahl berechnen.

Anbei mal eine aktuelle Aufzeichnung:

von wer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ist dein Winkelsignal überhaupt linear zum tatsächlichen Winkel?

Das muss man eigentlich kalibrieren/korrigieren, denn schon minimales 
Verschieben des Magneten gegenüber der idealen Achse sorgt dafür, dass 
das Signal "eiert".

Die Ableitung davon dann erst recht.

von Sven B. (scummos)


Bewertung
0 lesenswert
nicht lesenswert
Deine Kurve sieht jedenfalls nicht nach Rauschen aus, sondern nach 
irgendeiner systematischen Abweichung. Passt die Periodendauer dieser 
Wobbel zur Drehzahl?

von Richard R. (nbger)


Bewertung
0 lesenswert
nicht lesenswert
wer schrieb:
> Ist dein Winkelsignal überhaupt linear zum tatsächlichen Winkel?
>
> Das muss man eigentlich kalibrieren/korrigieren, denn schon minimales
> Verschieben des Magneten gegenüber der idealen Achse sorgt dafür, dass
> das Signal "eiert".
>
> Die Ableitung davon dann erst recht.

Um den Winkelsensor hab ich ein Gehäuse mit dem 3D-Drucker gemacht mit 
einem Loch genau über dem Sensor zum Zentrieren des Magneten. Der Magnet 
sitzt fest auf der Achse. Ich denke, da ist keinerlei Spiel.
Meine Mechanik selbst ist nicht optimal. Der Wellenverbinder zum Motor 
eiert ein kleines bisschen, so dass ich dadurch einen Rippel auf der 
Drehzahl habe. Nicht optimal, es ist halt nur Modellbau-Mechanik!
Trotz allem sieht mein Eingangssignal deutlich besser aus, wenn ich z.B. 
mit 50ms abtaste anstatt mit 20ms.

Blöderweise, je besser meine Auswertung wird (Datalogger), um so eher 
fallen solche "Unschönheiten" auf.

Aber Du hast recht, ich mache noch mal einen besseren Versuchsaufbau, um 
den Rippel durch die Mechanik zu eliminieren.

von wer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Lass deinen Aufbau mal ungeregelt bei konstanter Spannung laufen und 
zeichne eine Umdrehung mit möglichst hoher Abtastrate auf.

Einige kHz Samplerate sind mit analogRead() drin, wenn man in ein Array 
schreibt und erst hinterher Seriell ausgibt.

von Richard R. (nbger)


Bewertung
0 lesenswert
nicht lesenswert
Sven B. schrieb:
> Deine Kurve sieht jedenfalls nicht nach Rauschen aus, sondern nach
> irgendeiner systematischen Abweichung. Passt die Periodendauer dieser
> Wobbel zur Drehzahl?

ja genau, das könnte hinkommen! Die Kurve habe ich bei 250 U/Min 
gemacht. Wenn ich das umrechne, komme ich ungefähr auf eine Anzahl der 
Umdrehungen, die er Anzahl der Wobbel entspricht!

von wer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Richard R. schrieb:
> Aber Du hast recht, ich mache noch mal einen besseren Versuchsaufbau, um
> den Rippel durch die Mechanik zu eliminieren.

Das wird nicht funktionieren (außer durch Zufall). Selbst wenn du den 
Magnet mechanisch perfekt ausrichtests, weißt du nicht wie die 
Magnetisierung genau verläuft.

Da führt an Korrektur per Software leider kaum ein Weg vorbei, wenn man 
die Präzision braucht.

von Richard R. (nbger)


Bewertung
0 lesenswert
nicht lesenswert
wer schrieb:
> Richard R. schrieb:
>> Aber Du hast recht, ich mache noch mal einen besseren Versuchsaufbau, um
>> den Rippel durch die Mechanik zu eliminieren.
>
> Das wird nicht funktionieren (außer durch Zufall). Selbst wenn du den
> Magnet mechanisch perfekt ausrichtests, weißt du nicht wie die
> Magnetisierung genau verläuft.
>
> Da führt an Korrektur per Software leider kaum ein Weg vorbei, wenn man
> die Präzision braucht.

das heißt, ich bräuchte einen Präzisions-Drehwertgeber, um meinen AS5600 
Sensor zu kalibrieren? Das wäre dann doch etwas viel Aufwand!

von wer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Richard R. schrieb:
> ich bräuchte einen Präzisions-Drehwertgeber, um meinen AS5600 Sensor zu
> kalibrieren?

Nein, wie gesagt, einfach 1 Umdrehung aufzeichnen. Theoretisch müssten 
die Werte genau auf einer Gerade liegen.
Praktisch werden 0 und 360 Grad genau passen und dazwischen hast du eher 
eine Art S-Kurve.

Aber das alles ist natürlich nur nötig, wenn die Genauigkeit wie sie 
jetzt ist nicht reicht.

Bei deinem Plot kann ich die Skalierung nicht nachvollziehen, aber rein 
optisch sieht das für mich nach einer einwandfreien Regelung aus.

von Richard R. (nbger)


Bewertung
0 lesenswert
nicht lesenswert
wer schrieb:
>
> Nein, wie gesagt, einfach 1 Umdrehung aufzeichnen. Theoretisch müssten
> die Werte genau auf einer Gerade liegen.
> Praktisch werden 0 und 360 Grad genau passen und dazwischen hast du eher
> eine Art S-Kurve.

das funktioniert ja nur, wenn ich eine Mechanik habe, die absolut mit 
konstanter Geschwindigkeit dreht. wenn ich so eine Unwucht habe, dann 
kann ich ja nicht kalibrieren. Deswegen kam ich auf den Vergleich mit 
einem präzisen (Referenz) Drehwertgeber; aber ich verstehe jetzt, was Du 
meinst! Du gehst davon aus, dass der Geberwert bezogen auf den Winkel 
nicht ganz linear ist.

>
> Aber das alles ist natürlich nur nötig, wenn die Genauigkeit wie sie
> jetzt ist nicht reicht.

naja...das kann ich so noch nicht genau abschätzen...Fehler summieren 
sich ja auf; es kommt noch eine Positionsregelung oben drauf und die 
Mechanik hat ja noch zusätzliches Spiel. Am Ende muß ich mehrere Motoren 
miteinander synchronisieren. Außerdem lese ich den Wert ja als 
Analogwert ein. Der Arduino wird da auch nicht genau linear sein.
Besser wäre es, ich würde den Wert vom AS5600 über I2C einlesen.
Aber am Schluß brauche ich 14 Motoren. Dafür hat der Arduino Mega 
genügend Analog-Eingänge. Mit I2C wäre das aufwändig!

>
> Bei deinem Plot kann ich die Skalierung nicht nachvollziehen, aber rein
> optisch sieht das für mich nach einer einwandfreien Regelung aus.

an dem Plot muß ich noch ein bisschen arbeiten; ist ja alles selbst 
programmiert. Skalieren und Zoom sowohl in X-, als auch in Y-Richtung, 
ist alles noch nicht perfekt!

von Richard R. (nbger)


Bewertung
0 lesenswert
nicht lesenswert
p.s.
oder doch etwas einfacher. Ich könnte für einen Kalibrieraufbau einen 
kleinen Schrittmotor nehmen und die Schritte zählen. So könnte ich bei 
jedem Step den Wert vom AS5600 lesen und die Kurve aufnehmen.

von wer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Richard R. schrieb:
> Mit I2C wäre das aufwändig!

Ja, denn du kannst die Adresse nicht ändern.

Richard R. schrieb:
> das funktioniert ja nur, wenn ich eine Mechanik habe, die absolut mit
> konstanter Geschwindigkeit dreht.

Bei einigermaßen hoher Drehzahl sorgt die Massenträgheit schon dafür, 
dass die Drehung iRdM gleichförmig läuft.

Richard R. schrieb:
> Der Arduino wird da auch nicht genau linear sein.

Nein, aber sehr sicher linear genug.

Richard R. schrieb:
> Fehler summieren sich ja auf; es kommt noch eine Positionsregelung

Nein, durch das Integrieren heben sich die Schwankungen langfristig ja 
näherungsweise auf.
Schlimmer wirds durch Ableiten, wie du am Geschwindigkeitssignal siehst.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.