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 } }
* Definition von und Wertzuweisung an kp und ki * Funktion main (sic!)
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
1 | 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:
1 | if (y>=0 && y<4096) // Begrenzung für I-Anteil |
2 | {
|
3 | esum=esum + e; |
4 | }
|
5 | :
|
6 | /* Stellglied Begrenzung */
|
7 | if (y<0) { |
8 | y=0; |
9 | }
|
10 | else
|
11 | if (y>4095) { |
12 | y=4095; |
13 | }
|
14 | }
|
15 | return y; |
Welchen Wert haben deine Konstanten kp, ki und Ta?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.