Algorithmus zur Bestimmung der effektiven "Phasendifferenz" zwischen zwei Signalen mit unterschiedlichen Frequenzen?

8

Die schnelle Version:

Welchen Algorithmus könnte ich verwenden, um die "Phasendifferenz" zwischen zwei Rechtecksignalen mit verschiedenen Frequenzen zu bestimmen, wenn die einzige Information, die ich habe, die Zeit ist, zu der jede steigende Flanke auftritt?

Die ausführliche Version:

Ich arbeite an einem Embedded-Software-Projekt, und ich bin auf ein interessantes Problem gestoßen. Ich sammle Daten von zwei Hall-Effekt-Sensoren , die jeweils auf einen von zwei ineinandergreifenden Zahnrädern gerichtet sind, wie in das folgende Diagramm:

Zahnräder und Impulssignale http://img291.imageshack.us/img291/4905/gears.png

Hinweis:
Wie Jaime darauf hingewiesen hat, hätten die Signale in diesem Diagramm tatsächlich identische Frequenzen. Die reale Hardware hat mehrere Getriebestufen zwischen den zwei Zielgängen, von denen einige durch Wellen anstelle von vermaschten Zähnen verbunden sind, so dass ich zwei Wellen mit unterschiedlichen Frequenzen und dem Verhältnis erhalte zwischen ihnen ist immer noch eine Konstante. Ich wollte das Diagramm vereinfachen, um zum Kern der Sache zu kommen, aber es sieht so aus, als ob ich es zu sehr vereinfacht hätte!
/ note

Die Drehzahlsensoren geben ein Rechtecksignal aus, dessen Frequenz direkt proportional zur Drehzahl jedes Ganges ist. Die ansteigenden (und fallenden) Kanten der Rechteckwelle treten auf, wenn die Vorder- (und Hinterkanten) eines einzelnen Zahnradzahns den Sensor passieren.

Ich weiß, wie viele Zähne in jedem Gang sind, und basierend auf diesen Informationen kann ich die Drehzahl jedes Gangs anhand der Frequenz der Rechtecksignale genau messen.

Um die Frequenzen zu messen, muss jedes Geschwindigkeitssensorsignal mit einem schnellen Aufnahme-Timer-Pin am integrierten Controller verbunden sein. Die Erfassungszeitgeber erfassen automatisch die ansteigenden Flanken des Rechtecksignals, laden ein Register mit einem Wert, der die Zeit darstellt, zu der der Übergang aufgetreten ist, und lösen einen Interrupt aus. Die Erfassungspunkte für jedes Signal sind im Diagramm gelb dargestellt. Die Interrupt-Service-Routine sieht etwa so aus:

%Vor%

Was ich gerne tun würde:

Ich möchte in der Lage sein, kleine Unterschiede im relativen Timing dieser beiden Rechtecksignale zu erkennen. Ich nenne dies die "Phasendifferenz" mangels eines besseren Begriffs. Wenn die beiden Signale die exakt gleiche Frequenz hätten, wäre dies einfach und Phasendifferenz wäre die korrekter Begriff zu verwenden.

Hier ist, worauf ich hinaus will: Wenn ich die beiden Signale über einen langen Zeitraum aufzeichnen würde und dann das Hochgeschwindigkeitssignal (blau) künstlich verlangsamen (oder "strecken"), um einen Faktor von 16 / 9 hätte sie genau die gleiche Frequenz wie das Signal mit niedrigerer Geschwindigkeit (rot), und die beiden Signale hätten eine messbare Phasendifferenz, dh die Zeitdifferenz zwischen einer roten Signalunterbrechung und einer blauen Signalunterbrechung. Ich möchte diesen gleichen Zeitunterschied (oder etwas Äquivalentes) berechnen, ohne die Signale über einen langen Zeitraum aufzeichnen zu müssen. Ressourcen sind auf dem Embedded-Controller begrenzt, so dass das Speichern großer Arrays mit vergangenen Übergangszeiten keine Option ist.

Ist schon mal jemand darauf gestoßen? Das eigentliche Projekt hat mehrere solcher Getriebe- und Sensoranordnungen, deshalb suche ich nach einem eleganten Algorithmus, den ich wiederverwenden kann. Vielen Dank im Voraus!

    
e.James 21.07.2009, 07:36
quelle

6 Antworten

2

Das Gesamtsignal, d. h. das Signal, das Sie erhalten, wenn Sie Rot und Blau hinzufügen, hat eine Phasenlänge von 16 Mal Blau und 9 Mal Rot. Sie können den Zeitunterschied zwischen jeder 16. blauen und jeder 9. roten steigenden Flanke messen.

Ich nehme an, dass Sie den Verschleiß der Zahnräder messen wollen. Ich denke, dass diese Messung durch die Toleranz der Zahnräder beeinflusst werden kann (Einführen von Geräuschen), wenn es keine gleichmäßige Traktion gibt.

    
Svante 21.07.2009 08:14
quelle
2

Da wir von "Phase" sprechen, erscheint es sinnvoll, den "Beat" zu messen, der auftritt, wenn sich die beiden Wellenformen gegenseitig verstärken.

So etwas, vielleicht:

%Vor%

Wenn wir das jetzt in eine Simulation von zwei Zahnrädern stecken, einer von 9 Zähnen und einer von 16 Zähnen, drehen beide mit 10 Umdrehungen pro Sekunde

%Vor%

Und jetzt, wenn wir eine Verzögerung von 1 ms zu einem der Cogs hinzufügen:

%Vor%

Das scheint ein hoffnungsvoller Anfang zu sein: -)

    
ravenspoint 22.07.2009 19:52
quelle
1

Ich denke, es ist sogar einfacher als das.

Alle 16 * 9 Proben (von der großen Kogge) sind die Räder genau an der Stelle, an der sie begonnen haben.

Was Sie also tun, ist Folgendes:

  • Wählen Sie einen beliebigen Zeitpunkt mit einer Stichprobe auf dem großen Zahnrad aus. Messen Sie die Zeit, bevor Sie das kleine Zahnrad auch probieren. Merken Sie sich diesen Wert.

  • alle 16 * 9 Samplings des Big Cogs (warum klingt das zweifelhaft?) wiederholen Sie die gleiche Messung und vergleichen Sie sie mit Ihrem Grundwert. Wenn das Timing zu verschieben beginnt, haben Sie ein Problem.

R

    
Toad 21.07.2009 13:57
quelle
1

Ich habe Probleme, das Hardware-Setup zu visualisieren. Und das Verhalten, das Sie versuchen zu erkennen. Eine Welle rutscht? Zähne tragen?

In jedem Fall würde ich eine Simulation der Situation schreiben, so dass ich einige, vielleicht übertriebene, Ergebnisse ohne Rauschen erhalten kann, um die Algorithmen zu testen.

Die Algorithmen, die ich testen würde, wären Variationen der folgenden:

%Vor%     
ravenspoint 21.07.2009 16:01
quelle
0

Ich denke, das Beste wäre, ein X-Y-Diagramm der all -Zeitpaare zu erstellen. Sie würden willkürlich einen Zahn auf jedem Zahnrad als T = 0 wählen.

    
MSalters 21.07.2009 08:41
quelle
0

Ich würde zwei Phasenregelkreise in Software implementieren. Angenommen, eine Umdrehung von Zahnrad A entspricht b Umdrehungen von Zahnrad B. Berechnen Sie das kleinste gemeinsame Vielfache von a und b m: = 1 cm (a, b). Phasensperre PLLa mit Getriebe A (mit einem Faktor von m / a) und PLLb mit Getriebe B (mit einem Faktor von m / b). Dann sollten beide PLLs die gleiche Frequenz haben. Folglich sollten Phasendifferenzen leicht zu erkennen sein. Da Sie einen Controller haben, berechnen Sie nur die Faltung der beiden phasenstarren Signale. Das Maximum der Faltungsfunktion sagt Ihnen dann die Phasendifferenz.

    
Udo Klein 12.08.2013 04:49
quelle