PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PID-Regelalgorithmus und seine Implementierung in C



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.

askazo
18.03.2006, 20:08
Zu 1) Wenn Du innerhalb einer Funktion eine Variable als static deklarierst, bleibt der Wert bis zum nächsten Aufruf erhalten, ist allerdings im Gegensatz zur globalen Variable nur innerhalb der Funktion bekannt. Im code sieht das z.B. so aus:
static int x;

zu 2) Dazu ließt Du Dir am besten mal das Kapitel "Casting - implizit und explizit" auf dieser Seite (http://www.mathematik.uni-marburg.de/~cpp/) durch. (Zuerst rechts auf Inhaltsverzeichnis klicken).

Gruß,
askazo

SprinterSB
19.03.2006, 09:25
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"...

izaseba
19.03.2006, 11:04
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.


Ein schlechter Handwerker schimpft immer mit seinem Werkzeug.
Deine Fragen deuten darauf hin daß Du Dich mit dieser Sprache noch garnicht auseinandergesetzt hast.

Gruß Sebastian

farmerjo
19.03.2006, 12:11
Nun ja ich hab schon ne C-Vorlesung gehört und die Prüfung mit 2 bestanden, das war aber auch C für den PC und meistens ging es darum Biegelinien oder so was auszurechnen. Ich find auch einfach die Dokumentaion die bei dem GCC Kompilier ist nicht sher gut gemacht, da steht zwar fast alles drin, aber bis man es mal gefunden hat.
Ich denke C ist gut weil es doch einfach ist das ganze auf einen anderen Controller zu portieren. Mit Bascom bin ich an den AVR oder mit einschränkungen noch an den 8051 gefesslet, bei C fast überhaupt nicht.

Gruß Johann!

izaseba
19.03.2006, 12:41
eine Vorlesung?
Ich habe in meinem Berufsleben genug Vorlesungen und Schulungen mitgemacht, sie dienten nur einem Zweck:
Geld aus der Tasche zu ziehen, um ein Zertifikat zu bekommen.
Klar hab ich nacher immer schön eine Urkunde bekommen Herr bla bla hat blabla und ist qualifiziert um blabla zu machen.
Aber ohne Praxis ist da nix, die meisten Schulungen hab ich nur gemacht, um so einen blöden Wisch zu bekommen, weil ohne Wisch kannst Du in Deutschland kaum was machen.
Ich will damit nur sagen, wenn das Dein erstes C Projekt ist, dauert es vielleicht länger als wenn Du es mit Basic machst, aber beim 2, 5, 10
sieht es schon anders aus.

Gruß Sebastian

tschensen
19.03.2006, 21:58
Hoi

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.

Das find ich gut. Ich werde bei meinem Projekt zu einem späteren Zeitpunkt auch noch mit einer digitalen Regelung auseinander setzen. ;-) Wär super wenn de dein ERgebnis hier posten könntest.

Leider kann ich dir nicht viel helfen, programmier das erste Mal nen Mikrocontroller.

Jens

Sternthaler
19.03.2006, 23:44
Hallo zusammen,
ich will euch nur auf folgenden Threat von waste hinweisen (Asuro: Linienfolger mit PD-Regler):
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=11818
Wer fit ist, liest sich das ganze von vorne bis hinten durch, wer nicht fit ist, wird es mit ein bischen Ausdauer am Ende sein.
Auf Seite 4 vom Threat hat waste seinen Code veröffentlicht.
Eine weitere Anwendung dieses Reglers (abgewandelte Aufgabenstellung) gibt es unter (ASURO ... ein kleiner Wettbewerb) von stochri:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=10291

@izaseba: Ja, die Deutschen lieben Wische, oder heisst das Wisches? Du hast vollkommen Recht, das man so einen Zettel nicht mit Erfahrung verwechseln darf.

@farmerjo: Ich weise zwar auf die beiden Links hin, aber es ist tatsächlich ne gute Übung deinen ja schon vorhandenen Code selber nach C umzusetzen. Du musst dich in diesem Fall ja nicht mit dem Algoritmus, sondern 'nur' mit den neuen C-Formalitäten auseinandersetzen.
Zu deinen Fragen hast du ja schon Antworten bekommen. Von mir also 'nur' noch viel Erfolg.