Das Gantt-Diagramm in Abbildung \ref{fig:gantt} wurde auf eingetretene Verzögerungen angepasst, sodass die Deadline Mitte Dezember eingehalten werden kann.
Abbildung \ref{fig:projektplanung} zeigt den geplanten und benötigten Zeitaufwand für die Erstellung des Meilenstein 3b unterteilt in folgende Aufgabenbereiche:
- Einarbeitung
- Zeitplanung
- Design
- Implementierung
- Verifikation
- Dokumentation
Die Darstellung wird gesondert für die Studenten Marc Kossmann und Michael Riedel betrachtet. Diese Zeiten sind unabhängig von gemeinsam bearbeiteten Aufgaben. Die Abbildung \ref{fig:zeitbedarf} zeigt die komplette geplante und benötigte Zeit, die durch Aufsummierung der einzelnen Meilensteine entsteht.
Die Gesamtzeiten berechnen sich aus der Aufsummierung der einzelnen Zeiten der Studenten Marc Kossmann und Michael Riedel sowie der gemeinsam zusätzlich aufgewendeten Zeit.
Für diesen Meilenstein wurden keine Veränderungen an dieser Komponente vorgenommen. Abbildung \ref{fig:register_interface_bd} zeigt das Block-Diagramm des register_interface
.
Die Motor-Control-Unit ist die Schnittstelle zwischen dem NIOS-II Prozessor und der Schrittmotor-Einheit. Sie erstellt entsprechend der vom Benutzer eingestellten Betriebsmodi die Pulsweiten-modulierten (PWM)-Signale für den Schrittmotor, aktiviert, stoppt und überwacht das gewünschte Verfahren.
Kombination | Modus |
---|---|
xx00 | Stop |
xx01 | Continuous Run |
0010 | Chain of Steps - 1/4 rotation |
0110 | Chain of Steps - 1/2 rotation |
1010 | Chain of Steps - 1 rotation |
1110 | Chain of Steps - 2 rotations |
other | reserved |
Table: Betriebsmodi der Motor-Control-Unit \label{tab:modi}
Gemäß Kundenwunsch werden die Betriebsmodi gemäß Tabelle \ref{tab:modi} durch die Komponente zur Verfügung gestellt.
Gemäß Abbildung \ref{fig:motor_control_unit_bd} besteht die Komponente motor_control_unit
aus den zwei Teilkomponenten counter
und signal_generator
. Der Signalgenerator wird dabei durch das clk_out
-Signal des Taktteilers in den prescaler
-Eingang gespeist.
Der Counter wird allgemeingültig realisiert. Dadurch kann der Teilerwert individuell durch ein generic
konfiguriert und mit unterschiedlichen Frequenzen betrieben werden. Dies ermöglicht eine einfache Anpassung von Meilenstein 3b zu Meilenstein 4.
Der einzustellende Taktteiler berechnet sich wie folgt:
\begin{equation} \begin{aligned} \text{Taktteiler} &= \frac{\text{clk}\text{in}}{\text{clk}\text{out}} \ \ \text{clk}\text{in} &= \text{Eingangsfrequenz} \ \text{clk}\text{out} &= \text{Ausgabefrequenz} \end{aligned} \end{equation}
Der Signalgenerator wird in Form mehrerer State-Machines realisiert, um die Windungen des Motors in korrekter Reihenfolge und gemäß Eingaben durch den Anwender anzusteuern. Um dies zu ermöglichen, werden verschiedene Sub-State-Machines verwendet, die in den folgenden Abschnitten erläutert werden.
Die motor_control_unit
wird gemäß Abbildung \ref{fig:motor_control_unit_sm} in Form einer State-Machine realisiert. In ihr sind die Übergänge zwischen den verschiedenen Betriebsmodi, sowie der Anzahl der zu zählenden Schritte für die entsprechenden Rotationen dargestellt. Der Übergang wird nur dann gewechselt, sofern ein prescaler
-Signal, ein gültiger Mode, ein interrupt-request (IR
) durch die Steuerung selbst oder der Benutzer einen reset_n
ausgelöst hat.
Gemäß Abbildung \ref{fig:speed_sm} wird der 3-bit Eingang speed
auf die zu zählenden Pulsweiten abgebildet. In der vorliegenden Arbeit, wird mit einer Pulsweiten-Auflösung von 5 ms gearbeitet. Die speed
-Einstellung wird clock
-synchron übernommen.
![State-Machine zur Verknüpfung der speed-Einstellung mit dem Pulsweiten-Zähler\label{fig:speed_sm}][fig:speed_sm]
Gemäß Abbildung \ref{fig:motor_phases_sm} ist ersichtlich, wie die Motorwindungen in Abhängigkeit zur direction
geschaltet werden. Die Umschaltung der Zustände erfolgt nur, wenn eine steigende Flanke des prescaler
-Eingangs anliegt und der pwm_5ms_counter = 0
ist. Der pwm_5ms_counter
wird auf 0
zurückgesetzt, wenn er den eingestellten speed
-Wert erreicht hat. Im Falle eines reset_n
-Signals wird er mit -1
initialisiert. Dieser Wert wird ebenfalls verwendet, wenn sich der signal_generator
im IDLE
oder CR
-Modus befindet, um unendlich viele Schritte zu symbolisieren.
Damit die motor_control_unit
unabhängig vom NIOS-II Prozessor getestet werden kann, wird im Meilenstein 3b eine eigene Komponente erstellt, die gemäß Abbildung \ref{fig:milestone3b} das register_interface
und die motor_control_unit
mit einer debug_key_detect
-Komponente verbindet.
Diese Komponente ermöglicht das gezielte Simulieren der Prozessoranfragen an die Motor-Control-Unit. Sie beschreibt das register_interface
mit den gewünschten Daten und initiiert das Verfahren des Schrittmotors.
Gemäß Abbildung \ref{fig:uebersicht-der-komponenten-und-rollen} können die einzelnen Aufgaben, die die jeweiligen Komponenten übernehmen.
Um die korrekte Funktion der motor_control_unit
sicherzustellen, wurde eine Testbench erstellt. In ihr werden die verschiedenen Anforderungen an die Komponente verifiziert. Im Allgemeinen werden alle Modi in den verschiedenen Geschwindigkeits- und Richtungseinstellungen getestet. Für weitere Informationen sei auf die Dokumentation des Testbench motor_control_unit_tb.vhdl
verwiesen.