Home > Technologie > Freilauf-Pendelsteuerung

Freilauf-Pendelsteuerung

Advertisement

Freilauf-Pendelsteuerung

Dieses Projekt wurde aus der Basis der Cubli Projekt der ETH Zürich. Die Cubli ist ein Würfel, der drei hat Reaktionsräder das Gleichgewicht der x zu steuern, y- und z - Ebenen des Würfels. Dadurch kann sich der Würfel entweder an einer Kante oder an einer Ecke balancieren. Ein Video des Cubli endgültige Design gefunden werden kann hier .

Dieses Projekt zielte darauf ab, nur eine einzige Dimension des cubli-Projekts zu schaffen. Wir benutzten eine Xilinx Zynq-Platine, die eine CPU und ein FPGA auf dem gleichen Silizium-Chip hatten, der es uns ermöglichte, eine benutzerdefinierte Architektur auf dem FPGA zu bauen, um mit der CPU zu paaren. Wir haben auch freies RTOS das Programm auf der CPU - Seite auszuführen. Die FPGA - Architektur verwendet , um die freie Vivado Webpack für die Entwicklung.

Das Projekt besteht aus digitalen Steuerungen mit Zustandsraumsystem Modelldarstellung und LQR optimale Steuerung. Die freie RTOS-Seite wurde verwendet, um Benutzereingaben, sowie unsere I2C-IMU zu lesen und den Steuerelementcode auszuführen. Die gewünschte Motordrehzahl wurde dann dem FPGA zugeführt, welches das Erzeugen der erforderlichen PWM-Wellenform sowie das Lesen unseres optischen Codierers bearbeitete.

Schritt 1: Komponenten Einkaufsliste

Freilauf-Pendelsteuerung

Freilauf-Pendelsteuerung

Freilauf-Pendelsteuerung

Elektronik

  • Dieses Projekt verwendet , um die Entwicklungs - Board Xilinx Zybo Zynq 7000 , die ebenso wie ein Xilinx 7-Serie FPGA Dual-Core ARM Cortex-A9 - Prozessoren enthält.
  • Eine IMU (MPU-6050) wurde verwendet , um die Winkelgeschwindigkeit und die Position des Pendelkörpers zu messen.
  • Ein bürstenloser Gleichstrommotor wurde verwendet , um die Freilauf zu fahren
  • Ein Standard - ESC wurde verwendet , um den Motor zu steuern ,
    • Wir haben eine Standard-Quadcopter ESC, aber das ist nicht empfehlenswert. Wir konnten die Geschwindigkeit des Motors nicht auf eine fein genug Granularität kontrollieren. Dies ist einer der Gründe, warum dieses Projekt nicht erfolgreich war.
  • Wurde ein eigenständiger optischer Encoder gebaut, um die Geschwindigkeit des Rades zu messen

Rahmen

  • Unter Verwendung von Aluminium wurde ein Rad mit so viel Gewicht nach außen wie möglich ausgearbeitet. Dies erzeugt ein größeres Trägheitsmoment von dem Spinnrad, das ein größeres Drehmoment auf den Pendelkörper aufbringt.
    • Wenn überhaupt möglich, ein Rad mit einem Ring von Masse auf der Außenseite und mit Speichen im Inneren. Dies führt zu dem höchsten Trägheitsmoment.
  • Ein hölzerner quadratischer Rahmen wurde mit Furnierholz gebaut, um den Motor, Rad, IMU und optischen Encoder anzubringen. Dies wird in späteren Schritten als Pendelkörper bezeichnet. Dies wird in den obigen Bildern gezeigt.
  • Eine Halterung für den Pendelkörper wurde unter Verwendung von zwei kleinen Platten mit darin montierten Lagern hergestellt. Ein Aluminiumstab wurde dann durch die untere Ecke des Pendelkörpers und dann durch die Lager angebracht.
    • Dieses Verfahren führte zu einer angemessenen Menge an seitlicher Bewegung. Versuchen Sie, etwas mehr vergleichbar mit der Verwendung dieser .

Das Motordrehmoment ist konstant

Die Motordrehmomentkonstante ist in der Regel auf dem Motordatenblatt angegeben, aber wenn nicht, wie in unserem Fall, können Sie die KV (rpm / v) Bewertung verwenden, wenn der Motor das Motordrehmoment konstant findet.

Motor-Drehmoment = 60 / (2 * pi * KV)

Optischer Encoder

Der optische Encoder wurde mit einem Infrarot-Sensor entwickelt, der auf die Außenseite des Rades gerichtet war. Acht schwarze elektrische Bandlinien wurden in gleichmäßigen Intervallen auf der Außenseite des Rades aufgeklebt. Der Codierer würde einen hohen Wert detektieren und ausgeben, wann immer er oberhalb des schwarzen Bandes war, und einen niedrigen Wert, wenn es nicht war. Dies kann durch den Zynq-Chip erfasst und in einen Drehzahlwert umgewandelt werden.

Schritt 2: Sensoreingänge

Freilauf-Pendelsteuerung

Freilauf-Pendelsteuerung

In diesem Projekt wurden zwei verschiedene Sensoren, ein 6-Achs-IMU und ein optischer Drehzahlgeber verwendet. Die verwendete IMU war die MPU-6050 und kommunizierte über einen I2C-Bus zur Zynq-Platine.

Der optische Encoder wurde erstellt, indem schwarze Streifen in Streifen um die Außenseite des Schwungrades. Dann wurde ein Linienfolgesensor verwendet, um das Vorhandensein oder Fehlen eines schwarzen Bandes zu detektieren. Dieses Signal musste verstärkt werden und benötigte eine eigene Verstärkerplatine. Der Schaltplan für dieses Board ist in diesem Abschnitt dargestellt. Der verstärkte Ausgang wurde dann der FPGA-Seite der Zynq-Platine zugeführt.

Schritt 3: FPGA-Gewebe

Freilauf-Pendelsteuerung

Die Codebasis wurde zwischen dem FPGA-Gewebe und der ARM Cortex-A9-CPU auf dem Zynq-Chip aufgeteilt. Das FPGA-Gewebe war verantwortlich für die Ausgabe einer PWM-Welle an den Motor sowie das Filtern und Lesen der Motordrehzahl.

Motorsteuerung

Der verwendete Motorantrieb bestimmte die Ausgangsdrehzahl, indem er im Tastverhältnis einer 500 Hz PWM-Wellenform von der Zynq-Platine las. Diese PWM-Erzeugung erfolgte in Hardware. Dieser Block würde einen Tastverhältnis zwischen 0 und 100 annehmen und die PWM an die Motorsteuerung ausgeben. Der Netto-Effekt von diesem war, dass alle CPU zu tun hatte, um die Motordrehzahl zu schreiben war ein Wert zwischen 1 und 100 zu einem Register. Der Motor würde dann auf eine vorhersagbare Geschwindigkeit drehen.

Glitch Filter

Während unser optisches Kodierungsverfahren für die Geschwindigkeitsdetektion gut funktionierte, war der Eingang manchmal verrauscht. Die Lösung für dieses Rauschen war ein einfaches Glitch-Filter. Der Block, der von dem optischen Codierer eingelesen wurde, und wenn die letzten 5 Werte hoch waren, würde ein hoher Wert ausgegeben. Andernfalls würde es einen niedrigen Wert ausgeben. Dies entschärfte das Rauschen des optischen Encoders und machte es für die Messung geeignet.

Motorgeber

Dieser Baustein hat den gefilterten Encodereingang übernommen und einen Drehzahlwert an die CPU ausgegeben. Es funktionierte durch das Zählen der Taktimpulse eines 100 MHz Taktes zwischen jeder ansteigenden Flanke des Encodereingangs. Mit einem Durchschnitt von 16 dieser Werte, konnten wir eine Geschwindigkeit in Ticks / Stück Band zu bekommen. Dann wissend, dass es 8 Stück Klebeband auf dem Schwungrad gab, konnten wir diesen Wert in Zecken / Umdrehung umwandeln. Dies ist der Wert, der schließlich an die CPU übergeben wurde. Das Wichtigste an diesem Wert ist, dass mit zunehmender Drehzahl der "Drehzahl" -Wert abnimmt. Obwohl wir es vorgezogen hätten, einen Geschwindigkeitswert in Rotationen / Sekunde zu übergeben, müssten wir eine Umkehrung nehmen, was in einem FPGA sehr kostspielig ist.

Schritt 4: Free RTOS

Um alle in Echtzeit benötigten Aufgaben ausführen zu können, wurde FreeRTOS verwendet. FreeRTOS ist ein Echtzeitbetriebssystem, das bedeutet, dass es auf Ereignisse innerhalb einer vorhersehbaren Zeitspanne reagiert. Dies ist wichtig, da es das System vorhersehbar erlaubt. Der Code wurde entworfen, um vier Aufgaben zu haben, die folgen:

  • Lesen von UART
  • Lesen von ESP8266 WiFi-Modul
  • Lesen der MPU-6050 IMU
  • Ausführen einer Befehlszeilen-Konsole

Lesen von UART

Dies war eine einfache Aufgabe, die die UART für neue Charaktere untersuchte. Wenn ein neues Zeichen gefunden wurde, wurde das Zeichen dann in eine Warteschlange gestellt, die von der Befehlszeilen-Konsolenaufgabe gelesen wurde. Dies könnte mit UART-Interrupts implementiert werden, aber das Polling war einfach, arbeitete, und indem diese Aufgabe die niedrigste Priorität hatte, durfte sie nur laufen, wenn es nichts anderes zu tun gab. Dies bedeutet, dass es nicht verschwenden CPU-Zyklen Abfrage der UART, wenn andere Dinge getan werden könnte. Das einzige andere Problem mit der Abfrage der UART war, wenn Zeichen kommen zu schnell. In unserem Setup, untersuchten wir die UART für neue Zeichen alle 10 ms, die deutlich schneller als jeder menschliche Typ. Dies kann problematisch sein, wenn die UART-Konsole aus einem Computerskript ausgeführt werden sollte, aber wir entschieden uns, dass die Einfachheit des Moduls dieses Feature überwogen hat.

Lesen von ESP8266 WiFi-Modul

Als Teil dieses Projekts wollten wir auch drahtlose Kommunikation. Schließlich wäre es unglücklich, wenn der Cube an einen Computer angeschlossen werden müsste. Dies wurde mit einem ESP8266, einem kleinen, einfach zu bedienenden WiFi-Modul von vielen verschiedenen Lieferanten. Der ESP8266 kommuniziert mit dem Zynq-Board auch über eine UART-Schnittstelle, die es notwendig machte, einen weiteren UART-Treiber zu schreiben. Für diesen UART-Treiber müssen wir in vielen Zeichen auf einmal lesen, was bedeutet, dass Interrupts erforderlich waren. Der Interrupt-Handler wurde aufgerufen, wann immer ein Zeichen vom UART gelesen wurde, und fügt diese Daten einer Warteschlange hinzu. Die Warteschlange wird dann von der ESP8266-Task gelesen, die entscheidet, was mit dem Charakter zu tun ist.

Die Aufgabe bestand aus einer großen Zustandsmaschine zum Initialisieren des Moduls und zum Lesen eingehender Daten. Wenn die Aufgabe Pakete vom Modul empfing, schickte er sie zu derselben Warteschlange, die von dem UART-Modul verwendet wurde, das von der Konsolentask gelesen wurde. Dies ermöglicht, dass die gleichen Konsolenbefehle von einem Bediener verwendet werden, der physisch mit dem System oder über WiFi verbunden ist. Diese Methode ermöglicht auch Code-Wiederverwendung und hält die Code-Basis mehr organisiert.

Lesen der MPU-6050 IMU

Die IMU-6050 ist eine 6-Achs-IMU bestehend aus einem 3-Achsen-Beschleunigungsmesser und einem 3-Achsen-Gyroskop. Dies ermöglicht eine Erfassung des Winkels und der Drehgeschwindigkeit des Systems, die beide für den Steueralgorithmus wichtig sind. Die Datenübertragung vom Sensor war einfach. Der Sensor kommuniziert über I2C mit einer Adresse von 0x68. Vor dem Lesen des Beschleunigungsmessers und der Gyroskop-Daten muss der Sensor aus dem Ruhezustand herausgenommen werden, indem 0 auf die Adresse 0x6B, das Energieverwaltungsregister, geschrieben wird. Von dort aus können der Rohbeschleunigungsmesser und die Gyroskopables ab der Adresse 0x3B ausgelesen werden. Für vollständige Funktionalität siehe Datenblatt und Registerkarte.

Als wir anfingen, mit dem Sensor zu spielen, bemerkten wir, dass die Rohdaten nicht genau waren und auch nicht laut waren. Wir haben zwei verschiedene Techniken verwendet, um diese Probleme zu lösen. Nachdem wir die Daten betrachtet haben, haben wir festgestellt, dass die IMU einen Offset von den korrekten Messwerten zu haben scheint. Um dieses Problem zu lösen, platzierten wir die IMU auf eine Nivellierungstabelle, wo wir die Orientierung jeder der Beschleunigungsmesserachse kannten. Dann nahmen wir und durchschnittlich 5 Messungen von der IMU. Wir nahmen dann die bekannte Orientierung und subtrahierten sie von der Beschleunigung, die sie uns gab. Das Ergebnis war ein Versatzvektor, der von jeder IMU-Messung subtrahiert wurde. Dies erhöhte die Präzision des Systems deutlich. Zur Lösung des Rauschproblems benutzten wir ein einfaches 5-Punkt-Mittelungsfilter. Anstatt jedes IMU-Lesen zurückzugeben, würden wir 5 Lesungen speichern und den Durchschnitt jedes Wertes nehmen. Dies half, eine angemessene Menge des Lärms, den wir von dem Sensor sahen, zu eliminieren.

Von hier aus hatten wir gehofft, diese Informationen an die FPGA zu senden, die den Kontrollalgorithmus ausführen würde. Leider hatten wir Schwierigkeiten bei der Implementierung des Kontrollalgorithmus in Verilog und beschlossen, es in C zu implementieren. Aus diesem Grund würde die RTOS-Task, sobald eine gültige IMU-Messung durchgeführt wurde, dann die notwendige Motordrehzahl berechnen und sie über den Motor an den Motor senden PWM-Erzeugungsblock. Während dies die Implementierung einfacher machte, wäre es schön gewesen, die Steuerelemente innerhalb des FPGAs auszuführen, von denen wir glaubten, dass sie den Regelkreis verbessert hätten.

Lesen einer Befehlszeilenkonsole

Die Befehlszeilen-Konsole war verantwortlich für das Senden höherer Befehle und Polling-Informationen, wie die IMU-Messwerte aus dem System. Die Kommandozeilen-Konsole wurde als eigene Task ausgeführt und nimmt Daten sowohl vom UART als auch vom ESP8266 auf. Dadurch konnte die Konsole direkt von einem Computer oder über ein drahtloses Netzwerk bedient werden. Die Aufgabe wurde auf einer FreeRTOS-Warteschlange gesperrt, bis Daten verfügbar waren. Die Task arbeitet dann wie eine Zustandsmaschine und liest in einem Befehlsnamen und Daten. Wenn der Befehl gültig war, würde er den zugehörigen Code ausführen und auf einen anderen Befehl warten. Dies ermöglichte flexible Befehle und war hilfreich für das Debuggen und Befehlen des Systems.

Schritt 5: Systemdynamik

Dynamik

Das Cubli-Projekt arbeitet als invertiertes Pendel, der einzigartige Aspekt des Projektes ist die Steuerung des Pendels. Normalerweise steuert ein Motor ein invertiertes Pendel direkt, wobei die Pendel-Drehachse direkt auf die Motorachse mit einem 1: K-Verhältnis montiert ist. Bei diesem Projekt wird die Pendelposition mit dem am Pendelarm befestigten Freilauf gesteuert. Wegen der Erhaltung des Impulses, wenn das Rad in einer Richtung beschleunigt wird, wird ein Drehmoment auf den Pendelarm in die entgegengesetzte Richtung ausgeübt. Dies führt zu einem System zweiter Ordnung, das Pendel, gesteuert durch ein anderes System zweiter Ordnung, das Reaktionsrad. Dies wird als gekoppeltes Steuersystem zweiter Ordnung bezeichnet.

Die Dynamik Transfer Gleichungen können auf dem Cubli Projekt veröffentlicht im IEEE Papier gefunden werden hier .

Schritt 6: Steuern der Implementierung

System Modell: Zustandsraum

Das Standardverfahren von Steuerungen, PID, ist mit diesem System ein wenig schwierig zu implementieren, da es ein gekoppeltes System zweiter Ordnung ist. Dies bedeutet, dass das invertierte Pendel (zweiter Ordnung) durch ein zweites System (Reaktionsrad) gesteuert wird. Normalerweise wird ein invertiertes Pendel mit einem Motor gesteuert, der direkt den Winkel des Pendels (dh das Pendel, das an der Motorwelle befestigt ist), welches eine 1: 1 Beziehung ist, steuert. PID ist in der Regel für einfache, zweite Ordnung oder weniger Systeme, darüber hinaus, die Abstimmung eines PID-System wird schwieriger und zu viel von einem Streit verwendet. Zustandsraum ist einfacher, in moderneren und komplexeren Steuerungsmethoden wie LQR anzuschließen.

Steuermethode: LQR

Sobald das System im Zustandsraum modelliert wurde, kann Matlab verwendet werden, um die K-Matrix für die LQR-Steuerung des Systems zu finden. Ein tiefes Verständnis von LQR-Kontrollen ist nicht notwendig, wenn Sie Zugang zu Matlab haben, es macht die ganze Arbeit für Sie. Aber wenn Sie Matlab nicht, Ihre K - Matrix zu finden Sie stecken Sie einfach Ihre Zustandsraummodell in die algebraische Riccati - Gleichung . Für dieses System können Sie die R-Matrix auf alle Nullen setzen, weil wir keine Feed-Forward-Signale verwenden. Die Q-Matrix gewichtet den Steuerungsaufwand für jeden Zustand, sie ist eine Diagonalmatrix, und die Werte jedes Elements können als ein Verhältnis betrachtet werden, wie wichtig jeder Zustand des Systems ist. Für dieses System ist der Winkel des Pendelkörpers am wichtigsten, so dass der höchste Wert in der Q-Matrix haben sollte.

Matlab-Tutorial zu Zustandsraum und LQR

Schritt 7: Schlussfolgerung

Obwohl wir nicht in der Lage waren, ein Gleichgewicht mit diesem System zu erreichen, konnten wir viel über das innere Arbeiten von SoC-Systemen lernen und diese Systeme mit Hilfe von RTOS steuern. Wir lernten auch einige der Fallstricke bei der Konstruktion mechanischer Systeme. Wir möchten dieses Projekt an einem gewissen Punkt noch einmal besuchen, sobald wir uns intensiver mit Themen in der maschinellen Bearbeitung, bürstenlosen Motoren und der bürstenlosen Motorsteuerung beschäftigen.

Einige Vorschläge für die Wiederholung dieses Projekts:

Bidirektionale Motorsteuerung ist entscheidend, ein bürstenloser Gleichstrommotor ist nicht so wichtig. Wir haben festgestellt, dass nahezu alle bürstenlosen Gleichstrommotoren aufgrund der großen Präsenz der Quad-Copter-Industrie unidirektional sind. Wir würden vorschlagen, einen Motor zu finden, unabhängig von Bürste / weniger (oder sogar Getriebe / Getriebe), die eine Art Drehzahlgeber (Hall-Effekt oder optisch) hat und auch schnell und in beide Richtungen gesteuert werden kann.

Related Reading