Hallo,
ich ärgere mich immernoch mit meiner Regelung meines mittels PWM
angesteuerten Ventils rum. Ich hatte dazu nochmal den Thread
"Algorithmus fuer PID (Heizungsregelung)" gelesen, und bin schon etwas
schlauer geworden. Mit meiner Problematik komme ich jedoch noch nicht
richtig vorwärts.
Ich habe zunächst einmal eine Sprungantwort meiner Regelstrecke
(bestehend aus Ventil und Durchflussmesser) aufgenommen, und mir so mit
der Ziegler Nichols Methode die Parameter k_p (Verstärkung) und t_i
(Verzugszeit) berechnet.
Nun habe ich folgende Regelroutine in meinem Programm:
// Regelabweichung e_k
e_k = v_soll - v_ist;
// Differenzengleichung zur Berechnung der Stellgröße:
u_k = u_k_alt + k_p*(e_k*(1+t_0/t_i)-e_k_alt);
u_k_alt = u_k;
e_k_alt = e_k;
zu den einzelnen Paramtern:
v_soll: Sollspannung die der Durchflussensor anzeigen soll (1-5V)
v_ist: Istspannung die der Durchflussensor anzeigt (1-5V)
t_0: Abtastzeit
Das größte Problem ist nun, daß ich nicht genau weiß, was ich mit der
Stellgröße u_k anfangen soll...
Normalerweise müßte das doch die Größe sein, die ich auf meine Strecke
(also auf mein Ventil) raufgebe, oder? Nun steuere ich mein Ventil ja
mittels PWM an, muß ich dann den u_k Wert in eine entsprechende
Pulsbreite übersetzen? D.h. wenn ich ein u_k von 5 Volt rausbekäme,
entspräche das einer Pulsbreite von 100 %? In welchem Rahmen bewegt sich
denn überhaupt u_k? Das ist mir nicht wirklich klar.
Die zweite Sache ist die Abtastzeit t_0. Was stellt die dar? Ist das die
Zeit, wie oft ich v_ist Werte mit meinem A/D Wandler einlese?
Über ein par Tipps wäre ich sehr dankbar,
Gruß,
Stefan
Hallo Stefan!
u_k ist wie du schon sagtest die Stellgröße. Innerhalb deines Programmes
ist dies natürlich nur irgendeine Zahl vom Typ BYTE oder int oder was
auch immer. Mit diesem Wert musst du jetzt deine PWM ansteuern. In der
Regel (hier: Atmel) bedeutet nun ein Wert von 0 0% PWM-Ausgang und 255
100% PWM-Ausgang. Wichtig ist, daß du die Stellgröße u_k begrenzt, so
dass sie nicht kleiner als 0 und größer als 255 wird. Wenn dein Sollwert
nicht erreicht werden aknn, so musst du zusätzlich die Integration
unterbinden. Mit einem geeigneten Faktor und einem Offset kannst du
natürlich dein u_k so skalieren, dass dein PWM-Ausgangssignal das mit
dem Ventil macht, was du willst (Arbeitspunkt und Verstärkung
sozusagen).
Bezüglich t_0 hast du Recht: es ist die Zeit, mit der du deine Werte
einliest. Damit deine DZGL stimmt, musst du dafür sorgen, das diese
Abtastzeit konstant ist, d.h. am besten mit Timer-Interrupts arbeiten.
So hast du die Möglichkeit, t_0 exakt zu bestimmen und in deine
Gleichung einfließen zu lassen.
Gruß, Sascha
Hallo Sascha, erstmal danke für die Antwort. Die Sache ist mir nun schon
etwas klarer.
>Mit einem geeigneten Faktor und einem Offset kannst du >natürlich dein u_k so
skalieren, dass dein PWM->Ausgangssignal das mit dem Ventil macht, was du willst
>(Arbeitspunkt und Verstärkung sozusagen).
Was genau meinst du mit "Offset"?
Gruß,
Stefan
Mit dem Offset könntest du den Arbeitspunkt deines Ventils bestimmen,
z.B. wenn du beim Reglerausgang=0 das Ventil trotzdem etwas geöffnet
haben musst, addierst du einfach einen Offset, bevor du den Wert an
deine PWM übergibst.
Ich hab jetzt dein Programm nicht durchgesehen, aber kann es sein, dass
du keinen negativen Wirksinn hast? Wenn die Soll-Istwert-Abweichung
positiv ist, muss natürlích dein Ventil weiter schließen.
Was mit auffällt:
wenn t_0=8,85ms ist, dann musst du natürlich 0.00885 zuweisen und nicht
8.85!!
die Regelroutine in der while(1) Schleife muss in die Interrupt-Routine
timer2_ovf_isr, damit du einbe konstante Abtastzeit hast. So wird es
nicht funktionieren!
Gruß, Sascha
Hallo Sascha,
die Sache mit den Millisekunden und der while (1) Schleife habe ich
jetzt verbessert. Aber das mit dem Wirksinn sehe ich genau andersrum:
Wenn ich eine positive Regelabweichung habe (mein Sollwert also höher
ist als mein Istwert), dann fließt ja noch zuwenig Gas durchs Ventil, es
muß sich also weiter öffnen statt schließen...