Ansteuerung eines Modellbau-Servos mit Hilfe des DLP-FPGAs
(EN google-translate)
(PL google-translate)
Mit Hilfe des FPGAs sollen im weiteren Verlauf mechatronische Systeme realisiert werden.
Bisher wurden typischerweise Mikrocontroller verwendet, um bestimmte benötigte Funktionalitäten bei mechatronischen Systemen zu realisieren.
Beispiele solcher typischen Elemente stellen die PWM-Geber bei Mikrocontrollern dar.
|
Mit Hilfe der nachfolgenden Realisierung sollen diese Fragen versucht werden zu beantworten.
Zur Theorie der PWM-Signale und zur Ansteuerung von Modellbau-Servos siehe Kapitel "PWM" in der Mikrocontroller-Vorlesung.
Programmtechnische Umsetzung
Ein PWM-Signal kann leicht mit ähnlichen Mitteln, wie im Beispiel der Blink-LED verwendet realisiert werden.
Es muß lediglich das Taktsignal auf einen Bereich zwischen 50 und 100Hz heruntergeteilt werden und die PWM-Breite über eine Modulo-Division realisiert werden.
Als Test wird der Servo als Default in der Mittelposition gehalten und kann über Schalter bei P135 / IO25 (LINKS) und P142 / IO28 (RECHTS) um 45o nach links bzw. rechts ausgelenkt werden.
Als PWM-Ausgang (PWM) soll P58 / IO0 verwendet werden.
Das PWM-Signal wird galvanisch über einen Optokoppler vom Servoeingang getrennt und der Servo wird über eine extra Spannungsquelle versorgt.
Bild 0-1: Einrichten des Projektes (Es wird wie bei blinkled der 6MHz-Clock-Eingang verwendet).
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity servo is Port ( CLOCK_6MHZ : in STD_LOGIC; LINKS : in STD_LOGIC; RECHTS : in STD_LOGIC; PWM : out STD_LOGIC); end servo; architecture Verhalten_Servo of servo is --Zähler, der die Clock-Signale von 6MHz zählt. --Ein PWM-Puls wird mit 100Hz erzeugt. --Das sind 60000 Zählschritte. --Es verbleibt also bei 100Hz PWM-Signal eine Bandbreite von 60000 Schritten --für die PWM-Breite. --Da der nutzbare Bereich zwischen 1 und 2 ms liegt, --darf zwischen 6000 und 12000 Schritten variiert werden, um die Servoposition einzustellen. signal zaehler : integer range 0 to 59999 := 0; signal logikpegel : std_logic := '0'; signal pwm_breite : integer range 0 to 12000 := 9000; --Mittelstellung als Initialwert. begin --Auch Prozessse sind konkurrierende Elemente. --Verschiedene prozesshafte Zusammenhänge können --unabhängig voneinander formuliert werden: process(CLOCK_6MHZ) begin if (CLOCK_6MHZ'event and CLOCK_6MHZ='1') then if (zaehler<59999) then zaehler <= zaehler+1; else zaehler <= 0; end if; end if; end process; process(zaehler) begin if (zaehler < pwm_breite) then logikpegel <= '0'; --Optokoppler invertiert das Signal! else logikpegel <= '1'; end if; end process; process(LINKS,RECHTS) begin if (LINKS='0') then --invertierte Logik! pwm_breite <= 6000; elsif (RECHTS='0') then pwm_breite <= 12000; else pwm_breite <= 9000; end if; end process; PWM <= logikpegel; end Verhalten_Servo;
Code 0-1: servo.vhd - VHDL-Quelltext zum Servo-Projekt.
Erläuterungen zum Quelltext - mehrere Prozesse in einer Architektur
Der VHDL-Quelltext besteht aus mehreren Prozessen. Genau wie die Befehle, die strukturelle Elemente beschreiben, verhalten sich auch Prozesse als konkurente "concurrent" Strukturen. D.h. sie können als parallel arbeitend aufgefaßt werden.
Insgesamt gibt es drei Prozesse mit drei verschiedenen Aufgaben:
|
## GCLK6 ist auf FPGA-Chip Pin 56 NET "CLOCK_6MHZ" LOC = "P56"; NET "CLOCK_6MHZ" IOSTANDARD = LVCMOS25; NET "LINKS" LOC = "P142" | PULLUP | IOSTANDARD = LVCMOS33; NET "RECHTS" LOC = "P135" | PULLUP | IOSTANDARD = LVCMOS33; NET "PWM" LOC = "P58" | IOSTANDARD = LVCMOS33 | SLEW = FAST ;
Code 0-2: servo.ucf - Vereinbarte Constraints für das Servo-Projekt.
Hardware
Der Servo wurde vom FPGA-Stromkreis mit Hilfe eines Optokopplers galvanisch getrennt.
Da der Optokoppler PC817 einen NPN-Fototransistor enthält, invertiert er das vom FPGA kommende Signal: Leuchtet die eingebaute LED, so wird der Transistor leitend und zieht den Ausgangspegel auf Masse. Der 2,2kΩ Widerstand am Kollektor des inneren Foto-Transistors dient als Pullup-Widerstand. Dies wird im Quelltext berücksichtigt.
Bild 0-2: Aufbau der FPGA-Servoschaltung.
Bild 0-3: Foto1 - Aufbau der FPGA-Servoschaltung.
Bild 0-4: Foto2 - Aufbau der FPGA-Servoschaltung.
Übung
Es soll nun ein eigenes Projekt aufgebaut werden, bei dem ein Servo benutzt wird.
Der Hardware-Aufbau soll der gleiche sein, wie oben.
|
Anstatt dass der Servo wie oben über Schalter gesteuert wird, soll er nun von alleine hin- und herfahren: 4 Sekunden Drehung um 90 Grad von -45 Grad nach +45 Grad im Wechsel mit 4 Sekunden Drehung um 90 Grad von +45 Grad nach -45 Grad. Dies soll zyklisch wiederholt werden.