- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 8 von 8

Thema: PID-Regelalgorithmus und seine Implementierung in C

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.02.2004
    Alter
    41
    Beiträge
    171

    PID-Regelalgorithmus und seine Implementierung in C

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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.

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    48
    Beiträge
    1.146
    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:
    Code:
    static int x;
    zu 2) Dazu ließt Du Dir am besten mal das Kapitel "Casting - implizit und explizit" auf dieser Seite durch. (Zuerst rechts auf Inhaltsverzeichnis klicken).

    Gruß,
    askazo

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802

    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"...
    Disclaimer: none. Sue me.

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    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
    Software is like s e x: its better when its free.
    Linus Torvald

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.02.2004
    Alter
    41
    Beiträge
    171
    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!

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    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
    Software is like s e x: its better when its free.
    Linus Torvald

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    08.03.2006
    Beiträge
    22
    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

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo zusammen,
    ich will euch nur auf folgenden Threat von waste hinweisen (Asuro: Linienfolger mit PD-Regler):
    https://www.roboternetz.de/phpBB2/ze...ag.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.
    Lieber Asuro programieren als arbeiten gehen.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress