farmerjo
18.03.2006, 19:09
Hi!
nachdem mein PID-Regler auf Bascom-Basis zufriedenstellend läuft gehe ich jetzt das ganze in C an. Dabei haben sich folgende fragen ergeben:
1.) Kann ich in einer lokalen Variablen in einer Funktion Werte speichern die bis zum nächsten Uafruf dort bleiben, oder wird nach dem Ausführen der Funktion der Speicher für die Variable verworfen. Muss man dann dafür eine Globale Variable nehmen?
2.) Die Berechnung wird mit Float-Variablen durchgeführt. Die Werte wie IST-Wert, Soll-Wert, Stell-wert usw. sind ja aber alles Integerwerte. Wie wandel ich die einzelnen Typen um???
/* Die Funktion PID erwatet den SOLL- und IST-Wert als 10 bit Integer, als auch die drei Einstellparameter P, I, D als float. Die Abtatszeit Ta wird über eine Konstante vorgegeben
da sie Konstant ist und von der Benutzung eines Timers oder eine Delayfunktion abhängig ist*/
char PID(IST, SOLL short; P, I, D float)
{
E = SOLL - IST // Bildung der Regelabweichung
E = E / 1023; // Umrechnung auf 1 (10BIT ADC)
E = E * 5000; // Umrechnung in mV
switch (Y) // Begernzung des I Summenterms. Sobald der Stellwert maximal ist wird der Summenterm festgehalten und kann sich erst dann verändern
{ // Wenn der Stellwert wieder unter das Maximum sinkt
case <= 2000;
ESUM = ESUM;
break;
case >=2000;
ESUM = ESUM;
break;
default ESUM = ESUM + E; // Bildung des Summe für den I-Anteil
}
Y = P * E + I * Ta * Esum + ((E-EALT)/Ta)*D; // Berechnung des Stellwertes
EALT = E; // Umkopieren der Regelabweichung für die Bildung des Differentailanteils
Y = Y / 20; // Umrechnung des Stellwertes für Ausgabe über 8 BIT DAC
if (Y < -128) // Stellwert Begrenzung
{
Y=128;
}
if (Y>128)
{
Y = 128;
}
return (Y);
}
Wäre dankbar für jede Hilfe. Wenn da was raus wird kann man den Code ja auch in einer Form zur Verfügung stellen, in der er leicht in anderer Projekte eingebettet werden kann. Der Regelalgroihmus an sich gibt gute Stellwerte aus.
Gruß Johann
PS: C ist echt die letzte Scheiße die es gibt. Ich sitze da jetzt schon dreimal solange dran wie mit Bascom und es läuft noch überhaupt nicht, aber ich denke auf Dauer fährt man da doch besser mit.
nachdem mein PID-Regler auf Bascom-Basis zufriedenstellend läuft gehe ich jetzt das ganze in C an. Dabei haben sich folgende fragen ergeben:
1.) Kann ich in einer lokalen Variablen in einer Funktion Werte speichern die bis zum nächsten Uafruf dort bleiben, oder wird nach dem Ausführen der Funktion der Speicher für die Variable verworfen. Muss man dann dafür eine Globale Variable nehmen?
2.) Die Berechnung wird mit Float-Variablen durchgeführt. Die Werte wie IST-Wert, Soll-Wert, Stell-wert usw. sind ja aber alles Integerwerte. Wie wandel ich die einzelnen Typen um???
/* Die Funktion PID erwatet den SOLL- und IST-Wert als 10 bit Integer, als auch die drei Einstellparameter P, I, D als float. Die Abtatszeit Ta wird über eine Konstante vorgegeben
da sie Konstant ist und von der Benutzung eines Timers oder eine Delayfunktion abhängig ist*/
char PID(IST, SOLL short; P, I, D float)
{
E = SOLL - IST // Bildung der Regelabweichung
E = E / 1023; // Umrechnung auf 1 (10BIT ADC)
E = E * 5000; // Umrechnung in mV
switch (Y) // Begernzung des I Summenterms. Sobald der Stellwert maximal ist wird der Summenterm festgehalten und kann sich erst dann verändern
{ // Wenn der Stellwert wieder unter das Maximum sinkt
case <= 2000;
ESUM = ESUM;
break;
case >=2000;
ESUM = ESUM;
break;
default ESUM = ESUM + E; // Bildung des Summe für den I-Anteil
}
Y = P * E + I * Ta * Esum + ((E-EALT)/Ta)*D; // Berechnung des Stellwertes
EALT = E; // Umkopieren der Regelabweichung für die Bildung des Differentailanteils
Y = Y / 20; // Umrechnung des Stellwertes für Ausgabe über 8 BIT DAC
if (Y < -128) // Stellwert Begrenzung
{
Y=128;
}
if (Y>128)
{
Y = 128;
}
return (Y);
}
Wäre dankbar für jede Hilfe. Wenn da was raus wird kann man den Code ja auch in einer Form zur Verfügung stellen, in der er leicht in anderer Projekte eingebettet werden kann. Der Regelalgroihmus an sich gibt gute Stellwerte aus.
Gruß Johann
PS: C ist echt die letzte Scheiße die es gibt. Ich sitze da jetzt schon dreimal solange dran wie mit Bascom und es läuft noch überhaupt nicht, aber ich denke auf Dauer fährt man da doch besser mit.