PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Drehzahlregelung PID mit AVR



scrap01
29.05.2014, 14:09
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.

PICture
29.05.2014, 15:23
Hallo!

So wie du selber festgestellt hast, dir reicht ein P-Regler aus. Zum optimieren eines Reglers braucht man einen Sprungantwort der Regelstrecke auf Änderung der Regelgröße, was bisher unbekannt ist . Deshalb kann ich nur vermuten, dass dein P-Regler (Komparator ? :confused:) ) zu langsam für so schnellen Objekt ist.

Peter(TOO)
29.05.2014, 18:03
Hallo,


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.

Du hast die Zeit vergessen !!!

Nach "Incr Ausgang" passiert mal gar nichts. Die Mechanik braucht erst mal Zeit um zu reagieren!

Dein Controller kann natürlich all paar MS nachrechen und incrementieren, aber dann schwingt es eben.

De Sprungantwort bekommst du, wenn du bei stehendem Teller, den Motor auf 100% schaltest und du die Drehzahl über die Zeit aufzeichnest bis die maximale Drehzahl erreicht wird.

Aus den Daten kannst du dann herauslesen, wie lange dein System braucht um z.B. von 33 auf 34 UpM zu beschleunigen.
Wenn du die neuen Stellwerte wesentlich schneller berechnest als diese Zeit schwingt das System.

Das war jetzt mal die grobe Kurzfassung!
Zum Thema Regelungstechnik gibt es unzählige Bücher und Ausbildungskurse.

MfG Peter(TOO)

PICture
29.05.2014, 18:19
Wir haben auch etwas darüber: http://www.rn-wissen.de/index.php/Regelungstechnik . ;)

oberallgeier
29.05.2014, 18:41
... habe schon ganz viel über den PID Regler gelesen aber irgendwie verstehe ich es nicht ...Das ist nicht untypisch bei Regelungstechnik.

Schritt 1 (für Dich) könnte es sein, mal den Abschnitt zu diesem Thema im RNW issen (http://www.rn-wissen.de/index.php/Regelungstechnik)zu überfliegen - und die interessierenden Abschnitte etwas ausführlicher durchzugehen.

Schritt 2 wäre mal eine Aufzeichnung der ganzen Regelstrecke, das habe ich z.B. so gemacht:

.......https://dl.dropbox.com/s/ubfvgqsrk2wrfpx/regel-notiz.jpg?dl=0
... und habe die Größen mit eigenen Bezeichnungen versehen, die ich später auch im Code verwende.

Schritt 3 - Sprungfunktion bzw. Sprungantwort haben die Kollegen schon empfohlen. Hier habe ich dazu eine ganze Litanei (https://www.roboternetz.de/community/threads/36121-Autonom-in-kleinen-Dosen-R2_D03-Nachfolger-R3D01?p=427784&viewfull=1#post427784)geschrieben, insbesondere über Messaufbau zur Auslegung einer Geschwindigkeitsregelung (PID). Und dazu gibts hier (https://www.roboternetz.de/community/threads/36121-Autonom-in-kleinen-Dosen-R2_D03-Nachfolger-R3D01?p=415877&viewfull=1#post415877) und anderswo noch eigenen Code zur Regelung - damit Du mal ungefähr siehst, wie das geht (und mein MiniD0 läuft recht gut - 1 mm Abweichung auf 1 m Fahrstrecke).

Danach könnte man soweit sein, dass man alle nötigen Werte zur Reglerauslegung besitzt - oder sich aus den Messungen ableiten kann.

Sehr sinnvoll ist der Abschnitt zur Auslegung/Dimensionierung eines digitalen Reglers im RNWi ssen. Sehr lesenswert! War für mich eine ziemlich gute Anleitung für meine Anwendungen.

Viel Erfolg.

scrap01
30.05.2014, 11:26
Die üblichen verdächtigen auf microcontroller und rn-wissen habe ich natürlich drurchgelesen.

das problem war der tipp mit dem "erst p-anteil ausprobieren, dann i und d dazu"
denn nur der p anteil schaltet einfach immer den motor aus, wenn die drehzahl richtung soll geht. (weil fehler kleiner wird, wird ausgang auch kleiner)

der I anteil ist für die regelung wichtig, und dann geht es auch....

PICture
30.05.2014, 12:01
Ja, so wäre es dann optimal, also PI-Regler, damit der Motor auch bei 0 Differenz dfeht. Aber das D Anteil ist sicher überflüssig.

Möglicherweise einfacher wäre Zweipunktregler mit Hysterese: http://de.wikipedia.org/wiki/Zweipunktregler .

seite5
30.05.2014, 21:39
Hi,

@PICture: Möglicherweise einfacher wäre Zweipunktregler mit Hysterese - Die Platte möcht ich dann nicht wirklich hören.
@scrap01: aber aufgrund der hohen Masse schwingt es nur sinnlos. Mal probieren: p-Anteil reduzieren, bis Schwingen aufhört.
Den enstehenden grossen Fehler zwischen Soll und ist mit I-Anteil korrigieren, um diesen zu kompensieren.
Analoge Ansteuerung des Motors ist auch nicht gerade vorteilhaft, bei niedrigen Werten zeigen DC-Motoren Nichtlinearitäten,
die auszuregeln nicht ganz easy ist, PWM ist sicher besser (kommt jetzt sicher der Einwand, dass analoge Ansteuerung
in einem Audio-Teil besser ist, aber Du hast je eh einen µC "an Bord", der die "audiophile Luft verschmutzt")
mfg
Achim

scrap01
31.05.2014, 09:29
der motor soll in niedrigen drehzahlen eh ungeregelt sein, damit man den mit der hand anhalten kann.

pwm wollte ich nciht aufgrund der lediglich 10bit auflösung, wobei ich mir im nachhinein überlegt habe, dass mit fastpwm auch 16bit drin wären, ist aber bisher ungetestet.

oberallgeier
31.05.2014, 10:00
der motor soll in niedrigen drehzahlen eh ungeregelt sein, damit man den mit der hand anhalten kann ...Ist doch kein Problem. Bei mir wird die Regelungsroutine in einem präzisen Takt aufgerufen und in der Routine selbst wird zuerst geprüft, ob überhaupt geregelt werden soll. Und bei mir wird auch bei kleinen Sollwerten komplett abgeschaltet, das wäre bei Dir nicht sinnvoll, ist aber leicht entsprechend programmierbar. Insgesamt sind eben digitale Regler problemlos und easy anpassungsfähig, ein- und auszuschalten etc.


// ================================================== =========================== =
// === Regelungsroutine für Motor 12
// Die gemessene Zeitdifferenz Iz_diff0 zwischen zwei Encoderinterrupts
// wird zur Regelung verwendet
// Regelungkennwerte regel12/-34 und OCR1A/-B werden
// in der ISR(TIMER2_COMPB_vect) sekündlich in den i2c-speicher geschrieben
// ================================================== =========================== =
void rgl_12(void) // Regelung für Motor 12 mit 2 Interr pro Umdr.
{
if ( !regel12 ) return; // Regelung ist aus bei regel == 0
//
if (sspeed12 <= 3) // Soll überhaupt gefahren werden?
{ //
OCR1A = 0; // Unter x mm/s soll nicht gefahren werden
return; //
} //
... ...

Der Flag regel12 wird irgendwo gesetzt oder nicht . . . aber vermutlich reicht bei Dir sogar eine ähnliche Abfrage wie die (bei mir ebenfalls vorhandene) Sollspeed-Abfrage und entsprechende Reaktion bei kleinen Drehzahlen. Wer dann noch unbedingt scratchen können möchte, kann die Regelung bei hohen Stellwerten, sprich: bei großen Abweichungen vom Sollwert *ggg*, auch abbrechen oder ganz ausschalten. Von Spezialnadel etc jetzt mal abgesehen.

seite5
31.05.2014, 21:01
10 bit PWM reicht auf jeden Fall, bei ausreichend hoher Abtastrate wird das minimale "Restschwingen" und der Restfehler
durch die Massenträgheit Deines Plattentellers kompensiert (wirkt quasi wie ein zusätzlicher I-Anteil)
mfg
Achim