hallo
ich schreibe ein Programmiere ein Pi Regelr
das programm funktioniert Interrupt gesteuert. in dem ISR lese ich die
ADC kanäle ( soll und ist) und rufe die Funktion, die den Regler
berechnet.Das Program funkitoniert noch nicht richtig. ADc und DAC sind
schon Ok. nur die Regelung funktioniert nicht gut. ich bitte deswegen um
Hilfe. ich habe das Algorithmus von der Seite folgenden Seite:
http://www.rn-wissen.de/index.php/Regelungstechnik . Habe vielleicht
was im Program vergessen? ist mein ISR korrekt geschrieben? das
Interrupt kommt alle 10ms.
zeit ist
#include <ADuC7020.h>
#include "header.h"
volatile int i=0; volatile in j=0;
int esum;
int y; // Stellglied
int Regler( int x, int w)
{
int e; // aktuelle Reglerabweichung
int yp; // P_Anteil
int yi; // I-Anteil
e=x-w; // Regelabweichung berechnen
if((y>=0)&& (y<4096)) // Begrenzung für I-Anteil
{
esum=esum + e; }
yp=kp*e;
yi=ki*Ta*esum;
y= yp + yi;
/* Stellglied Begrenzung */
if(y<0){
y=0; // Stellglied auf sein Minimaler Wert
begrenzen
}
else
if(y>4095){
y=4095; // Stellglied Auf sein Maximaler Wert
4095 begrenzen
}
return y;
}
ISR_timerInter(void){
if((IRQSTA & RTOS_TIMER_BIT) !=0) {
T0CLRI= 0; //Timer0 clearen
ADCCON = 0x6A0; // single-ended Mode, start konv.
ADCCP=0; // kanal Auswahl
ADCCON = 0x6A3; // software conv., single-ended, Konversion.
starten
while (!ADCSTA){}; // warten bie Ende der Wandlung
ist = ADCDAT ; // Ergebnis der Wandlung
ADCCON = 0x6A0;
ADCCP = 3; // Auswahl kanal 3 für Spannungssollwert
ADCCON=0x6A3; // software conv., single-ended, conv. starten
while (!ADCSTA){}; // warten bis End der Wandlung
soll = ADCDAT ;
stellglied=Regler(ist, soll)
DAC=stellglied
j++; // zähler nach jedem Timer Interrupt
}
return;
}
Maon(){
init systen
init timer
interrupt enable
while(1){
if(j==i);
i=j;
ein andere aufagbe
---- Uart
}
}
der mechatroniker schrieb:> * Definition von und Wertzuweisung an kp und ki
kp=2 kp=20
>> * Funktion main (sic!)
in dem main möchte mit ein 2. Regler (kaskadierung).dh der Pi in
Interrupt d. mit j die Interrupt zählen und nach 10 mal kann ich in main
ein 2. Reg für 100ms starten.so will ich das Ding machen. Aber jetzt
muss erstes mal der erste Regler in interrupt schaffen. deswegen frage
ich op dieses Interrupt , das gesmt algo und die struktur des Programs
korrkt sind.
danke
Hallo Lothar,
ich habe aus Google und auch hier im Forum Algo mit solche Begrenzung
gefunden. ich glauge wenn ich keine Begerenzung am Anfang bei der
berechnung von esum stellt, könnte es vorkommen dass, yi sehr groß über
y steigt, was nicht gut für den Regler wäre. das ist nur eine
vermutung.sons bleibe ich auf alle vorschlag offen.
kp=2, ki=20 ta=10ms.
danke
Lothar Miller schrieb
> if((y>=0)&& (y<4096)) // Begrenzung für I-Anteil>> Diese Abfrage zu Beginn des Programm ist unnötig, denn am Ende der>> Routine begrenzt du den Wert ja auf genau diesen Bereich: if (y>=0 && y<4096)
// Begrenzung für I-Anteil
>> {>> esum=esum + e;>> }>> :>> /* Stellglied Begrenzung */>> if (y<0) {>> y=0;>> }>> else>> if (y>4095) {>> y=4095;>> }>> }>> return y;>> Welchen Wert haben deine Konstanten kp, ki und Ta?
Hallo Lothar.
nach ein paar Tagen weit von dem Computer bin ich wieder da habe noch
Fragen die mir noch nich klar sind.
kp=2, Ki=20 und Ta=1ms. ich will jetzt diesen PI Regler in den ISR
Routine packen und in Main ein 2.Regler(PID)schreiben. Das system
Funktioniert wie folg:
alle 1ms wird ein Timmer-Interrupt ausgelöst. in den Routine der ADC
liest 4 werten: x_pi, x_pid, y_pi, y_pid . es wird esrtmal ein vgl
zwischen x_pi und y_pid staffindet. wenn x_pi groß oder gleich y_pi ist
dann wird die PI_berechnung routine ausgeführt und den ausgang am DAC.
sons wenn x_pi klein y_pi wird nichts gemacht.
am ende des ISR ein Zählvariable inkrementieren.
im main bzw. in while(1) nach dem zählvariable fragen. sobald
zählvariable 10 erreich hat( da abtastzit für PID 10ms ist) dh. 10ms
vorbei sind dann zählvariable rücksetzen , Timer-interrupt speren ,
PID_routine ausführen und ausgang am DAC. dannac Timer-Interrupt wieder
freigeben.
Das ist mein konzept für meine kaskaderegelung. aber dies jetzt im code
umzusetzen ist mir mit dem controller nicht einfach.
ich deswegen um hife. hat jemand schon sowas gemacht?
ist mein konzept ok? wenn ja wie wäre zB wenn man dazu einige werte auf
dem Hyper Terminal anzeigen lassen will?
das Algorithmus für PI/PID habe ich aus internet und im Forum gefunden.
wenn mein I-anteil begrenzung falsch ist,hätte jemand eine idee wie man
das Antiwindup für diesen Fall richtig geschrieben werden soll? den ADC
erlaubt wert von 0....4095. und mein soll wäre 2000 .
mfg
Anfänger schrieb:> das Algorithmus für PI/PID habe ich aus internet und im Forum gefunden.
Ich geh mal davon aus, dass der im Prinzip richtig ist, und dass du den
korrekt übernommen hast.
> nur die Regelung funktioniert nicht gut
Aber mir scheint, dir ist nicht klar, dass dein PI Regler mit den Werten
für Kp und Ki steht und fällt. Mit diesen Werten und deren Anpassung an
die tatsächliche Situation entscheidet sich ob und wie gut dein Regler
funktioniert.
Karl heinz Buchegger schrieb
> das Algorithmus für PI/PID habe ich aus internet und im Forum gefunden.>> Ich geh mal davon aus, dass der im Prinzip richtig ist, und dass du den> korrekt übernommen hast.>
aus folgenden seiten habe ich dieses algo:
Beitrag "PID-Regler mit anti-Windup"http://www.rn-wissen.de/index.php/Regelungstechnik>> nur die Regelung funktioniert nicht gut>
warum funktioniert den nicht gut? wegen Parametr oder ??
>>> Aber mir scheint, dir ist nicht klar, dass dein PI Regler mit den Werten>> für Kp und Ki steht und fällt. Mit diesen Werten und deren Anpassung an>> die tatsächliche Situation entscheidet sich ob und wie gut dein Regler>> funktioniert.
für die Parameter haben Sie Recht. Ich habe noch mal im mein geguckt und
alle wieder berechet. Die oben gennanten werten waren füe eine 2.
Aufgabe. für diesen Regler ist im Prinzip die Digitalisierung eines
analogen Regler. Nach Berechnung ergibt sich folgende Ergebnisse:
kp_pi=r2/r1=1k/15K=0,067 Ki_pi=1/(r1*Ci)= 303
kp_pid=0,3 ki_pid=1122 und kd=15E-6(ist klein)
ok jetzt sind mein Parameter richtig. die Entsprechenden Abtastzeit
sollen 100µ uns 1ms jeweils für PI und PID. die Abtastzeit wurden nach
dem Reglerverhalten ausgewählt und müssen noch im zusammenhang mit
parameter optimiert werden,damit den Regler ein gute stabilität hat.
was jetztzu machen.