PI Regler

Hallo zusammen,

leider kenne ich mich in Sachen Regelungstechnik nicht gerade gut aus und digital schon garnicht :frowning:
Trotzdem würde ich gerne via µC einen DC Motor (0…8V) ansteuern.
Ich meine mich daran zu erinnern, das ein PI Regler keine Regeldifferenz aufweist und deshalb dachte ich, dass das der perfekte Regler für mich ist.
Wie kann ich denn nun solch einen Regler als Softwarefunktion nachbilden? Gibt es dafür Algorithmen (wenn ja, wo finde ich die)? Ist ein PI Regler überhaupt geeignet für mein Vorhaben?

Danke schon im Voraus für Eure Hilfe.

Gruss, Tobi

Hallo Tobi,

leider kenne ich mich in Sachen Regelungstechnik nicht gerade
gut aus und digital schon garnicht :frowning:
Trotzdem würde ich gerne via µC einen DC Motor (0…8V)
ansteuern.

Ich meine mich daran zu erinnern, das ein PI Regler keine
Regeldifferenz aufweist

Zumindest nach der Einscheingzeit.

und deshalb dachte ich, dass das der
perfekte Regler für mich ist.

Über dein Problem hast du noch gar nichts geschrieben … ??

Wie kann ich denn nun solch einen Regler als Softwarefunktion
nachbilden? Gibt es dafür Algorithmen (wenn ja, wo finde ich
die)?

Die Stellgrösse berechnest du direkt aus dem Sollwert und der Abweichung zwischen Soll- und Istwert.
Dann musst du die Differenz zwischen Soll- und Istwert in festen Zeitlichen Abständen erfassen und aufaddieren. Diesen Wert addierst du dann zu deiner berechneten Stellgrösse dazu.

Ist ein PI Regler überhaupt geeignet für mein Vorhaben?

Schreibe mal, was dein Vorhaben eigentlich ist, dann kann man auch etwas dazu sagen.
Ein Regelkreis besteht aus einem Sensor, dem Regler und einem Stellglied. In deinem Fall müsstest du noch die Drehzahl oder den Strom oder weiss ich nicht was messen um überhaupt regeln zu können.

MfG Peter(TOO)

Stimmt, meine Angaben sind sehr dürftig.

Es geht um einen Schieberegler, der mit einem Motor betrieben wird. Der DC Motor wird mit 8V angesteuert (ich hab mich also auch noch falsch ausgedrückt mit 0 bis 8v…naja). Der Schieberegler ist ein Spannungsteiler, an dem 0 bis 5V anliegen können (jetzt stimmts aber *g*). Diese Spannung wird über einen AD Wandler (8Bit) in Werte von 0 bis 255 gewandelt.
Ich möchte also meiner Routine einen Wert von Null bis 255 vorgeben können und der Motor (der const. mit 8V gespeist wird) soll auf diese Position fahren.
Der Motor muss also so lange vor bzw. zurückfahren, bis am Spg Teiler die Spannung zum zugehörigen Wert anliegt.
Ich hoffe Du kannst mit dieser kurzen Beschreibung etwas anfangen.

Gruss, Tobi

Hallo,

für ein so triviales Problem brauchst Du nicht erst noch
Regelungstechnik studieren, es sein den, das ganze soll
mit max. Geschwindigkeit gehen und Du mußt die ganze
Theorie dazu darlegen :wink:

Zum Problem an sich:
Ich nehme an, der Anstrieb ist ein Getriebemotor mit
entsprechend großer Übersetzung, oder?

1.Die Ansteurung der Motors machst Du mit Impulsen
 -\> PWM = Pulsweitenmodulation.
2.Wenn die Abweichung vom Istwert zum Sollwert groß ist,
 dann kannst Du den Motor mit max. Geschwindigkeit
 losfahren lassen.
3.Da der Zusammenhang zwischen Position = Spannungswert
 und Stellzeit recht gut liniear sein sollte, kannst
 Du auch die Zeit bestimmen, die nötig ist, um die
 Sollpos. anzufahren. Die Kennlinie ist natürlich etwas
 abhängig von den Umgebungsbedingungen, aber für ein
 recht zügiges Anfahren der Sollpos. kann hilfreich sein.
4.Wenn die Diff. einen gewissen Wert unterschreitet,
 läßt Du den Motor langsamer laufen (Puls-Pausenverhältnis
 anpassen).
5.Wenn die Diff. sehr klein ist, nur noch mit einzelnen
 kurzen Impulsen arbeiten, bis Istwert = Sollwert ist.
6.Auf Grund von Rauschen, Vibration und externen Störungen
 kann es passieren, daß der Istwert ständig um den
 Sollwert schwankt. -\> Tiefpaß bilden und eine kleine
 Hysterese einbauen (also z.B. erts nachstellen, wenn
 die abweichung \> 3 Digit ist).
7.Beim Stellen wirst Du auch feststellen, daß bei Umkehr
 der Richtung wegen Spiel im Getriebe eine Totzeit
 auftritt. Entweder kannst Du sowas verhindern, indem Du
 das Getriebe spielfrei machst (z.B mit Feder vorspannen).
 oder Du berücksichtigst dies im Algorythmus
 -\> z.B. nach jeder Richtungsumkehr eine def. Impulszeit
 den Motor fahren lassen und dann erst die Impulse
 wieder verkürzen.
8.Die kürzeste Pulszeit, die möglich ist, kannst Du durch
 Ausprobieren ermitteln. Nach meiner Erfahrung sind mind.
 ca. 10ms...20 nötig, damit der Motor sich tatsächlich
 bewegt.

Gruß Uwi

Stimmt, meine Angaben sind sehr dürftig.

Es geht um einen Schieberegler, der mit einem Motor betrieben
wird. Der DC Motor wird mit 8V angesteuert (ich hab mich also
auch noch falsch ausgedrückt mit 0 bis 8v…naja). Der
Schieberegler ist ein Spannungsteiler, an dem 0 bis 5V
anliegen können (jetzt stimmts aber *g*). Diese Spannung wird
über einen AD Wandler (8Bit) in Werte von 0 bis 255 gewandelt.
Ich möchte also meiner Routine einen Wert von Null bis 255
vorgeben können und der Motor (der const. mit 8V gespeist
wird) soll auf diese Position fahren.
Der Motor muss also so lange vor bzw. zurückfahren, bis am Spg
Teiler die Spannung zum zugehörigen Wert anliegt.
Ich hoffe Du kannst mit dieser kurzen Beschreibung etwas
anfangen.

Gruss, Tobi

Hallo Tobi,

habe dein Posting erst jetzt gelesen, daher eine späte Antwort. Nein, einen PI Regler brauchst du nicht. Du hast ja einen so genannten „Abtastregler“ mit deinem µC (ist das übrigens ein CControl? Mit dem realisiere ich nämlich gerade einen PD-Regler für meine Heizung). Und ein Abtastregler kann so konstruiert werden, dass er keine bleibende Regelabweichung hat! Uwi hat schon einige zu beachtende Dinge geschrieben. Allerdings meine ich, dass du es einfacher hast, wenn du den Motor einfach ansteuerst, bis du keine oder nur eine vorgegebene geringe Abweichung hast.
Ich steuere so den Mischermotor meiner Heizung an. Abhängig von der Regelabweichung lasse ich den Motor ein Stück laufen (auf oder zu), wobei

 Laufzeit = P-Faktor \* Regelabweichung

ist. „P-Faktor“ ist ein Proportionalitätsfaktor, den ich experimentell bestimmt habe. Das wiederholt sich im Minutentakt. Du kannst natürlich einen kürzeren Takt nehmen, der aber länger sein sollte als die Motorlaufzeit - das ist ein bisschen Probiererei, das einzustellen.
Zur Ergänzung: Leider ist in meiner Regelstrecke + Temperatursensor (Vorlauftemp.) eine Totzeit von ca. 2 min, dann noch eine Zeitkonstante von mehr als 5 min. Das fange ich ein bisschen mit einem D-Anteil ab, soll heißen, ich messe die Temp.differenz zwischen aktuellem und vorherigen Takt. Je größer diese ist, desto mehr Korrekturfaktor muss ich einfügen, damit die Temp. nicht weit über den Sollwert hinausschießt, volkstümlich ausgedrückt: ich steuere rechtzeitig gegen. Damit ergibt sich folgende Berechnung in jedem Takt:

 Laufzeit = P-Faktor \* Regelabweichung - D-Faktor \* (Temp.aktuell - Temp.vorher)

Das Ganze sind nur eine handvoll Codezeilen!

So, ich hoffe, das war jetzt nicht zu viel :wink:)

Gruss, Stucki