Forum: Mikrocontroller und Digitale Elektronik PID Drehzahlregelung AVR DC-Motor / Skalierung


von Markus B. (scrap)


Lesenswert?

Hallo Community

Ich habe schon ganz viel über den PID Regler gelesen aber irgendwie 
verstehe ich es nicht.

Folgendes Szenario:
Ich möchte eine genaue Drehzahlregelung für ein Masselaufwerk 
(Plattenspieler) machen.
Ich habe eine Codescheibe mit 72 Segmenten, hier messe ich mit einer 
Reflexlichtschranke über den ICP Eingang die Zeit und kann damit die 
Drehzahl berechnen, dies funktioniert einwandfrei.
33 1/3 upm enspricht 100 000 Ticks für die Zeit

Als Ausgang habe ich einen 12bit DA-Wandler, welcher über einen 
LeistungsOPV analog den Motor stellt (Spannungsmäßig), dies funktioniert 
auch einwandfrei.

Nun fehlt mir aber der Ansatz den Motor zu regeln.
Das Problem ist aber, dass ich ja nicht weiß bei welchem Ausgang, welche 
Drehzahl herauskommt.
Die meisten Beispiele die ich gefunden habe waren darauf ausgelegt 
irgendeine Position zu erreichen und dann dort stehen zu bleiben.

Wenn in meinem Fall aber IST>SOLL kommt ein negativer wert für den 
Ausgang raus und wenn IST=SOLL wird der regler auf 0 gesetzt, was ja 
auch quatsch ist.

Der Bascomcode ist nach dem Motto:

E = 33.33333333 - Drehzahl
Esum = Esum + E

Proportionalteil = Kp * E

Integralteil = Ki * Ta
Integralteil = Integralteil * Esum

Differentialteil = E - Ealt
Differentialteil = Differentialteil / Ta
Differentialteil = Differentialteil * Kd

Av = Proportionalteil + Integralteil
Av = Av + Differentialteil

Was stelle ich nun mit AV an, damit es funktioniert?

Wenn ich eine einfache regelung mache ala
IST>SOLL -> Decr Ausgang
IST<SOLL -> Incr Ausgang
funktioniert es wie erwartet, aber aufgrund der hohen Masse schwingt es 
nur sinnlos.

Es muss also irgendwas rauskommen wie:
wenn drehzahl zu klein erhöhe intelligent den ausgang aber kompensiere 
überschwingen.

von Hubert G. (hubertg)


Lesenswert?

Wenn IST sehr nahe an SOLL ist, dann darf sich der Ausgang nur mehr 
stark verzögert und in kleinst möglichen Schritten ändern.
Eine gewisse Hysterese innerhalb sich nichts ändert sollte es auch 
geben.

von Markus B. (scrap)


Lesenswert?

Das hilft mir nicht weiter.

Icvh weiß, dass ich die 33upm etwa bei 2500 'PWM' (ist ja analog) 
bekomme.

wenn ich den I und den D teil auf 0 Setze müsste er ja irgendwas machen.
aber egal was für ein faktor ich nehme, wenn die differenz null ist ist 
auch der ausgang null.

wenn ich allerdings mein AV+2500 als ausgang setze, bekomme ich was 
raus, aber das kann es doch nicht sein, dass ich vorgeben muss wo er 
hingeht.
wie ist hier der ansatz?

von Hubert G. (hubertg)


Lesenswert?

Dein AV kann doch nicht 0 sein wenn der Motor steht. Die Regelabweichung 
beträgt doch 100000 Ticks.
Hast du dir auch ausgerechnet wie genau du die Drehzahl einstellen 
kannst mit den 4096 bit des D/A Wandler.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Du machst am Schluss eine simple Addition, also
PWM Startwert + PID Regler Ergebnis = neuer PWM Wert.

: Bearbeitet durch User
von Markus B. (scrap)


Lesenswert?

genau dannach habe ich gesucht.

Das habe ich mir schon selber überlegt, aber es irgendwie als unsinnig 
verworfen und garnicht ausprobiert.
funktioniert.

nun muss ich noch die drehzahlmessung am anfang ordentlich hinbekommen 
(arbeitet mit gleitendem mittelwert, Welcher am anfang falsch berechnet 
wird)

von Karl H. (kbuchegg)


Lesenswert?

Markus B. schrieb:
> Das hilft mir nicht weiter.
>
> Icvh weiß, dass ich die 33upm etwa bei 2500 'PWM' (ist ja analog)
> bekomme.
>
> wenn ich den I und den D teil auf 0 Setze müsste er ja irgendwas machen.
> aber egal was für ein faktor ich nehme, wenn die differenz null ist ist
> auch der ausgang null.

Solange du nur einen P Anteil hast - ja, genau. Mit einem reinen P 
Regler kann man die Sollgröße nicht erreichen.

Erst wenn du einen I Anteil mit dazu nimmst, ändert sich die Sache.

von Karl H. (kbuchegg)


Lesenswert?

Markus B. schrieb:
> genau dannach habe ich gesucht.
>
> Das habe ich mir schon selber überlegt, aber es irgendwie als unsinnig
> verworfen

ist es auch. Diese Aufsummierung steckt bereits im I Anteil vom P_I_D 
Regler.

: Bearbeitet durch User
von heinz (Gast)


Lesenswert?

Beim PI(D) Regler wird wenn Du nahe bei 0 Abweichung bist der Sollwert 
eigentlich nur durrch den I Anteil gebildet. Vielleicht suchst Du mal 
unter
Feedforward control

von Markus B. (scrap)


Lesenswert?

es funktioniert aber genau so.

einfach den regelwert auf den ausgang zurückgeben funktionert nicht egal 
wiegroß der i faktor ist.

von Karl H. (kbuchegg)


Lesenswert?

Markus B. schrieb:
> es funktioniert aber genau so.
>
> einfach den regelwert auf den ausgang zurückgeben funktionert nicht egal
> wiegroß der i faktor ist.


Dann machst du was falsch.

Natürlich kann man es auch so machen. Nur geht das eben am Sinn eines 
PID Reglers vorbei. Da wäre ein einfacher 2 Punkt Regler viel simpler
1
Schleife
2
  wenn zu langsam -> gib mehr Gas
3
  wenn zu schnell -> gib weniger Gas
4
  warte ein bischen, damit der Motor die Gasveränderung auch in eine
5
     Drehzahländerung umsetzen kann
6
Ende Schleife

Letzten Endes hast du ohnehin einen derartigen Regler gebaut. Nur halt 
mit dem Umweg eines PID Reglers, den du an der Arbeit hinderst.
Bzw. eigentlich mit einem PID Regler, dem du den I Anteil klaust und 
selbst implementierst.

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Das ist ja leicht auszuprobieren, wenn du auf die P,I und D Faktoren 
zugreifen kannst. Setze P und D auf Null und stelle den I Faktor auf 
irgendeinen mittleren Wert.
Der Ausgang des Reglers sollte nun langsam ansteigen, solange der Motor 
zu langsam dreht. In der Nähe des Sollwertes sollte der Ausgang des I 
Reglers sich asymptotisch einem Endwert nähern.

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz schrieb:

> Letzten Endes hast du ohnehin einen derartigen Regler gebaut. Nur halt
> mit dem Umweg eines PID Reglers, den du an der Arbeit hinderst.
> Bzw. eigentlich mit einem PID Regler, dem du den I Anteil klaust und
> selbst implementierst.


Denn das hier
1
    if( soll < ist )
2
      gas += Wert;
3
    else if( soll > ist )
4
      gas -= Wert;
5
6
    Ausgabe = gas;

ist genau das, was letzten Endes übrig bleibt, wenn man aus einem PID 
Regler den reinen I Anteil eigenständig heraus-'operiert' und ein wenig 
umformt. Die Variable "gas" ist nichts anderes als die Fehlersumme die 
im PID Regler benutzt wird und der Faktor Ki steckt in der 
Ausgabeanweisung (ist hier also 1.0, bzw. 'Wert', je nachdem wie man es 
sehen möchte).

: Bearbeitet durch User
von Ernst O. (ernstj)


Lesenswert?

Um einen vorgegebenen Sollwert zu halten, ist ein I-Regler das einzig 
senkrechte. Ein P-Anteil wird interessant wenn der Sollwert geändert 
wird und das System rasch folgen soll. Ein D-Anteil wird dann 
interessant, wenn schnelle Störungen abgefangen werden sollen.

P-Regler sind deshalb so verbreitet, weil sie zu Analogzeiten am 
einfachsten zu realisieren waren: alles was man braucht um die 
P-Stellgrüße zu ermitteln ist ein Verstärker, der die Soll-Ist 
Abweichung geeignet verstärkt und so die Stellgröße ermittelt. I- und D- 
Anteile erfordern Integratoren bzw Differentiatoren, die 
schaltungstechnisch anspruchsvoller sind.

Bei deinem Aufbau, ist da die Stellgöße auch optimal verwertet? Decken 
die 4096 Schritte einen optimalen Bereich ab?

von Markus B. (scrap)


Lesenswert?

ja.
4095=52 upm ohne last
2800=33 1/3 upm
3500=45 upm


ausm gedächtnis, keine ahnung ob das so stimmt.
jedenfalls ist da noch luft nach oben zum nachregeln ohne auflösung zu 
verschenken.
bekomme es jetzt auf 2 stellen nach dem komma genau eingeregelt.

wichtiger ist ein guter gleichlauf, und hier muss man einen kompromiss 
zwischen störungen ausregeln und geschwindigkeit halten finden.

es sind also hier 2 wichtige sachen: drehzahlgenauigkeit (scheinbar 
nicht so wichtig, ander superteure antriebe ohne regelkreis mit 
synchronmotoren und FU haben auch nur +-1upm) und drehzahlkonstanz 
(damit es nicht "leiert")

danke an euch

von Markus B. (scrap)


Lesenswert?

stimmt übrigens, geht auch wenn man nur den PID wert direkt auf den 
ausgang schreibt, allerdingt nur wenn wie beschrieben der I-wert relativ 
hoch ist.

es regeln aber beide methoden
pid ausrechnen-> ausgang
pid ausrechnen->alter pwm+pid->ausgang

mit den ensprechenden passenden regelparametern gleich schnell und 
genau.

von urlauber (Gast)


Lesenswert?

Markus B. schrieb:

>Wenn in meinem Fall aber IST>SOLL kommt > ein negativer wert für den Ausgang raus 
>und wenn IST=SOLL wird der regler auf 0 >gesetzt, was ja auch quatsch ist.

Das stimmt. Ein reiner P-Regler kann das nicht. Den musst du um eine 
drehzahlabhängige Vorsteuerung für den Arbeitspunkt ergänzen. Der 
P-Anteil regelt dann allein die Störungen aus. Alternativ nimmst du wie 
oben bereits beschrieben einen PI-Regler. Dann übernimmt der I-Anteil 
die Arbeitspunkteinstellung.

von Ernst O. (ernstj)


Lesenswert?

ernst oellers schrieb:
> Decken
> die 4096 Schritte einen optimalen Bereich ab?

Markus B. schrieb:
> ja.
> 4095=52 upm ohne last
> 2800=33 1/3 upm
> 3500=45 upm

Ich finde nein, die Werte sind nicht optimal: für den technisch 
uninteressanten Bereich unterhalb von 30 upm werden 60 % des zur 
Verfügung stehenden Stellbereiches vergeben. Und auf zwei Stellen hinter 
dem Komma genau ist das auch nicht: ein LSB entspricht 0,015 upm, und 
das auch nur im Durchschnitt, denn die drei Werte liegen nicht auf einer 
Geraden.
Wenn Du den Bereich 0 ... 4095 einem Unterschied von 10 upm zuordnest, 
erhältst du theoretisch eine Auflösung von 0,000037 upm / LSB (least 
significant bit).


Karl Heinz schrieb:
> if( soll < ist )
>       gas += Wert;
>     else if( soll > ist )
>       gas -= Wert;
>
>     Ausgabe = gas;

würde ich vor der letzten Zeile noch ergänzen mit

      else if( soll = ist )
        gas = Wert

Das Verhalten des Regelkreises muss dann am lebenden Teil durch 
geeignete Wahl von "Wert" so getuned werden, dass sich der Sollwert 
möglichst schnell einstellt, ohne zu schwingen.

von tzee (Gast)


Lesenswert?

if( soll == ist )

von Ernst O. (ernstj)


Lesenswert?

tzee schrieb:
> if( soll == ist )

ja.

von Heribert (Gast)


Lesenswert?

Markus B. schrieb:
> Ich möchte eine genaue Drehzahlregelung für ein Masselaufwerk
> (Plattenspieler) machen.

Frage an die "Allgemeinheit":

Wenn die Masse so hoch ist, also das System recht träge,
kann man da eigentlich mit dem Standard-PID-Regler arbeiten?
Kann man dies komplett mit den Faktoren Kp, Ki und Kd ausgleichen
oder bräuchte man dann eine (irgendwie modifizierte) Version
des PID-Reglers (vielleicht mit Verzögerungsglieder o.ä.).
Ich kann mir vorstellen, dass der PID-Regler erkennt,
dass der Motor z.B. zu langsam ist, noch oben regelt,
dann immer noch erkennt, dass er zu langsam ist,
noch mehr nach oben regelt, immer wieder und wieder.
Da das System so träge ist, würde er vermutlich dann weit
über schwingen?

von tzee (Gast)


Lesenswert?

Auf keinen Fall zusätzliche Verzögerungen einbauen.
Ein PID ist ideal.

von Marco S (Gast)


Lesenswert?

Ein Regelkreis mit PID würde ich eher als suboptimal betrachten.

Eigentlich macht man so was mit einem Stellglied. Dazu nimmt man einen 
Synchronmotor und steuert den über einen FU an. Dessen Stabilität ist 
dann quarzgenau.

von Markus B. (scrap)


Lesenswert?

ernst oellers schrieb:

> Ich finde nein, die Werte sind nicht optimal: für den technisch
> uninteressanten Bereich unterhalb von 30 upm werden 60 % des zur
> Verfügung stehenden Stellbereiches vergeben. Und auf zwei Stellen hinter
> dem Komma genau ist das auch nicht: ein LSB entspricht 0,015 upm

ich möchte den plattenteller bei "aus" ganz langsam drehen lassen, von 
daher brauche ich den bereich auch.
die genauigkeit ist ausrechend, man muss es nicht übertreiben

die drehzahlmessung allein ist nicht so genau, weil auf dem 
ausgedrucktem aufkleber die verzerrungen die der drucker erzeugt sich 
schon ordentlich bemerkbar machen. ich habe da über eine umdrehung 
schwankungen bis zu 1500ticks (bei den "guten messwerten" so um die 
150), obwohl die theoretisch 0 sein müssten
der aufkleber selbst ist mit nem usbmikroskop auf perfekten rundlauf 
ausgerichtet aber trotzdem muss ich paar messwerte wegwerfen und bilde 
auch den durchschnitt aus den letzen 64messungen für ein einigermaßen 
brauchbares ergebnis.
was nützt mir also supertolle einstellbarkeit wenn die messung schon 
nicht so genau ist.

synchronmotor ist abgesehen vom höherem technischem aufwand lauter und 
und hat keine gleichmäßige drehbewegung, außerdem gibts schlupf bei der 
übertragung zum plattenteller, der auch jedesmal anders ist, da muss man 
immer händisch nachregeln.

ich bin mit meiner lösung ganz zufrieden.

von Thorsten O. (Firma: mechapro GmbH) (ostermann) Benutzerseite


Lesenswert?

Hallo Marco,

> Ein Regelkreis mit PID würde ich eher als suboptimal betrachten.
>
> Eigentlich macht man so was mit einem Stellglied. Dazu nimmt man einen
> Synchronmotor und steuert den über einen FU an. Dessen Stabilität ist
> dann quarzgenau.

Ach, und was glaubst du läuft im FU ab? Spätestens wenn der Motor nicht 
im gesteuerten U/f-Modus betrieben wird, sondern auf dem Geber geregelt 
wird, ist wieder ein PID im Spiel. Meist in Form von mehreren ineinander 
geschachtelten Regelkreisen, wobei der D-Anteil nicht immer verwendet 
wird.

Mit freundlichen Grüßen
Thorsten Ostermann

von Marco S (Gast)


Lesenswert?

Wir haben mal sowas für einen renommierten Plattenspielerhersteller 
entwickelt. Der dort verwendete Synchronmotor wird z.B. mit einem 
150Hz-Sinus gespeist. Ob die Quelle nun ein Sinus oder ein 
Rechtecksignal war, war dem Motor egal. Als Synchronmotor dreht der sich 
entweder schlupffrei zur Eingangsspannung, oder er blockiert. Der 
Integralanteil in diesem System wird von dem Gummiriemen zwischen Motor 
und Plattenteller übernommen. Ein leicht ruckelnder Motorlauf wird von 
dem kiloschweren Plattenteller ausgebügelt. Ideal ist es ja, wenn die 
Gleichlaufstörungen null sind. Wieviel kW soll denn da der Motor haben, 
damit die Regelung eine Chance hat.

Unser Drehzahlsteller läuft 1a und der Hersteller ist hochzufrieden mit 
uns.

von Thorsten O. (Firma: mechapro GmbH) (ostermann) Benutzerseite


Lesenswert?

Sowas hier?
http://img2.audio.de/0400000034629-3126290-jpg-f630x378-ffffff-C-ec3dddec-48118634.jpg

Mit freundlichen Grüßen
Thorsten Ostermann

von Marco S (Gast)


Lesenswert?

Genau.

Halt da, wo ein Plattenspieler auch mal 40.000€ kosten darf.

von Markus B. (scrap)


Lesenswert?

Hehe, da kommt mein Kunde wesentlich besser weg.
Der Spieler sieht aber ähnlich aus.

Schlupf gibt es definitv zwischen Motor und Plattenteller durch den 
Riemen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.