www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik kaskaderegelung


Autor: franz b (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.