-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: [gelöst] software PID Regler

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.12.2007
    Beiträge
    280

    [gelöst] software PID Regler

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    hallo!

    Ich hatte eigentlich vor, mir ein Schaltnetzteil zu bauen, bei dem durch ein PWM Signal ein TTL-Mosfet angesteuert wird. Durch das Verhältnis der Einschalt- zur Ausschaltzeit sollte man eine Gleichspannung zwischen 0V und 30V einstellen können. Jetzt konnte ich wunderschön die Pulsweite verändern und so die unterschiedlichen Spannungen erhalten. Mein Problem ist jetzt aber die Regelung des ganzen. Über nen 10bit AD vom Wandler (AtMEGA32) erfasse ich die Ist Spannung. Bis jetzt hab ichs immer einfach verglichen:

    IstSpannung < Sollspannung -> PWM erhöhnen
    und andersrum....

    Dabei fängt die Ausgangsspannung verständlicherweise enorm zum schwingen an. Deswegen wollte ich einen PID Regler (softwaremäsig) realisieren. Ich hab mich im Wiki schon eingelesen und bin auf das hier gestoßen:

    e = w - x
    esum = esum + e
    y = Kp * e + Ki * Ta * esum + Kd * (e – ealt)/Ta
    ealt = e

    Dabei ist w meine Sollspannung X mein ist Wert und Ta die Tastrate.
    Das ganze hab ich eigentlich auch schon verstanden. Nur wie verwandel ich das Y, also die Stellgröße, in die Abtastrate um. Denn eigentlich stellt ja das Y eine Spannung da, die angestrebt werden soll.

    Ok ich weis ziemlich viel Text, aber ich hoffe ich hab nichts vergessen und alles genau genug erklärt.

    Vielen Dank für eure Hilfe!

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.12.2007
    Beiträge
    280
    Weis keiner eine Lösung? Ich will doch nur aus ner gemessenen Spannung und nem Sollwert einen PWM Wert ermitteln, den ich einstellen muss! Der Algorithmus muss ja nicht perfekt sein! Hauptsache die Schwingungen treten nicht mehr so massiv auf!

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von Hessibaby
    Registriert seit
    20.11.2003
    Ort
    Gelsenkirchen
    Alter
    65
    Beiträge
    1.597
    Software ist eine Komponente, Hardware die Andere.
    Poste mal das Schaltbild.

    Gruß Hartmut

    Planung ersetzt Zufall durch Irrtum

    Gruß aus dem Ruhrgebiet Hartmut

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.09.2006
    Beiträge
    734
    Hallo Martin,
    ich habe so etwas noch nie gemacht, aber vielleicht hilft dir meine Vorstellung weiter:

    Nur wie verwandel ich das Y, also die Stellgröße, in die Abtastrate um
    Warum solltest du das wollen? Die Abtastrate ist gegeben durch deinen AD-Wandler.



    Ich würde Y als Stellgröße verwenden. Der Wert von Y muss dabei nur auf den Bereich deiner PWM skaliert werden. D.h.
    wenn y=0 --> pwm=0
    wenn y=y_max --> pwm = pwm_max
    und der rest dazwischen linear skaliert. So schwierig ist das nicht, musst nur schauen welche Werte rauskommen können und dann fröhlich teilen.

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.12.2007
    Beiträge
    280
    Also erstmal vielen Dank! Des werd ich gleich mal ausprobieren! Hab mich da eh ein bisschen verschrieben ich meinte, icht Abtastrate, sondern Verhältnis zwischen High und Low!

    Deine Gedanken hatte ich auch schon, aber ich dachte nicht, dass die Funktion U in Abhängigkeit des PWM Signals linear verläuft. Ich dachte, des Wäre irgendeine Kurve.

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.12.2007
    Beiträge
    280
    So ich bin nun endlich wieder dazugekommen, an meinem regelungsprogramm weiterzuarbeiten.

    Leider funktioniert es immer noch nicht. Konkret schaut es nun so aus:

    Code:
    Dim E As Single , Esum As Single , Ealt As Single
    
    Cls
    
    Start Adc
    
    
    Dim Sollwert As Single
    Dim Istwert As Single
    Dim Stellwert As Single
    Dim W As Word
    
    
    Stellwert = 0
    Sollwert = 3.00
    Ealt = 0
    
    Cyclic:
       Waitms 50
       Gosub Regulator
    Goto Cyclic
    
    
    Regulator:
    
       Pwm1a = Stellwert
    
       Const Kp = 0.0
       Const Ki = 0.0
       Const Kd = 1
    
       Dim Panteil As Single
       Dim Ianteil As Single
       Dim Danteil As Single
    
       W = Getadc(0)
       Istwert = W / 1023
       Istwert = Istwert * 50
    
       E = Sollwert - Istwert
    
       Esum = Esum + E
    
       Panteil = Kp * E
       Ianteil = 0.05 * Esum
       Ianteil = Ianteil * Ki
    
       Danteil = E - Ealt
       Danteil = Danteil * Kd
       Danteil = Danteil * 20                                   '1 / Ta  = 20, da Ta  = 0.05ms'
    
       Stellwert = Panteil + Danteil
       Stellwert = Stellwert + Ianteil
    
       Ealt = E
    
    
       Locate 1 , 1
       Lcd Stellwert
       Locate 2 , 1
       Lcd Fusing(istwert , "#.##")
    Return
    Ich hab mich dabei mit an dem Bascom Beispiel orientiert. Darum auch die 50ms Verzögerung am Anfang. Ich hab mir auch den anderen Beitrag im Forum zu dem Beispiel durchgelesen und weis, dass es nicht das beste ist. Mein Problem ist immer noch folgendes, dass der Stellwert teilweise negativ wird. Kp und Ki hab ich absichtlich weggelassen um ersteinmal Ki einzustellen. Nur wie bring ich jetzt den Stellwert in Verbindung mit dem PWM wert. Der Stellwert kann ja auch negativ werden. Ich wäre für vorschläge sehr dankbar. Achja: der Faktor 0.05 stellt die Abtastrate (50ms Verzögerung dar, und der Faktor 20 der Kehrwert)

    Vielen Dank für eure Hilfe.

    Martin

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.12.2007
    Beiträge
    280
    Um das ganze jetzt mal zum abschluss zu bringen:

    Ich habe mich jetzt doch für die alte brachiale Methode ohne I oder D Regler entschieden. Es läuft schon nicht schlecht! Falls jemand noch nen Bascom code braucht, für ne Spannungsquelle bzw. Konstantstromquelle, bitte sehr:

    Code:
    Dim W As Word
    Dim Spannung As Single
    Dim Strom As Single
    Dim A As Word
    Dim Sollspannung As Single
    Dim Sollstrom As Single
    
    
    
    Cls
    
    Start Adc
    A = 0
    
    Sollspannung = 0.0
    Sollstrom = 0.10
    
    Do
       Locate 1 , 1
       Lcd Fusing(spannung , "#.##")
    
       Locate 2 , 1
       Lcd Fusing(strom , "#.###")
    
       W = Getadc(0)
       Spannung = W / 1023
       Spannung = Spannung * 50
    
       W = Getadc(1)
       Strom = W / 1023
       Strom = Strom * 5
    
       If Sollspannung <> 0 Then
          If Spannung < Sollspannung Then
             If A < 1023 Then
                A = A + 1
             End If
          End If
          If Spannung > Sollspannung Then
             If A > 0 Then
                A = A - 1
             End If
          End If
       End If
    
       If Sollstrom <> 0 Then
          If Strom < Sollstrom Then
             If A < 1023 Then
                A = A + 1
             End If
          End If
          If Strom > Sollstrom Then
             If A > 0 Then
                A = A - 1
             End If
          End If
       End If
    
    
       Pwm1a = 1023 - A
       Pwm1b = A
    
       Waitms 50
    Loop

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Robotniks
    Registriert seit
    13.10.2007
    Beiträge
    168
    Ist aber eher ein I Regler als ein P Regler.

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.12.2007
    Beiträge
    280
    I Regler?

    Ich summier doch gar nichts auf?

    Ich vergleich ja bloß und dem entsprechend, unabhängig von Ta wird eine Regelung betrieben. Ich denke nicht, dass es ein I Regler ist.

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    31.03.2004
    Beiträge
    57
    Hallo, ich möchte noch einmal auf deinen anfänglichen Beitrag zurückkommen: Die Regleralgorithmen ergeben einen Wert für die Stellgröße. Ich würde zum ersten Erproben zunächst nur den P-Anteil verwenden:
    Y=kp*e. Wenn der P-Anteil richtig funktioniert, bleibt zwar eine Regeldifferenz , aber du weisst, dass die Funktion schon mal da ist.
    Da du mit Puls-Weiten-Modulation arbeitest, musst du aus dem Wert von Y die Pulsdauer gewinnen (deine eigentliche Frage?)
    Das müsste m.E so funktionieren:
    Die Max Pulsdauer hat einen bestimmten Wert, z.B. 50ms.
    Wenn Y seinen max.Wert hat (z.B. entsprechend dem Wertebereich deiner Variablen Y), dann entspricht dies der max. Einschaltimpulsdauer = 50ms.
    Andere Werte von Y werden dann linear umgerechnet: TPuls = TPulsmax * Y / Ymax.
    KP musst du jetzt durch experimentieren so einstellen, dass der Regler ohne zu schwingen möglichst weit an den Sollwert heranregelt.
    Wenn das funktioniert, bist du ein ganzes Stück weiter, denn du weisst, dein Regler funktioniert grundsätzlich.
    Jetzt programmierst du dir den I-Anteil wie im ersten Beitrag dazu und stellst ki so ein, dass möglichst schnell der Sollwert erreicht wird, ohne kp nocheinmal zu verändern.
    Ob du dann noch den D-Anteil brauchst, musst du erproben. Wahrscheinlich nicht.
    Viel Glück - Grüße von Jens

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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