PID-Regelalgorithmus und seine Implementierung in C
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???
Code:
/* 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.
Re: PID-Regelalgorithmus und seine Implementierung in C
Zitat:
Zitat von farmerjo
PS: C ist echt die letzte XXXAUTOZENSIERTXXXe 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.
C ist weder eine Sprache, die für Hobby-Bastler noch für AVR entworfen wurde, noch eine grafische Benutzerschnittstelle. Es ist eine recht alte Sprache, die erst in den letzten Jahren zunehmend von Bastlern verwendet wird, was einerseits auf leistungsfähigere Controller und andererseits auf die Verfügbarkeit leistungsfähiger und freier (teilweise sogar kostenloser) Compiler zurückzuführen ist.
C ist eine sehr einfache Sprache mit einem recht kleinen Befehlsumfang.
Das sollte aber nicht zur Annahme verleiten, diese Sprache sei auch sehr einfach zu erlernen. Mit der Herangehensweise nach dem Motto "Programm installieren und etwas intuitiv herumclicken und dann geht's", wie man es von manchen GUI-geführten Programmen gewohnt ist, kommt man nicht weit, und man tut sich mit dieser Herangehensweise echt keinen Gefallen.
Klar, wenn man als Hobbyist auf C zurückgreift, weil man ne Sprache braucht und gehört hat, daß es da gute Compiler gibt, will man direkt was an seinem Projekt machen und hat null Böcke, sich erst man in die Sprache einzulesen und trockene Beschreibungen und Erklärungen zu lesen.
Aber wenn man die Grundlagen nicht kennt, dann ist der Frust doch vorprogrammiert. Das Zeug rotzt dauernd ab, man bekommt ominöse Syntax-Fehler und Warnungen, die man nicht zu deuten weiß, schreibt Programmem, die total ineffizient sind, braucht ewig für die einfachsten und elementarsten Dinge und kommt sich wie behindert vor, weil man nicht weiß, wie man seine Ideen formulieren und dem Scheiß-Compiler beibringen soll.
Ausserdem sollte man überlegen, was "gut" für einen bedeutet. Für die einem ist das gleichbedeutend mit "da kommt dichter und schneller Code raus", für andere mag es bedeuten "leicht zu bedienen und zu erlernen". Für wieder jemand anderen kann es bedeuten "da kann man sehr schnell entwickeln, es ist portabel, fehlerunanfällig und leicht erweiterbar"...