Forum: Mikrocontroller und Digitale Elektronik kaskaderegelung


von franz b (Gast)


Lesenswert?

Hallo zusammen


hat schon jemand eine kaskaderegelung programmiert? ich will eine 
kaskaderegelung von strom und spannung in ein schaltnetzteil. den 
stromregler soll schneller und ein PI Regler sein. der Spannungsregler 
soll ein PID Regler. getrennt habe zb so implementiert.

#include <ADuC7020.h>
#include "header.h"

int ealt;                 //  alte Abweichung
int esum;         // Summe der Reglerabweichung
int y;        // Stellglied

int PID_Berechnung( int x, int w)
{
  int e;
  int yp;
  int yi;
         int yd;

  e=w-x;                      //   Regelabweichung  berechnen
  if((y>=0)&& (y<4096))                     //  Bei Überschreiten 
Stellglied einfrieren
  {
    esum=esum + e;              //  Summe der Regelabweichung berechnen

  }

  yp=kp*e;               // P-Anteil
  yi=ki*Ta*esum;           // I-Anteil
  yd=kd*(e-ealt)/Ta;         // D-Anteil
  y= yp + yi + yd;        // Stellglied der Regler
   ealt=e;               //Abweichung für nächste rechnung merken

  /*  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;
}

***********************************************************************

#include <ADuC7020.h>
#include "header.h"


int x_value;         //  Spannung_Istwert
int w_value;           //  Spannung_sollwert
int stellglied;          //  Stellglied

int delay0_5s=5;           // Variable Tick zum Verlangsamer der 
PID_Berechnung beim Test
volatile int T0_Tick=0;              // Timer 0 Current Tick value
volatile int T0_Last=0;            // Timer 0 Last Tick value



__irq void IRQ_Handler(void)          // Aufrufe der Routine alle 100ms

{
  if((IRQSTA & RTOS_TIMER_BIT) !=0)   // fragen, ob das Interrupt ein 
Timer0 IRQ ist
  {
    T0CLRI= 0;  // Timer0 clearen
    ADCCON = 0x6A0;  //  single-ended Mode, start konv 
ADCCP=0;    //kanal 0 aktiviert für Spannungsistwert
    ADCCON =0x6A3;       // software conv., single-ended,
    while (!ADCSTA){};     // warten bie Ende der Wandlung
    x_value = (ADCDAT >> 16);   // Ergebnis der Wandlung
    ADCCON = 0x6A0;
    ADCCP = 3;
    ADCCON=0x6A3;                     while (!ADCSTA){};     // warten 
bis End der Wandlung
    w_value = (ADCDAT >> 16);


    }

    return;
}


int main ()
{
    init_ADC_DAC();
    Timer0_init();
    init_UART();
    IRQEN = RTOS_TIMER_BIT;      // Timer0-Interrupt  Aktivieren

    while(1)
    {
       stellglied=PID_Berechnung(x_value, w_value);
    DAC1DAT= (stellglied << 16) ;
  }

 }


meine Frage.
ist diese Programm schon ok? vor allem variable und Bedingunggen.
 wie kann ich jetzt in konzept eine kaskaderegelung die beide (Strom- 
und spannungsregler) zusamensetzen oder welches Algo für die beide?
mein idee ist die Pi Regler für strom Regler mit Interrupt und der PID 
im Hauptprogramm. aber bin nicht siher ob, das gute idee ist.  was sagen 
sie  oder hat jemand ein Beispiel oder algo für sowas?

mfg

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.