Carolo Geschwindigkeit SS14: Unterschied zwischen den Versionen
(7 dazwischenliegende Versionen von einem anderen Benutzer werden nicht angezeigt) | |||
Zeile 97: | Zeile 97: | ||
== Lösung des Interrupt Problem == | == Lösung des Interrupt Problem == | ||
=== | === Problemlösung === | ||
Die schhrittweise Lösung des Problems wurde von uns in Form eines PDF-Dokumentes zusammengefasst. Dafür wurden für verschiedene Fälle die Simulation des Interrupt-Signals mit den Messungen verglichen. | |||
[[Datei:Analyse_Interrupts.pdf|Link zum PDF]] | |||
=== Ausblick === | |||
Um das Interrupt Problem endgültig zu lösen, muss noch genauer untersuch werden warum die Adapterplatine die Frequenzstörungen verursacht. | |||
Im nächsten Schritt kann dann für die Adapterplatine ein neues Layout erstellt werden, so dass keine Frequenzstörungen auftreten. | |||
== Feedback zum Artikel == | == Feedback zum Artikel == |
Aktuelle Version vom 1. Dezember 2021, 11:16 Uhr
Zurück zum Hauptartikel
Hardware
Die Hardware zur Vereinigung der 3 Hallsignale ist ein 4-fach XOR-Gatter, das für jede Änderung ein Low-Peak erzeugt und damit einen Interrupt auf der ds1104 auslöst. Im Folgenden sind der Schaltplan- und Platinenlayoutausschnitt mit dem Gatter zu sehen:
Software
Ansatz
Da die Geschwindigkeitsermittlung, wie im vorherigen Abschnitt beschrieben, über einen Interrupt gesteuert werden soll, ist es notwendig, dass der Prozess der Geschwindigkteisermittlung asynchron zur Simulation läuft. Jedoch soll die Ausgabe der Geschwindigkeit synchron zur Simulationszeit erfolgen. Daraus folgt, dass es eine Trennung zwischen der Ermittlung aus den Interruptsignalen und der Weitergabe an die Software geben muss. Daraus folgt, dass die Ermittlung der Geschwindigkeit anhand der Interrupts durch ein Triggered Subsystem geschehen muss. In diesem werden asynchron die Hall-Sensoren ausgelesen, sobald ein Interrupt gemeldet wird. Anhand der gespeicherten Zeiten und Stati der Sensoren soll dann im synchronen Bereich der Geschwindigkeitsermittlung die Geschwindigkeit ermittelt werden. Dieser Zusammenhang ist im folgenden Schaubild dargestellt.
In der Grafik ist sehr schön zu erkennen, dass es sich hierbei um eine Testumgebung handelt, welche den gesamten Prozess der Geschwindigkeitsermittlung nachbildet. So ist auf der linken Seite die "Quelle" der Interrupts zu erkennen. Diese wird durch ein Chirp Signal erzeugt, welches mit sinkender Frequenz High und Low Pegel auf die Trigger der beiden Triggered Subsystems gibt. Im ersten, linken Subsystem wird das Hall-Signal für die 3 Sensoren erzeugt, dies geschieht durch Durchschalten eines Logikgatters, welches die 6 Status der Hallsensoren abbildet. Die Logikschaltung ist im Folgenden abgebildet.
Jedes mal, wenn das Subsystem aktiviert wird, zählt der Counter um eine Position nach oben, bis er die 6 erreicht. Danach springt er wieder auf die 1 und beginnt von vorne. Dadurch lassen sich folgende Signale für die Hallsensoren erzeugen:
Status | Hallsensor A | Hallsensor B | Hallsensor C | |
---|---|---|---|---|
1 | 1 | 0 | 1 | |
2 | 1 | 0 | 0 | |
3 | 1 | 1 | 0 | |
4 | 0 | 1 | 0 | |
5 | 0 | 1 | 1 | |
6 | 0 | 0 | 1 |
Nachdem die Hallsensoren simuliert wurde, können diese über das rechte Triggered Subsystem wieder ausgelesen werden. Dies geschieht durch Verknüpfung der einzelnen Hallsensoren übe rein Logikgatter, welches aus einer komibinierten Logik ein Status zwischen 1 und 6 erzeugt. Dieser Status spiegelt die aktuelle Positiond es Ankers des Motors wieder. Der Status wird anschließend in eine MatLab Funktion geschrieben. Zeitgleich wird hier auch der aktuelle Timestamp und die alten Werte eingelesen. Anhand des folgenden Codes wird daraus eine Tabelle erzeugt, welche die letzten 10 Werte beinhaltet und diese in den Store schreibt. Aus diesem Store kann dann wieder synchron gelesen werden und somit die GEschwindigkeit für die Simulation bereit gestellt werden.
Im folgenden ist erst der Code zur Erzeugung der Matrix abgebildet. Anschließend wird noch das Simulink-Modell für das Auslesen der Sensoren abgebildet.
function [vout,Store_OUT] = fcn(Value,t,Store_IN)
%% Definitions
durchmesser = 0.0663; %m
umfang = pi*durchmesser;
motoruebersetzung = 4; % 4 Steps = 1 Turn
motorstep = 6;
sPerTurn = umfang / motorstep;
%% Calculation
if (abs(Value-Store_IN(1)) > 4)
if Value < Store_IN(1)
v = ((1)*sPerTurn) / (t-Store_IN(2));
else
v = ((-1)*sPerTurn) / (t-Store_IN(2));
end
else
v = ((Value-Store_IN(1))*sPerTurn) / (t-Store_IN(2));
end
%% Output
Store_OUT = [Value t];
vout = [v t]
Im Speicher "Data Store" liegen nun die letzten 10 erkannten Interrupts. Da das Fahrzeug mit einer maximalen Geschwindigkeit von 3 m/s fahren darf, kommt es zu 45 Umdrehungen pro Sekunde. Dies entspricht 230 Interrupts und einer Zeit von 0.000435s zwischen zwei Interrupts. Wenn man nun 10 Interrupts speichert, dann erhält man genau 0.05s, was der Simulationszeit entspricht. Somit werden alle erkannten Interrupts auch gespeichert und können verarbeitet werden.
Die erkannten und gespeicherten Interrupts werden anschließend im synchronen Subsystem wieder ausgelesen und ausgewertet. Dies geschieht anhand einer einfachn Interpolation zwischen den Messwerten, sodass kleine Ungenauigkeiten einfach herausfallen. Im Folgenden ist dies grafisch dargestellt.
Hier ist die eben genannte Interpolation der Werte in der MatLab Funktion dargestellt.
function [y, tout, vout]= fcn(u, tin, vin)
%#codegen
if ~isinf(u(1))
if size(tin,1) > 9
tout = vertcat(tin(2:end),u(2));
vout = vertcat(vin(2:end),u(1));
else
tout = zeros(10,1);
vout = zeros(10,1);
end
else
if size(tin,1) == 10
vout = vin;
tout = tin;
else
tout = vertcat(tin,zeros(10-size(tin,1),1));
vout = vertcat(vin,zeros(10-size(vin,1),1));
end
end
y = mean(vout);
Abschließend ist das Simulationsergebnis einmal dargestellt. Hierbei erkennt man, dass im ersten Scope das Chirp Signal dargestellt. Dies ist die Trigger Source für die Subsystems. Im zweiten Scope ist der Hallstatus, wie er wirklich ist, dargestellt. Im dritten Scope erkennt man die überlagerten Status der Hallsensoren, wenn man die Signale direkt mitliest (gelb) oder erst duch einen synchronen Task auslesen lässt (lila). Hierbei kann man erkennen, dass nicht jeder Status mitgelesen wird, wenn man die Hallsensoren synchron zur Simulationszeit ausliest. Dieser Effekt lässt sich auf das Nyquist-Shannon-Theorem zurückfpühren. Im vierten Scope ist die aktuelle GEschwindigkeit dargestellt und im letzten Scope sieht man nochmal den Status der Hallsensoren (gelb) und die Status der einzelnen Sensoren überlagert.
Testimplementierung Hardwareinterrupt
Zum Testen der grundlegenden Funktion des Hardwareinterrupts wurde ein Counter implementiert, der bei jedem Interrupt um 1 inkrementiert wird. Wider Erwarten kam die ds1104 nicht mit der erhöhten Last zurecht und meldete einen "Overrun". Das bedeutet, dass die Interrupts so viel Prozessorzeit beanspruchen, dass die Echtzeitbedingung der Simulation nicht mehr eingehalten werden kann.
Da die ds1104 offenbar überlastet ist, wird für die Zukunft eine externe Verarbeitung empfohlen, z.B. mit einem Mikrocontroller auf der Adapterplatine, von dem die aktuelle Geschwindigkeit, die gefahrene Strecke usw. abrufbar ist. Eine Alternative wäre die Aufbereitung des Signals der Hall-Sensoren mittels Mikrocontroller, sodass das "Incremental Encoder Interface" verwendet werden kann.
Lösung des Interrupt Problem
Problemlösung
Die schhrittweise Lösung des Problems wurde von uns in Form eines PDF-Dokumentes zusammengefasst. Dafür wurden für verschiedene Fälle die Simulation des Interrupt-Signals mit den Messungen verglichen.
Ausblick
Um das Interrupt Problem endgültig zu lösen, muss noch genauer untersuch werden warum die Adapterplatine die Frequenzstörungen verursacht. Im nächsten Schritt kann dann für die Adapterplatine ein neues Layout erstellt werden, so dass keine Frequenzstörungen auftreten.
Feedback zum Artikel
--Prof. Dr. Mirek Göbel (Diskussion) 13:48, 8. Aug. 2014 (CEST)
- Originaldateien zu den Bildern mit ablegen
- Bilder besser erläutern, insbesondere die Schaltpläne!
Zurück zum Hauptartikel