kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




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.

  • Ist es auf der Grundlage der bisher eingeführten VHDL-Befehle und -Konstrukte möglich auf der verfügbaren FPGA-Hardware einen PWM-Geber zur Ansteuerung eines Modellbau-Servos zu realisieren?
  • Welche Vor- und Nachteile hat eine solche Umsetzung gegenüber derjenigen auf einem Mikrocontroller?

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.

Einrichten des Projektes (Es wird wie bei blinkled der 6MHz-Clock-Eingang verwendet).

Bild 0-1: Einrichten des Projektes (Es wird wie bei blinkled der 6MHz-Clock-Eingang verwendet).

servo_ise14.zip - Servo-Projekt - wurde mit ISE 14.7 von Xilinx erstellt.
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:

  1. Zählen
  2. PWM-Signal ausgeben
  3. PWM-Breite ändern
## 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.

Aufbau der FPGA-Servoschaltung.

Bild 0-2: Aufbau der FPGA-Servoschaltung.

Foto1 - Aufbau der FPGA-Servoschaltung.

Bild 0-3: Foto1 - Aufbau der FPGA-Servoschaltung.

Foto2 - Aufbau der FPGA-Servoschaltung.

Bild 0-4: Foto2 - Aufbau der FPGA-Servoschaltung.

Testen des Servo-Projekts - servo.mp4
Übung

Es soll nun ein eigenes Projekt aufgebaut werden, bei dem ein Servo benutzt wird.

Der Hardware-Aufbau soll der gleiche sein, wie oben.

  • Die Aufgabenstellung:

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.