Forum: Mikrocontroller und Digitale Elektronik was ist fehlt an diesem Program


von Anfänger (Gast)


Lesenswert?

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


}

}

von der mechatroniker (Gast)


Lesenswert?

* Definition von und Wertzuweisung an kp und ki
* Funktion main (sic!)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

* [ c ] ... [ /c ] Markierungen, damit man den Text lesen kann

von Anfänger (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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?

von Anfänger (Gast)


Lesenswert?

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

von Anfänger (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Anfänger (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.