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