PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Abtastzeit bei PID Regler mit Atmega128



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.

Babbage
08.12.2009, 14:14
Die Auslegung des Reglers basiert auf einer konstanten Abtastzeit (Ta). Es muss dafür gesorgt werden dass in deinem Fall jede Millisekunde genau eine Abtastung, Berechnung und Ausgabe der neuen Stellgröße erfogt.
(Du hast Ta=0.001; gewählt also 1ms wenn ich das richtig sehe?)

Wird die Schleife unkontrolliert ohne konstante Wartezeiten durchlaufen, dann entspricht die Berechnung nicht mehr deiner gewünschten Übertragungsfunktion. Es kann beispielsweise zum Schwingen des Regelkreises kommen oder das Ding regelt gar nicht erst aus.


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.

Prizipiell gibt je kleiner Ta desto besser. Hauptsache ist aber dass Ta um einiges kleiner ist als die anderen Streckenzeitkonstanten.
Allerdings dachte ich immer Ta sollte kleiner sein als 0,1 der >>kleinsten<< Streckenzeitkonstante.

Ein Timer bietet sich hier an, der entsprechend der Abtastzeit aufgerufen wird.

Hilfe2010
08.12.2009, 15:20
Hi

danke für deine Antwort. Ich werde mal einen Interrupt mit Timer einbauen und mich evetuell noch mal melden.


Danke noch mal.