Hey,
ich versuche z.Zt nen ganz einfachen Regler mit nem Mega8 zu bauen.
Ich hab mir nachfolgenden Code ausgedacht, der funzt aber net, der
Ausgang schwingt hoch und runter (PWM = 0-1023)
Logisch gedacht müsste er doch funzen, oder kapier ich was net?
Anbei mein BASCOM-Code:
1
$regfile = "m8def.dat"
2
$crystal = 8000000
3
4
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Prescale = 1
5
6
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Welche Art von Regler soll das sein? Richtig kann ich es nicht lesen,
soll wohl eine Art P-Regler darstellen?
Natürlich musst du der Regelstrecke auch die benötigte Zeit geben,
überhaupt was zu tun.
Ja, geht in Richtung P-Regler... glaub ich... ^^
Die Regelstrecke is nen P-Channel-MOSFET mit Treibertransistor, dass
wird ne Spannungsregelung, bei der die Spannung auch bei hoher
Stromabnahme konstant bleiben soll...
Ich bin net so fit in Regelungstechnik, kenne nur die Grundlagen
(Berufsschule vor 2 Jahren)
Hi,
also anstatt des Vergeleichens würde ich einfach mal die Regeldifferenz
e ausrechnen => soll - ist = e
Anschließend könntest Du einen Proportionalfaktor Kp einführen und die
Regeldiffernz e damit multiplizieren => Reglerausgang u, Kp*e = u. Die
Größe u kannst Du dann direkt auf den Aktor geben.
Je größer Kp, deste schneller. Zu schnell kann dann eventuell in
Aufschwingen resultieren, dann einfach Kp wieder verkleinern.
Grüße,
Jan
Hier mal eine Möglichkeit eines PI-Reglers als Funktion, je größer Kp
deto schneller und je größer Ki desto schneller stationäre
Regeldifferenz minimiert. fltControlsignal ist dann der aktuelle Ausgabe
wert an den Aktor.
Sebastian schrieb:> Die Regelstrecke is nen P-Channel-MOSFET mit Treibertransistor, dass
Und wie sieht's mit Filterung aus ? Eine PWM hat prinzipiell erst mal
keine Spannung dazwischen, nur max und min. Wenn die dann auf den ADC
geht, dann misst der eben zu einem bestimmten Zeitpunkt entweder max
oder min, klar kann da nix regeln.
> Und wie sieht's mit Filterung aus ? Eine PWM hat prinzipiell erst mal> keine Spannung dazwischen, nur max und min. Wenn die dann auf den ADC> geht, dann misst der eben zu einem bestimmten Zeitpunkt entweder max> oder min, klar kann da nix regeln.
@TO
Und selbst wenn da eine Filterung ist (Kondensator, Spule), musst du der
Regelschleife etwas Verzögerung geben (das Kp), denn natürlich benötigt
die Spannung am Filterelement ein wenig Zeit bis sie der PWM nachläuft.
Nur weil du die PWM (angenommen) von 0 auf 100% setzt, ist ja nicht die
Spannung sofort von 0 auf 100%. Die läuft langsamer hoch. Und in der
Zeit inkrementierst du deinen PWM Wert bis zum Anschlag (wenn du dann
auch noch verhinderst, dass der über bzw. unterlaufen kann, was du
momentan nicht getan hast)
Schon masl einen Gedanken an die Zykluszeit des Reglers verschwendet ?
Wie passt diese auf den Prozess, und wie passt diese auf das Stellglied
und auf den ADC ?
Karl Heinz Buchegger schrieb:> @TO> Und selbst wenn da eine Filterung ist (Kondensator, Spule), musst du der> Regelschleife etwas Verzögerung geben (das Kp), denn natürlich benötigt> die Spannung am Filterelement ein wenig Zeit bis sie der PWM nachläuft.
Nur weil bei 'ner 50% PWM 'ne Led halb so hell leuchtet, mögen manche
annehmen, sie bekäme 'ne niedrigere Spannung. Das ging nicht aus des
TO's Nachricht hervor, dass ihm dies klar bewusst ist.
Sollte diese irrige Annahme der Fall sein, dann scheitert's bereits
daran und nicht erst weil dem Regelalgorithmus keine Zeit gegeben wurde.
Nenenenene :-)
Ich geb nen PWM-Signal auf den MOSFET, welcher z.Zt. ne 12V/55W
Halogenlampe dimmt.
Die Spannung der Lampe greife ich über ein (experimentell zwei)
RC-Tiefpassfilter ab und lege sie auf den ADC(0) des Mega8.
Dass ich das über nen Standard-P-Regler machen kann, ist mir fast klar,
ich wollte nur wissen, welchen Hintergrund es hat, dass mein Regler
schwingt wie bekloppt...
Ich bin Elektroniker und ich hab schon zwei lineare Netzteile gebaut,
will jetzt aber in Richtung SNT gehen. En bissel Erfahrung mit µC's hab
ich auch schon...
Im Anhang nen kleiner Schaltplan.
Ich versuche jetzt, das Rauschen des ADC mit Kondensatoren zu
minimieren...
Dass wird sicherlich en bissel helfen.
Und ich mach nen P-Regler draus...
Sebastian schrieb:> Dass ich das über nen Standard-P-Regler machen kann, ist mir fast klar,> ich wollte nur wissen, welchen Hintergrund es hat, dass mein Regler> schwingt wie bekloppt...
Da spielt mehreres zusammen
Erst mal:
der schwingt höchst wahrscheinlich nicht, sondern
If Ist < Soll Then
Incr Ausgang
End If
das läuft über. Der Ist Wert ist zu klein und mit einem Affenzahn zählst
du hier sukzessive die Variable Ausgang hoch. Blöd nur, dass du mit
einem Wert von 1024 in Ausgang die PWM effektiv wieder auf 0 setzt.
Wodurch die Ist Spannung wieder kleiner wird, was zu weiterem Erhöhen
von "Ausgang" führt.
Du musst die Werte auf jeden Fall erst mal begrenzen!
Ohne brauchst du gar nicht weiter machen.
> Ich versuche jetzt, das Rauschen des ADC mit Kondensatoren zu> minimieren...> Dass wird sicherlich en bissel helfen.
Korrigier erst mal deine Programmfehler, ehe du versucht mit
untauglichen Mitteln ein verkorkstes Programm zu 'debuggen'.
Ichhab netzt nen P-Regler auf Basis von Jan-Henriks Code gebaut,
Foglendes Problem:
Soll = 200
Ist = 400
Soll - Ist = -200 = E
E * Kp (-200 * 10) = -2.000
Ausgang (PWM) = -2.000 ???????????????
Was verstehe ich net? Steh grad aufm Schlauch...
Sebastian schrieb:> Was verstehe ich net?
* Das ein P-Regler alleine die Regelabweichung nicht ausgleicht.
* Dass du Stellgrößen auf ihre überhaupt möglichen Werte limitieren
musst
Karl Heinz Buchegger schrieb:>> Was verstehe ich net?>> * Das ein P-Regler alleine die Regelabweichung nicht ausgleicht.> * Dass du Stellgrößen auf ihre überhaupt möglichen Werte limitieren> musst
Zu letzterem:
Dein Temperaturregler ist gerade drauf gekommen, dass er die Heizung auf
'negativ' stellen möchte um die Temperatur runterzukriegen. Das wäre
schön, wenn das ginge, aber mehr als aus kann eine Heizung nun mal nicht
sein. Allerdings könnte der Regler die Kühlung einschalten (wenn es eine
gibt) und so eine 'negative Heizung' erreichen.
Daher: Die Stellgröße muss auf das physikalisch mögliche eingegrenzt
werden.
Angenommen der Sollwert wäre 0Volt und Du misst schon eine Ist-Spannung
von 1Volt am Messwiderstand R2, dann würde der Regler am liebsten -1Volt
ausgeben bei Kp = 1. Eine negative Spannung über eine PWM realisieren
geht glaube ich so nicht.
Bei einem Sollwert von 0Volt sollte eigentlich auch eine Ist-Spannung
von 0Volt rauskommen, da Du ja praktisch alles ausgeschaltet hast => PWM
= 0%. Dann stimmt glaube ich was nicht mit der Schaltung, da schon eine
Spannung am Messwiderstand R2 abfällt, obwohl der Transistor T1 noch gar
nicht geschaltet hat. Ich könnte also Deine ganze Steuerung von Q1
entfernen und würde trotzdem eine Offsetspannung an R2 messen?
Okay, das mit dem Regler ist jetzt abgehakt, vielen Dank für die Infos
und Tipps.
Anderes Problem... :-)
Im Schaltplan oben seht ihr mein RC-Glied, zum filtern der Messspannung.
Sobalt die Spannung über ca. 9V(Lampe) (3,2V am ADC, ca.65% PWM)
hinausgeht, wird der ADC-Wert wieder 0...
Hängt das mit dem RC-Tiefpass zusammen?
Ich hab schon verschiedene C's eingesetzt, immer dasselbe...
Vielleicht lehne ich mich ein wenig weit aus dem Fenster, aber Dein
ursprünglicher Code dürfte ein reiner I-Regler sein, daher
wahrscheinlich eher langsam aber nicht ungeeignet. Die aktuelle und
vergangene Regeldifferenz wird in "Ausgang" gespeichert und
aufsummiert/integriert. Wenn man mit Begrenzung in den Stellgliedern
arbeitet, dann sollte bei einem Integrierer (großer Speicher
vorausgesetzt) immer ein Antiwindup mit rein, ansonsten dauert das ewig
bis der Speicher/"Ausgang" wieder leer ist, sollte die Regeldifferenz
mal in die andere Richtung laufen.
Ne, ich hab den Regler jetzt rausgeworfen und mach das über Festwere,
die ich per up/down-Taster verändere, um die Spannung (einigermaßen)
konstant zu halten, mess ich den Stom und passe dann die Festwerte
entsprechend an, nicht die feine englische Art, aber brauchbar, funzt
gut.
Aber warum das mit der Spannungsmessung?