Hilfe2010
08.12.2009, 11:30
Hallo zusammen ich brauche eure Hilfe
Ich möchte eine Drehzahl für einen Lüfter regeln, ich habe die Kennwerte der Strecke ermittelt und daraus ergab sich ein PT2 Glied Gs(s) =1,06/(1+s1)².
Realisiert werden soll es mit dem Atmega 128.
Ich habe jetzt eine Frage zum PID Algorithmus.
Die Parameter Kp, Ki, Kd sind klar, berechnet mit den Einstellregeln von Chien, Hrones und Reswick,
aber Ta ist mir noch nicht so klar, ich habe gelesen Ta soll 0,1 bis 0,05 kleiner sein als die größte Streckenzeitkonstante.
Was bedeutet das genau.
Ich habe zwei Theorien:
1. Ich muss meine ADC_Frequenz so einstellen.
2. Ich muss einen Timer einbauen und mit Interrupt den Algorithmus alle 0,1s aufrufen
Oder kann man den Algorithmus in einer While schleife einfach durchlaufen lassen. Wie in meinem Code Bsp.
#include <avr/io.h>
#include "Config.h"
#include "AD5315.h"
int main (void)
{
volatile float sollwert;
volatile float istwert;
volatile float y;
volatile float e;
volatile float ealt;
volatile float esum;
volatile float Ta=0.001;
float Kp=4.7;
float Tn=2.15;
float Tv=0.13;
float Kd=Tv*Kp;
float Ki=Kp/Tn;
DACInit();
while (1)
{
sollwert = ReadAdcChannel(1)-512; // Sollwert einlesen
istwert = ReadAdcChannel(0)-512; // Istwert einlesen
e = sollwert - istwert; // Regeldifferenz bilden
if ((y < 511)&&(y > -512)) // bei Übersteuertem stellglied Integration einfrieren
{ // (Anti-Windup)
esum = esum + e; // Summe der Regelabweichung aktualisieren
}
y = (Kp*e)+((Ki)*Ta*esum)+(Kd/Ta*(e-ealt)); //Reglergleichung
ealt = e; //Regelabweichung für nächste Abtastung merken
if (y > 511) // Stellgröße auf -511...+512 begrenzen (10 bit DAC)
{
y = 511;
}
if (y < -512)
{
y = -512;
}
SetDAC(DACA, y+512);
}
return 0;
}
Was davon ist richtig ???
Danke für eure Unterstützung.
Ich möchte eine Drehzahl für einen Lüfter regeln, ich habe die Kennwerte der Strecke ermittelt und daraus ergab sich ein PT2 Glied Gs(s) =1,06/(1+s1)².
Realisiert werden soll es mit dem Atmega 128.
Ich habe jetzt eine Frage zum PID Algorithmus.
Die Parameter Kp, Ki, Kd sind klar, berechnet mit den Einstellregeln von Chien, Hrones und Reswick,
aber Ta ist mir noch nicht so klar, ich habe gelesen Ta soll 0,1 bis 0,05 kleiner sein als die größte Streckenzeitkonstante.
Was bedeutet das genau.
Ich habe zwei Theorien:
1. Ich muss meine ADC_Frequenz so einstellen.
2. Ich muss einen Timer einbauen und mit Interrupt den Algorithmus alle 0,1s aufrufen
Oder kann man den Algorithmus in einer While schleife einfach durchlaufen lassen. Wie in meinem Code Bsp.
#include <avr/io.h>
#include "Config.h"
#include "AD5315.h"
int main (void)
{
volatile float sollwert;
volatile float istwert;
volatile float y;
volatile float e;
volatile float ealt;
volatile float esum;
volatile float Ta=0.001;
float Kp=4.7;
float Tn=2.15;
float Tv=0.13;
float Kd=Tv*Kp;
float Ki=Kp/Tn;
DACInit();
while (1)
{
sollwert = ReadAdcChannel(1)-512; // Sollwert einlesen
istwert = ReadAdcChannel(0)-512; // Istwert einlesen
e = sollwert - istwert; // Regeldifferenz bilden
if ((y < 511)&&(y > -512)) // bei Übersteuertem stellglied Integration einfrieren
{ // (Anti-Windup)
esum = esum + e; // Summe der Regelabweichung aktualisieren
}
y = (Kp*e)+((Ki)*Ta*esum)+(Kd/Ta*(e-ealt)); //Reglergleichung
ealt = e; //Regelabweichung für nächste Abtastung merken
if (y > 511) // Stellgröße auf -511...+512 begrenzen (10 bit DAC)
{
y = 511;
}
if (y < -512)
{
y = -512;
}
SetDAC(DACA, y+512);
}
return 0;
}
Was davon ist richtig ???
Danke für eure Unterstützung.