Inhaltsverzeichnis:

PID-Controller VHDL - Gunook
PID-Controller VHDL - Gunook

Video: PID-Controller VHDL - Gunook

Video: PID-Controller VHDL - Gunook
Video: Lecture 73: Digital PID Control Implementation using Verilog HDL Programming 2024, November
Anonim
PID-Regler VHDL
PID-Regler VHDL
PID-Regler VHDL
PID-Regler VHDL

Dieses Projekt war mein letztes Projekt, um meinen Honours Bachelor Degree vom Cork Institute of Technology abzuschließen. Dieses Tutorial ist in zwei Abschnitte unterteilt. Der erste behandelt den Hauptteil des PID-Codes, der den Hauptzweck des Projekts darstellt, und der zweite Abschnitt behandelt die Schnittstellen des Codes, der auf einem Basys 3-Entwicklungsboard implementiert und dann mit einem Ping-Pong-Ball verbunden wurde Schwebeanlage. Die theoretische und gebaute Anlage sind in den beigefügten Bildern dargestellt.

Lieferungen

Simulation

Vivado Designsuite

Implementierung (in den Klammern ist das, was für mein Projekt verwendet wurde)

  • FPGA-Board, das digitale / analoge Signale ein- und ausgeben kann (Basys 3)
  • ein System, das mit einer einzigen Rückkopplungsquelle steuerbar ist (Ping Pong Ball Levitation Rig)

Rig

  • Polycarbonatrohr
  • 5V Lüfter
  • IR-Sensor
  • 3D-gedruckte Basis (Dieses Tutorial dokumentiert die Konstruktion des Rigs, dem der Sensor hinzugefügt wurde, um Feedback zu geben, aber das Rig war im Allgemeinen gleich)
  • 1k Widerstände
  • Steckbrett mit 5V und GND-Schiene

Schritt 1: Grundlegende Kontrolltheorie

Grundlegende Kontrolltheorie
Grundlegende Kontrolltheorie

Ich dachte, dass das Hinzufügen einer grundlegenden Kontrolltheorie jedem, der diesen Code ausprobieren und implementieren möchte, eine gute Basis für den Anfang geben würde.

Das beigefügte Diagramm ist das Layout eines Einzelschleifenreglers.

r- Ist die Referenz. Dies bestimmt, wohin der Controller gehen soll.

e-ist der Fehler. Dies ist die Differenz zwischen dem Wert auf Ihrem Sensor und Ihrer Referenz. z. B. e=r-(d+Ausgang des Sensors).

K-Das ist der Controller. Ein Controller kann aus drei Begriffen bestehen. Diese Terme sind P, I und D. Alle drei Terme haben Multiplikatoren namens Kp, Ki und Kd. Diese Werte bestimmen die Reaktion des Controllers.

  • P-proportional. Ein reiner P-Regler hat einen Ausgang proportional zum Stromfehler. Ein P-Regler ist einfach zu implementieren und arbeitet schnell, erreicht jedoch nie den von Ihnen eingestellten Wert (Referenz).
  • I-Integral. Ein streng integraler Regler summiert den vorherigen Fehler, der schließlich den gewünschten Sollwert erreicht. Dieser Controller ist im Allgemeinen zu langsam zu implementieren. Das Hinzufügen eines P-Terms verringert die Zeit, die benötigt wird, um die Referenz zu erreichen. Die Zeit, zu der der Eingang abgetastet wird, muss berücksichtigt werden, der Integralterm wird zeitintegriert.
  • D-Derivat. Der Ableitungsterm hat eine Ausgabe, die von der Fehleränderungsrate abhängt. Dieser Begriff wird im Allgemeinen mit einem P-Term oder mit einem PI-Term verwendet. Da dies proportional zur Fehleränderungsrate ist, wird das Rauschen eines verrauschten Singles verstärkt, was dazu führen kann, dass ein System instabil wird. Die Zeit muss auch berücksichtigt werden, da der Ableitungsterm auch in Bezug auf die Zeit steht.

U- Dies ist das Steuersignal. Dieses Signal ist ein Eingang zum Rig. In diesem Projekt ist das u ein PWM-Signaleingang zum Lüfter, um die Geschwindigkeit zu ändern.

G- Dies ist das System, das gesteuert wird. Dieses System kann mathematisch im S- oder Z-Bereich modelliert werden. Die Systeme können bis zur n-ten Ordnung sein, aber für jemanden, der mit der Steuerung beginnt, sollte wahrscheinlich ein System erster Ordnung angenommen werden, da dies viel einfacher zu berechnen ist. Das ist eine Fülle von Informationen über das Modellierungssystem online zu finden. Abhängig von der Abtastzeit des Sensors ist das Modell des Systems entweder diskret oder kontinuierlich. Dies hat drastische Auswirkungen auf den Controller, daher wird empfohlen, beides zu untersuchen.

d- Dies ist eine Störung, die dem System hinzugefügt wird. Störung sind äußere Kräfte, die das Modell des Systems nicht berücksichtigt. Ein einfaches Beispiel dafür wäre eine Drohne, die Sie in 5 Metern Höhe schweben möchten. Ein Windstoß kommt und lässt die Drohne 1 Meter fallen. Der Controller positioniert die Drohne neu, nachdem die Störung aufgetreten ist. Dies wird als Störung bezeichnet, da der Wind nicht wiederholbar ist und daher nicht modelliert werden kann.

Um den Controller zu stimmen, gibt es zu viele Regeln, um sie zu nennen, aber einige gute, mit denen ich angefangen habe, sind Cohen Coon und Zieger Nichols.

Die Modellierung eines Systems ist im Allgemeinen der wichtigste Teil ohne ein genaues Modell wird der Controller, der entworfen wurde, nicht wie gewünscht reagieren.

Hier sollten genügend Informationen vorhanden sein, um zu verstehen, wie der Controller funktioniert, zusammen mit einigen individuellen Recherchen und dem folgenden Code, um einen Controller mit einer beliebigen Kombination der drei Begriffe zu implementieren.

Schritt 2: PID-Code schreiben

PID-Code schreiben
PID-Code schreiben

Das Grundprinzip des Codes unter dem folgenden Link wurde übernommen und modifiziert, da dieser Code nicht funktionierte, aber viele der Prinzipien nicht richtig waren, was einen guten Ausgangspunkt bot. Original-PID Der Code hatte mehrere Fehler wie

  • Kontinuierlicher Betrieb – der Controller ist vererbbar diskret, sodass der Controller so eingestellt werden musste, dass er nur alle 3 Terme berechnet, wenn ein neuer Eingang verfügbar war. Der Workaround für diese Simulation bestand darin, zu überprüfen, ob sich die Eingabe seit dem letzten Mal geändert hat. Dies funktioniert nur, um den ordnungsgemäß funktionierenden Code zu simulieren.
  • Die Abtastzeit hatte keinen Einfluss auf den Integral- und Ableitungsterm - Der Controller berücksichtigte auch nicht die Zeit, in der die Abtastung übernommen wurde, daher wurde ein Wert namens Teiler für die Zeit hinzugefügt, um sicherzustellen, dass die Integral- und Ableitungsterme korrekt arbeiten Intervall.
  • Fehler konnte nur positiv sein - bei der Berechnung des Fehlers gab es auch ein Problem, da der Fehler niemals negativ sein konnte, dh wenn das Istwertsignal den Sollwert überschritten hatte, würde der Regler den Ausgang weiter erhöhen, wenn er dekrementieren sollte.
  • Verstärkungswerte für die 3 Terme waren ganze Zahlen - meiner Erfahrung nach habe ich immer festgestellt, dass die Werte für die 3 Terme im Controller immer Gleitkommazahlen sind, da Basys 3 keine Gleitkommazahl hat, mussten die Werte einen Zählerwert und a. erhalten Nennerwert, der als Abhilfe dienen würde, um dieses Problem zu überwinden.

Der Code ist unten angehängt. Es gibt den Hauptteil des Codes und eine Testbench, um den Code zu simulieren. Der Zip-Ordner enthält den Code und die Testbench bereits in Vivado, so dass er zeitsparend geöffnet werden kann. Es gibt auch einen simulierten Test des Codes, der zeigt, dass die Ausgabe die Referenz verfolgt. Dies beweist, dass der Code wie beabsichtigt funktioniert.

Schritt 3: So ändern Sie für Ihr System

Erstens sind nicht alle Systeme gleich, man muss die Inputs und Outputs des Systems analysieren. In meinem Fall war der Ausgang meines Rigs, der mir einen Wert für die Position lieferte, ein analoges Signal und der Eingang vom System war ein PWM-Signal. Das bedeutet, dass eine ADC-Konvertierung erforderlich war. Glücklicherweise hat das Basys 3 einen eingebauten ADC, so dass dies kein Problem war. Der Ausgang des IR-Sensors musste auf 0V-1V herunterskaliert werden, da dies die maximale Reichweite des Onboard-ADCs ist. Dies geschah unter Verwendung einer Spannungsteilerschaltung, die aus 1k-Widerständen besteht, die als 3k-Widerstand in Reihe mit einem 1k-Widerstand angeordnet sind. Das analoge Signal war jetzt in Reichweite des ADC. Der PWM-Eingang des Lüfters kann direkt vom Ausgang eines PMOD-Ports am Basys 3 angesteuert werden.

Schritt 4: I/O auf Basys 3. nutzen

Es gibt eine Reihe von I/O auf dem Basys 3, die ein einfacheres Debuggen ermöglichte, wenn der Code ausgeführt wurde. die E/A wurde wie folgt eingerichtet.

  • Sieben-Segment-Anzeige - Dies wurde verwendet, um den Wert der Referenz und den Wert des ADC in Volt anzuzeigen. Die ersten beiden Stellen der Sieben-Segment-Anzeige zeigen die zwei Stellen nach der Dezimalstelle des ADC-Wertes, da der Wert zwischen 0-1V liegt. Die Ziffern drei und vier auf der Sieben-Segment-Anzeige zeigen den Referenzwert in Volt, dies zeigt auch die ersten beiden Stellen nach dem Komma, da der Bereich ebenfalls zwischen 0-1V liegt.
  • 16 LEDs - Die LEDs wurden verwendet, um den Wert der Ausgabe anzuzeigen, um sicherzustellen, dass die Ausgabe gesättigt war und sich die Ausgabe korrekt änderte.

Schritt 5: Rauschen am IR-Sensorausgang

Es gab Rauschen am Sensorausgang, um dieses Problem zu beheben, wurde ein Mittelungsblock installiert, da dies ausreichend war und sehr wenig Arbeit erforderte.

Schritt 6: Gesamtcode-Layout

Gesamtes Code-Layout
Gesamtes Code-Layout

Es gibt ein Stück Code, über das noch nicht gesprochen wurde. Dieser Code ist ein Taktteiler, der Trigger genannt wird. dieses Codebit löst das Abtasten des ADC-Codes aus. Der ADC-Code benötigt maximal 2 us, um den aktuellen Eingang und den vorherigen Eingang zu vervollständigen. 1us nach dieser Mittelwertbildung berechnet der Regler P-, I- und D-Terme. das Gesamtlayout des Codes und der Schnittstellen ist im behelfsmäßigen Anschlussplan dargestellt.

Schritt 7: Testen

Testen
Testen

Der Code wurde auf dem Basys 3 bereitgestellt und die folgende Antwort wurde aufgezeichnet. die Referenz wechselte zwischen 2 Werten. was im beigefügten abgeschlossenen Projektcode der Fall ist. Das angehängte Video zeigt diese Reaktion in Echtzeit. Die Schwingungen klingen im oberen Teil der Röhre schneller ab, da der Regler für diesen Bereich konzipiert wurde, aber weiter unten in der Röhre funktioniert der Regler nicht so gut, da das System nicht linear ist.

Schritt 8: Änderungen zur Verbesserung des Projekts

Das Projekt funktionierte wie beabsichtigt, aber es gab ein paar Änderungen, die ich gemacht hätte, wenn das Projekt verlängert worden wäre.

  • Implementieren Sie einen digitalen Filter, um das Rauschen vollständig zu dämpfen
  • Richten Sie den ADC-Code, den Durchschnittscode und den Integrationscode so ein, dass sie nacheinander ausgelöst werden.
  • Verwenden Sie einen anderen Sensor für die Rückmeldung, da die nichtlineare Reaktion dieses Sensors bei diesem Projekt eine Vielzahl von Problemen verursacht hat, aber das ist mehr auf der Steuerungsseite als auf der Codierungsseite.

Schritt 9: Zusätzliche Arbeit

Im Laufe des Sommers habe ich Code für einen Kaskadenregler geschrieben und die von mir empfohlenen Modifikationen für den Einzelschleifen-PID-Regler implementiert.

Änderungen am regulären PID-Regler

· FIR-Filtervorlage implementiert Die Koeffizienten müssen geändert werden, um die gewünschte Grenzfrequenz zu erreichen. Die aktuelle Implementierung ist ein 5-Tap-Tannenfilter.

· Das Timing des Codes wurde so eingestellt, dass der Filter das neue Sample weiterleitet und wenn die Ausgabe fertig ist, wird der Integralterm ausgelöst, was bedeutet, dass der Code geändert werden kann, um in verschiedenen Zeitintervallen mit weniger Aufwand zu arbeiten Code.

· Die Haupt-For-Schleife, die das Programm antreibt, wurde ebenfalls reduziert, da diese For-Schleife zuvor 7 Zyklen benötigte, was die maximale Betriebsgeschwindigkeit des Controllers verlangsamte innerhalb von 4 Taktzyklen.

Testen

Dieser Controller wurde wie beabsichtigt getestet und durchgeführt. Ich habe diesen Beweis nicht fotografiert, da dieser Teil des Projekts nur dazu diente, den Geist aktiv zu halten. Der Code zum Testen sowie die Testbench werden hier verfügbar sein, damit Sie das Programm vor der Implementierung testen können.

Warum einen Kaskadenregler verwenden?

Ein Kaskadenregler steuert zwei Teile des Systems. In diesem Fall hätte ein Kaskadenregler eine äußere Schleife, bei der es sich um einen Regler handelt, der eine Rückmeldung vom IR-Sensor hat. Die innere Schleife hat eine Rückmeldung in Form einer Zeit zwischen den Impulsen des Tachometers, die die Drehzahl des Lüfters bestimmt. Durch die Implementierung einer Steuerung kann eine bessere Reaktion des Systems erreicht werden.

Wie funktioniert der Kaskadenregler?

Die äußere Regelschleife des Controllers liefert einen Wert für die Zeit zwischen den Impulsen an die innere Regelschleife. Dieser Controller wird dann das Tastverhältnis erhöhen oder verringern, um die gewünschte Zeit zwischen den Impulsen zu erreichen.

Durchführung von Modifikationen am Rig

Leider konnte ich diese Modifikationen nicht am Rig durchführen, da ich keinen Zugriff darauf hatte. Ich habe den überarbeiteten Single-Loop-Controller getestet, der wie vorgesehen funktioniert. Den Kaskadenregler habe ich noch nicht getestet. Ich bin zuversichtlich, dass der Controller funktioniert, es sind jedoch möglicherweise einige geringfügige Änderungen erforderlich, um wie beabsichtigt zu funktionieren.

Testen

Ich konnte den Controller nicht testen, da es schwierig war, zwei Eingangsquellen zu simulieren. Das einzige Problem, das ich beim Kaskadenregler sehen kann, besteht darin, dass ein größerer Sollwert tatsächlich eine niedrigere Drehzahl für den Lüfter ist, da die äußere Schleife versucht, den an die innere Schleife gelieferten Sollwert zu erhöhen, was jedoch leicht behoben werden kann. Nehmen Sie den Sollwert aus dem Maximalwert des Sollwertsignals (4095 - Sollwert - Tacho_Ergebnis).

Schritt 10: Fazit

Insgesamt funktioniert das Projekt so, wie ich es zu Beginn des Projekts beabsichtigt hatte, daher bin ich mit dem Ergebnis zufrieden. Vielen Dank, dass Sie sich die Zeit genommen haben, meinen Versuch zu lesen, einen PID-Regler in VHDL zu entwickeln. Wenn jemand versucht, eine Variation davon auf einem System zu implementieren und etwas Hilfe zum Verständnis des Codes benötigt, kontaktieren Sie mich, ich werde so schnell wie möglich antworten. Jeder, der die zusätzliche Arbeit versucht, die zwar durchgeführt, aber nicht ausgeführt wurde, kann sich gerne an mich wenden. Ich würde mich sehr freuen, wenn mir jemand mitteilen würde, wie es gelaufen ist.