Forum: Mikrocontroller und Digitale Elektronik Phasenverschiebung messen (us Bereich)


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von der Neuling (Gast)


Lesenswert?

Hallo

ich würde gerne die Phasenverschiebung von zwei Sinussignalen mit einem 
uC messen (am liebsten AVR)....

Die Umwandlung erfolgt 1. durch Optokoppler bzw. durch OPV und einem 
XOR-Gatter

Die Messgenauigkeit soll 1uS betragen


is das überhaupt möglich? oder gibt es da einfachere analoge Lösungen?

Danke und herzliche Grüße

von M. B. (Firma: TH Nürnberg) (ohmen)


Lesenswert?

Phasenkomparator? Welche Frequenz?

von Ulrich (Gast)


Lesenswert?

Wie die Signale Vorliegen ist irgendwie nicht ganz klar. Da könnte es 
schon schwer werden das die Flanken genau erkannt werden.   Eine Zeit 
mit 1 µs Genauigkeit zu messen ist für einen µC kein wirklich großes 
Problem.  Die meisten AVRs haben eine ICP Einheit um damit ein Zeit zu 
messen, einige größere haben auch 2 ICP Einheiten - damit wäre es am 
Einfachsten. Sonst müsste man das ganze für den einen Eingang in 
Software mit einem Interrupt realisieren. Das geht für 1 µs auch, wenn 
auch nicht ganz so einfach.

Es gibt auch eine relativ einfache analoge Lösung mit dem Phasendetektor 
aus eimem PLL IC wie 74HC4046. Da bekommt man dann aber eher die Phase 
und nicht direkt die Verzögerung heraus.

von Christian B. (casandro)


Lesenswert?

Alternativ kannst Du auch 2 identische Schmidt-Trigger verwenden (z.Bsp. 
Inverter mit Schmidt-Trigger Verhalten) und dahinter ein XOR-Gatter 
verwenden. Dieses ist dann immer High am Ausgang, wenn die 
Eingangssignale unterschiedlich sind. Wenn Du eine Phasenverschiebung 
von 0 hast, so hast Du am Ausgang immer low. Bei einer 
Phasenverschiebung von 180° hast Du am Ausgang immer High. Dazwischen 
erhältst Du ein PWM-Signal mit einem Tastverhältnis proportional zum 
Phasenversatz.

Da die Ausgangsspannungen des Gatters sicherlich nicht genau bei 0 und 5 
Volt sind, ist es eventuell sinnvoll einen Begrenzerverstärker nach zu 
schalten, die Eingänge regelmäßig zu tauschen (damit Du einmal das 
Signal, dann 180°-Das Signal bekommst), oder einen Gatter daneben als 
Referenz zu verwenden.

von der Neuling (Gast)


Lesenswert?

es handelt sich um ein 50hz AC signal, welches um einige us verschoben 
ist. (Verlustfaktorbestimmung)

von SNR (Gast)


Lesenswert?

Einfach beide Signale abtasten und die Kreuzkorrelation berechnen?

von _Gast aus HL_ (Gast)


Lesenswert?

SNR schrieb:
> Einfach beide Signale abtasten und die Kreuzkorrelation berechnen?

Schlechte Idee, da der interne AD-Wandler die Signale nur sequentiell 
abtasten kann, nicht aber parallel. Der durch die Sequenzierung 
entstehende Fehler ist auch ungefähr in der Größenordnung des Messwerts.
Für die Lösung wäre ein externer AD-Wandler erforderlich und der 
Rechenaufwand dieser Lösung ist für so ein einfaches Problem eigentlich 
unnötig hoch.

von Udo S. (urschmitt)


Lesenswert?

SNR schrieb:
> Einfach beide Signale abtasten und die Kreuzkorrelation berechnen?

ROFL. Klasse Idee mit einem 8Bit µC :-)

von tussy (Gast)


Lesenswert?

1. Beide Signale mittels OP hoch verstärken, so dass "nahezu" ein 
Rechteck entsteht.
2. Beide Rechtecksignale auf ein schnelles XOR-Gatter geben.
3. Die Länge des H-Signals ist gleich die Zeit der Phasenverschiebung, 
die nun mittels µC gemessen werden kann.
4. Fertig

von Lars (Gast)


Lesenswert?

Hi,

das ergibt dann ja eine gewünschte Messgenauigkeit/Auflösung von 18m°. 
Das ist schon extrem wenig. Messgeräte die das "wirklich" können sind 
nicht billig und das baut man auch nicht einfach so. Berechne mal die 
Ansteigsgeschwindigkeit des Sinus im Nulldurchgang und um wie viel Volt 
sich dort die Spannung pro 1us ändert.

Wir lösen das seit längerem auch über die Kreuzkorrelation. Da bekommst 
du mit relativ wenig aufwand gute Ergebnisse. Leider nicht auf 8bit uC, 
außer du hast x Sekunden Zeit um die Messung auzuwerten und verwendest 
externe Wandler (müssen synchron sampeln!)

Gruß
Lars

von Udo S. (urschmitt)


Lesenswert?

Lars schrieb:
> das ergibt dann ja eine gewünschte Messgenauigkeit/Auflösung von 18m°.
> Das ist schon extrem wenig. Messgeräte die das "wirklich" können sind
> nicht billig und das baut man auch nicht einfach so. Berechne mal die
> Ansteigsgeschwindigkeit des Sinus im Nulldurchgang und um wie viel Volt
> sich dort die Spannung pro 1us ändert.
Das ist korrekt, das sieht mal wieder nach einer gewünschten Genauigkeit 
aus, über die man nicht groß nachgedacht hat.

Lars schrieb:
> Wir lösen das seit längerem auch über die Kreuzkorrelation. Da bekommst
> du mit relativ wenig aufwand gute Ergebnisse.
Na ja das wenig Aufwand ist relativ. Vor allem wenn du mit der 
Kreuzkorrelationsmethode auf die oben angegebene Genauigkeit kommen 
willst. Du brauchst ne ganze Menge synchrone und genau Abtastwerte und 
musst mit denen auch noch recht aufwendig Rechnen.
Wobei natürlich die Störunterdrückung bei einer Berechnung über 
Kreuzkorrelation das groß Plus ist.

von Ulrich (Gast)


Lesenswert?

Das synchron sampeln ist nicht unbedingt nötig, denn die Verzögerung 
beim AD im µC ist konstant und bekannt. Man kann die also raus rechnen. 
Wenn man ein kleine Verzögerung hat, wäre aber eine gleichzeitige 
Abtastung schon besser.
Für die volle Kreuzkorrelation reicht ein 8 Bit µC eher nicht. Für ein 
paar Punkte, z.B. um den Nulldurchgang sollte es aber reichen.  Da man 
nur eine bekannte Frequenz hat, könnte man die Auswertung auch etwas 
anders machen, ggf. auch noch mit dem 8 Bit µC: die beiden Signal für 
sich analysieren und die Phase zu einer gedachten internen Ref. per 
Fouriertransformation (keine FFT, sondern zu Fuss weil man nur 2 Punkte 
braucht) bestimmen.

Im Prinzip sollte sich die Aufgabe auch mit der Soundkarte am PC lösen 
lassen. Gegen Drift im Analogen Eingangsfilter könnte man ggf. die 
Kanäle einmal per Relais tauschen, wenn man etwas Zeit hat. Für den PC 
ist die Korrelationsfunktion keine Herausforderung mehr.

Die eher analoge Lösung mit genauer Messung von nur den Nulldurchgängen 
hängt davon ab wie viele Störungen man im Signal hat. Direkt mit der 
Wellenform von der Netzspannung wird das schon sehr schwer. Da braucht 
man dann erst eine Filterung um die Oberwellen zu entfernen und kann 
dann möglichst alle Flanken auswerte. Die Schwierigkeit liegt darin den 
Filter Driftarm zu bekommen, der Teil mit dem µC ist dagegen eher 
Einfach.

von SNR (Gast)


Lesenswert?

_Gast aus HL_ schrieb:
> Schlechte Idee, da der interne AD-Wandler die Signale nur sequentiell
> abtasten kann, nicht aber parallel

Das kommt drauf an was für einen uC Du hast. Manche haben 2 SAH drin, 
manche auch gleich mehrere AD-Wandler.

Udo Schmitt schrieb:
> ROFL. Klasse Idee mit einem 8Bit µC :-)

50Hz mit dementsprechender Überabtastung bekommt selbst ein 8-Bitter 
hin.
Timer wo die ADCs triggert über Interrupt. 2x Ringpuffer. Nachdem der 
Puffer voll ist die Berechnung durchführen. In der Zeit braucht man ja 
nicht unbedingt weiter Sampeln.

Wobei er nicht explizit 8-Bit-uC gesagt hat. Kann also auch ein AVR32 
sein.

Gruß

von Udo S. (urschmitt)


Lesenswert?

Ulrich schrieb:
> Für die volle Kreuzkorrelation reicht ein 8 Bit µC eher nicht. Für ein
> paar Punkte, z.B. um den Nulldurchgang sollte es aber reichen.

Hmm, stimmt eigentlich. Solange die maximal zu erwartende Verschiebung 
deutlich innerhalb des Abtastfensters ist würde das doch reichen. Aber 
wenn ich eine Genauigkeit von etwa 1µs erreichen will muss doch meine 
Abtastrate mindestens 2MSamples/s sein (Stimmt doch?), und wenn die 
Phasenverschiebung größer werden kann dann brauche ich entsprechend 
viele Messwerte oder muss die Phasenverscheibung entsprechend ungefähr 
kennen, so daß ich nur zwei Ausschnitte sample mit entsprechendem 
Versatz und die KK nur für einen Teilbereich berechne.

Ulrich schrieb:
> Im Prinzip sollte sich die Aufgabe auch mit der Soundkarte am PC lösen
> lassen.
Wie willst du damit auf eine zeitliche Auflösung im µs-Bereich kommen?

von Ulrich (Gast)


Lesenswert?

Die Abtastpunkte müssen nicht so nahe zusammenliegen. Zum einen gibt der 
AD Wandler ja nicht nur 0 und 1 aus, sondern auch zwischenwert. Zum 
anderen wird man deutlich mehr als 1 Periode messen und kann 
entsprechend mitteln für mehr Auflösung. Das gilt für den AD Wandler im 
µC und auch die Soundkarte.

Wenn man den AD Wandler nutzt geht es ja gerade nicht darum zu sehen 
zwischen Elchen Sampeln der Nulldurchgang ist, sondern man nutzt die 
ganze Wellenform aus. Einfach nur der Nulldurchgang wäre die andere 
Methode mit einem analogen Filter und dann einer klassischen 
Zeitmessung, z.B. per ICP.

Wenn man sich die Auswertung so vorstellt, das man vom Signal den Sinus 
und Cosinus Anteil bestimmt, muss man für 1 µs in der Zeit, bzw,, 0.018 
Grad, den kleineren Teil auf etwa 13 Bit genau bestimmen. Das ist keine 
so besonders hohe Anforderung und sollte auch mit nur 8 Bit Auflösung 
des ADs noch ganz gut gehen, weil man je relativ viele Samples (z.B. 
5000 pro Sekunde) mittelt. Man braucht aber schon ein bisschen Zeit (ein 
paar Sekunden ?) für die Messung. Eine Wichtige Frage ist dabei noch wie 
viele Störungen das Signal hat - also ob die 50 Hz aus dem Netz kommen, 
oder von einem extra Funktionsgenerator.

von W.S. (Gast)


Lesenswert?

Warum einfach, wenn es auch kompliziert geht?

ich würde an beide Signalquellen einen simplen Komparator anschließen 
(MAX999 oä.) und damit nen Counter starten bzw. stoppen oder ne 
angeschlossene Captureeinheit triggern, kurzum die Zeitunterschiede der 
Nulldurchgänge digital erfassen. Immerhin kann man mit gängigen uC mit 
Takten im 10 MHz-Bereich Zeiten mit 100 ns auflösen. Sollte doch 
ausreichen. Und wenn man dann noch die Ergebnisse von - sagen wir mal 10 
Messungen - überlagert, also Mittelwert bildet, dann sollte der Einfluß 
von Fremdsignalen auch wegzukriegen sein.

W.S.

von Lars (Gast)


Lesenswert?

W.S. schrieb:
> ich würde an beide Signalquellen einen simplen Komparator anschließen

Hast du dir das mal ausgerechnet?

Die Anstiegsgeschwindigkeit des Sinussignals im Nulldurchgang beträgt
U' = 2*pi*f*Us
Bei einem Singal mit 50Hz und 1V Uspitze gibt das 314V pro Sekunde. Oder 
eben 314uV pro Sekunde. 314uV genügen zwar um einen Komparator zu 
kippen, aber du hast bestimmt noch Rauschen etc. auf dem Signal und dann 
Schaltet der Komparator im Nulldurchgang unzählige male bis er sich 
endlich entschieden kann wohin er will. Klar kann man das Signal 
verstärken und begrenzen, dass der Nulldurchgang viel steiler wird, aber 
dann kommt die Phasenverschiebung der Verstärker wieder dazu. Ok die 
kann man herausrechnen wenn sie konstannt bleibt, aber bleibt sie das? 
Ist sie Amplitudenabhängig? (Und das wird sie sein!)

Ohne jetzt werbung machen zu wollen, nur als Vergleich:

http://www.omicron.at/fileadmin/user_upload/files/pdf/en/CMC-256plus-Technical-Data-ENU.pdf

Das hier beschriebene Gerät kosten so viel wie ein Mittelklassewagen und 
erreicht eine Phasengenauigkeit von 5m°. Die Messgeräte im Kalibrierraum 
sind gerade so im Stande diese Genauigkeit zu messen und sind mit die 
Besten auf dem Markt. (Messung über Kreuzkorrelation). Mit einer 
Komparatorlösung kommst du auf ca. 100m° und dann ist ziemlich bald 
schluss.

Ich würde die Lösung mit AD Wandler vorschlagen. Etwas Mathematik mit 
komplexen Zahlen und dann wird das schon.

von geb (Gast)


Lesenswert?

Wie schon oben gesagt wurde, Kreuzkorrelation oder FFT der Signale sind 
der zielführende Weg. Mit einem AVR wird das vermutlich nix, eher DSP 
oder zumindest ARM Cortex. Als ADC würd ich einen Audio Typ nehmen, die 
haben meist 2 Kanäle, die synchron sampeln.Die Abtastrate muss aufgrund 
der Mittelungseigenschaften von FFT/Kreuzkorrelation nicht extrem hoch 
sein. Die üblichen 192kHz sollten völlig ausreichen. Die analoge 
Signalaufbereitung sollte so einfach und qualitativ hochwertig wie 
möglich sein (Phasenverschiebungen).Hab das mal für Leistungsmessung am 
Netz gemacht und war dann bei 10,24kHz Abtastrate doch auf ca. 0,1° 
reproduzierbar.

Grüsse

von m.n. (Gast)


Lesenswert?

der Neuling schrieb:
> is das überhaupt möglich? oder gibt es da einfachere analoge Lösungen?

Deinem Namen zufolge hast Du vielleicht noch Probleme mit Auflösung und 
Genauigkeit, mit Anspruch und Wirklichkleit.
Eine einfache Möglichkeit, Deine Signale zu bewerten findet sich in der 
Codesammlung unter Beitrag "Stoppuhr – Geschwindigkeit – Pulsweite mit Atmega88".

Mit der Schaltung kannst Du die Phasenverschiebung messen und sehen, wie 
stabil die Signalaufbereitung arbeitet. Unter Umständen siehst Du, dass 
auch eine geringere Genauigkeit völlig ausreichend ist.

von Joe G. (feinmechaniker) Benutzerseite


Angehängte Dateien:

Lesenswert?

der Neuling schrieb:
> ich würde gerne die Phasenverschiebung von zwei Sinussignalen mit einem
> uC messen

Möglicherweise interessiert es ja einen.

von Ulrich (Gast)


Lesenswert?

Wenn man schon den Aufwand treibt und die Kreuzkorrelation ausrechnet, 
dann sollte man danach nicht nur das Maximum als größten Einzelwert 
suchen, sondern besser da noch einmal eine Sinusfunktion anpassen, oder 
wenigstens eine Parabel in der Nähe des Maximums.

Wenn man einen nähungsweisen Sinus Signal mit bekannter Frequenz hat, 
kann man auch gleich einen Sinus an die beiden Signal anpassen. Das geht 
auch bei nicht genau bekannter Frequenz noch recht schnell und liefert 
dann auch ein recht genaues Ergebnis. Die Korrelationsfunktion braucht 
man eigentlich nur, wenn man die Signalform nicht kennt und man eine 
Verzögerung bestimmen will.

von Purzel H. (hacky)


Lesenswert?

Die Kreuzkorrelation kannste fuer diese Anwendung in die Tonne kloppen. 
Die Anforderungen sind ein ueblicher akademischer Furz. Bei 20ms 
periodendauer ist 1us gleich 50ppm. Die Kreuskorrelation hat ein extrem 
flaches Maximum fuer Phasengleichheit eines Sinus. Was besser ist, ist 
die Kreuskorrelation mit einem 90 grad verschobenen Sinus. Den erhaelt 
man mit einem PLL, der mit dem Netz mitlaeuft. Schade, wenn das 
Netzsignal nicht exakt Sinus ist. dh man muesste erst mal einen 
Oberwellenfilter drueberlassen.
Ich wuerd die Kreuzkorrelation durch eine Multiplikation und langsamem 
Tiefpass erstzen.

von Joe G. (feinmechaniker) Benutzerseite


Lesenswert?

Pico Oschi schrieb:
> Die Kreuskorrelation hat ein extrem
> flaches Maximum fuer Phasengleichheit eines Sinus. Was besser ist, ist
> die Kreuskorrelation mit einem 90 grad verschobenen Sinus.

Reden wir über unterschiedliche Dinge? Die „Flachheit“ des Maximums 
ändert sich doch nicht mit der Phasenverschiebung der beiden Signale. 
Auch wenn es wie ein akademischer „Furz“ klingt. Bei AKF und KKF bleibt 
das periodische Signal absolut gleich nur die Amplitude ändert sich. Bei 
der AKF geht die Phase verloren (ist immer ein Cosinus) und bei der KKF 
ist das periodische Signal genau um die Phasendifferenz verschoben.
Man muß ja auch nicht das Maximum der KKF nehmen, es geht ja auch der 
Nulldurchgang.

von Ulrich (Gast)


Lesenswert?

Wie schon oben geschrieben: wenn man die Form des Signals vorher kennt, 
bringt einem die Korrelation keinen wirklichen Vorteil - und wenn dann 
sollte man danach auch die ganze Kurve und nicht nur das Maximum oder 
ersatzweise den Nulldurchgang auswerten. Wobei der Nulldurchgang auch 
nur geht, wenn man die Signalform genau kennt.

Hier soll aber die Signalform bekannt sein (Sinus, jedenfalls 
näherungsweise). Wenn es um so etwas die Dielektrische Verluste im 
Medium geht, kann man eigentlich auch nur die Grundwelle gebrauchen, wie 
die Verschiebung dann bei den Oberwellen ist, kann man nicht allgemein 
sagen - nur eine obere und untere Grenze kann man angeben, die liegen 
aber weit (d.h. Faktor 4 und mehr) auseinander. Entsprechend stören die 
Oberwellen im Signal nur und sollten auch bei der Korrelationsfunktion 
nicht genutzt werden.

von Purzel H. (hacky)


Lesenswert?

Wenn ich zwei orthogonale Funktionen kreuzkorreliere, dann erhalte ich 
Null. Deswegen ist es einfacher die Phasenverschiebung zweier fast 90 
verschiedener Funktionen zu messen wie wenn sie in der Phase fast gleich 
sind. Wenn man den vollen Phasenwinkel Bereich messen will muss man 
somit simultan mit Sin & Cos multiplizieren und dann den Quotienten 
nehmen.
Und sinnvollerweise nimmt man nicht das versaute Netz, sondern 
generierte saubere Spannungen.

von Werner (Gast)


Lesenswert?

Udo Schmitt schrieb:
> ROFL. Klasse Idee mit einem 8Bit µC :-)

Da spricht der Fachmann. Für die KKF reicht eine Multiplikation mit 
+/-1, d.h. eine simple Invertierung des Signals. Das sollte wohl auch 
ein 8-Bit µC oft genug hinbekommen.

von Joe G. (feinmechaniker) Benutzerseite


Lesenswert?

Pico Oschi schrieb:
> Wenn ich zwei orthogonale Funktionen kreuzkorreliere, dann erhalte ich
> Null.

Das ist mathematisch unsauber formuliert und deshalb die 
Missverständnisse.
Das Skalarprodukt zweier orthogonaler Vektoren ist der Nullvektor. 
Wenden wir dieses Gesetz auf unsere zwei Funktionen an so folgt daraus, 
dass das (Skalar)Produkt zweier orthogonaler Funktionen Null ergibt. Das 
möglicherweise umgangssprachlich verwendete Wort „korreliere“ meint also 
das Skalarprodukt. Die Kreuzkorrelationsfunktion ist jedoch anders 
definiert. Die Kreuzkorrelation zweier orthogonaler harmonischer 
Funktionen gleicher Frequenz ist wiederum eine harmonische Funktion 
derselben Frequenz mit einer Phasenverschiebung. Die Phasenverschiebung 
entspricht genau der Phasendifferenz der Ursprungfunktionen

Ulrich schrieb:
> Wie schon oben geschrieben: wenn man die Form des Signals vorher kennt,
> bringt einem die Korrelation keinen wirklichen Vorteil

Man darf auch etwas über den Tellerrand schauen. Die Auto- und 
Kreuzkorrelation dürfen natürlich überall dort angewendet werden wo sie 
mathematische Vorteile versprechen. Dazu sollte man jedoch genau ihre 
Eigenschaften kennen. Es lassen sich schnell unzählige Beispiele für den 
Einsatz der Auto- und Kreuzkorrelation bei bekannten Signalen 
(Signalformen) finden.
GPS – Signal der einzelnen Satelliten bekannt, KKF berechnet die 
Signallaufzeit
Mode-Pickung der Modalanalyse – Signalform bekannt AKF und KKF schätzen 
die Übertragungsfunktionen

von Udo S. (urschmitt)


Lesenswert?

Werner schrieb:
> Da spricht der Fachmann. Für die KKF reicht eine Multiplikation mit
> +/-1, d.h. eine simple Invertierung des Signals.
Offensichtlich kritisiert mich gerade ein Fachmann.
Mein Wissen ist ca. 25 Jahre alt, aber jeder Wert einer Kreuzkorrelation 
ist doch die Summe aller Multiplikationen zwischen dem einen Signal un 
dem anderen Signal + Tau.
Und das dürfte wohl einen 8Bit µC ordentlich beschäftigen zumindest wenn 
das quasi in Echtzeit erfogen soll.
Was die Multiplikation mit +-1 betrifft darfst du mir das gerne mal 
erklären.
Quelle meines Wissens: (Hänsler, statistische Signaltheorie, TH 
Darmstadt)

Das Wesentlich der KK wurde hier im Übrigen meines Erachtens überhaupt 
nicht erwähnt daß sich nämlich statistisch verteilte Störungen 
herausmitteln.
Deswegen wird doch im Handy und Satellitenfunk KK verwendet weil man 
damit ein Nutzsignal noch aus einem um Größenordnungen größerem Rauschen 
herausbekommen kann.
Es gibt im übrigen Versuche mit dem man nachweisen kann daß unser Hirn 
beim Hören was ähnliches macht um z.B. das Sprechen einer Person aus dem 
Hintergrungrauschen (z.B. Lärm in einer Kneipe) herauszufiltern.

von Joe G. (feinmechaniker) Benutzerseite


Lesenswert?

Udo Schmitt schrieb:
> Was die Multiplikation mit +-1 betrifft darfst du mir das gerne mal
> erklären.

Für mich bitte auch!

Udo Schmitt schrieb:
> Das Wesentlich der KK wurde hier im Übrigen meines Erachtens überhaupt
> nicht erwähnt daß sich nämlich statistisch verteilte Störungen
> herausmitteln.

Genau deshalb hatte ich in meinem PDF (etwas weiter oben) zu jedem der 
beiden Signale zwei jeweils unkorrelierte (!) Störungen (50 %) dazu 
addiert. In der Grafik der KKF sieht man sehr schön wie die Störungen 
rausgemittelt werden.

von Ulrich (Gast)


Lesenswert?

Man kann die Korrelationsfunktion mit Hilfe der FFT Ausrechnen. Da würde 
es dann von der Rechenzeit ggf. schon mit dem 8 bit µC gehen - nur man 
braucht auch einiges an RAM, und das kann man nicht durch mehr Zeit 
ausgleichen.

Die Methode der Wahl ist da schon eher die direkte Anpassung einer 
Sinusfunktion an beide Signale. Das geht bei einigermaßen bekannter 
Frequenz auch mit einem 8 Bit µC noch in Echtzeit recht genau - wenn es 
sein muss mit etwas extra Messzeit zum genauen messen der Frequenz 
vorab.

von Joe G. (feinmechaniker) Benutzerseite


Angehängte Dateien:

Lesenswert?

Ulrich schrieb:
> Die Methode der Wahl ist da schon eher die direkte Anpassung einer
> Sinusfunktion an beide Signale.

Nehmen wir mal ein stark gestörtes Sinussignal (siehe Bild) wie mache 
ich da eine Anpassung?

von Ulrich (Gast)


Lesenswert?

An einfachsten ist es wenn man die Frequenz genau kennt: Für die 
Anpassung berechnet man einfach die Korrelation des Signals mit einem 
gerechneten (oder am µC auch aus einer Tabelle) Sinus und Cosinus. Wenn 
das Messintervall gerade ein vielfaches der Periode ist hat man damit 
gleich die Anteile als Sinus und Cosinus, sonst kommt noch eine kleine 
Korrektur dazu. Aus dem Verhältnis und dem Arcustangens bekommt man die 
Phase der einzelnen Signale.

Für jeden wert vom AD Wandler braucht man damit nur 2 Multiplikationen 
mit einem Wert aus der Tabelle und 2 Additionen, bei variabler Frequenz 
noch eine 3. Addition für den Tabellenindex. Das schöne dabei ist, das 
man die einzelnen Werte nicht alle Speichern muss. Wenn es sein muss 
kann man auch einen Offset vom AD Wandler noch berücksichtigen. Dazu 
kommen dann am Ende ggf ein paar extra Operationen und dann 2 mal der 
Arcustangens (bzw. atan2() in C) als relativ langsame 
Fließkommafunktion. Aber auch das schaft ein 8 Bit µC unter 10 ms.

Wenn man die Frequenz nicht genau (hier wohl etwa +-0,1 Hz) kennt, wird 
es ggf. etwas komplizierter, könnte aber geschickt programmiert immer 
noch in Echtzeit, ohne Speichern aller Werte reichen, der Aufwand sollte 
sich etwa verdoppeln.

von ARCTAN (Gast)


Lesenswert?

Ulrich schrieb:
> Aus dem Verhältnis und dem Arcustangens bekommt man die Phase der
> einzelnen Signale.

Arcustangens ist ja auch immer eine so gute Option wenn man genaue Werte 
haben möchte ;-)

von Matthias (Gast)


Lesenswert?

der Neuling schrieb:
> ich würde gerne die Phasenverschiebung von zwei Sinussignalen mit einem
> uC messen (am liebsten AVR)....

Ein Weg wäre, durch Phasenverschiebung um 90° zu dem Sinus B den Cosinus 
B zu erzeugen bzw. entsprechende Rechtecksignale.

Aus den beiden Mittelwerten über Sinus A * Sinus B bzw. Sinus A * 
Cosinus B ergibt sich direkt der Phasenwinkel. Statt der Multiplikation 
mit Sinus B bzw. Cosinus B kann man auch mit den entsprechenden 
Rechtecksignalen multiplizieren, was die Rechnung auf dem µC sehr 
einfach macht.

von Joe G. (feinmechaniker) Benutzerseite


Lesenswert?

Ulrich schrieb:
> Für die
> Anpassung berechnet man einfach die Korrelation des Signals mit einem
> gerechneten (oder am µC auch aus einer Tabelle) Sinus und Cosinus.

Was ist die Korrelation für eine Rechenoperation? Ich kenne Addition, 
Subtraktion, Multiplikation, Integration, die Korrelationsfunktion 
(siehe oben), den Korrelationskoeffizienten …, jedoch keine Korrelation. 
Was müsste ich rechnen?

Matthias schrieb:
> Ein Weg wäre, durch Phasenverschiebung um 90° zu dem Sinus B den Cosinus
> B zu erzeugen bzw. entsprechende Rechtecksignale.

Wie erzeugt man (rechentechnisch) von einem furchtbar verrauschten 
harmonischen Ausgangssignal ein unverrauschtes harmonisches Signal das 
genau um 90 Grad phasenverschoben ist?

von Ulrich (Gast)


Lesenswert?

Da wir zuvor so viel über Korrelation diskutiert haben, dachte ich die 
Erklärung könnte ich mir Sparen. Für die Kooreltation des Signal mit 
einem Siunus, berechnet man erst mal in Echtzeit die Summe über Messwert 
* Sinuswert (beim µC wohl aus der Tabelle). Am Ende kann man dann noch 
auf die Zahl der Summanden normieren - muss es da aber nicht so genau 
nehmen, denn es kommt ja nur auf das Verhältnis für Sinus und Cosinus 
an.

von Bandpassi (Gast)


Lesenswert?

Also, ich würde ein solches Signal erstmal über einen analogen Bandpaß 
schicken...

von Simon K. (simon) Benutzerseite


Lesenswert?

Man könnte die 90° verschobenen Signale über eine digitale oder analoge 
Phasenregelschleife erzeugen. Wenn das Quellsignal verrauscht ist, hilft 
wohl nur die Spikes zu filtern, bzw. die Bandbreite des Reglers so zu 
begrenzen, dass kurze Störungen nicht für eine große Verstimmung der 
erzeugten Frequenz sorgen.

Ist aber jetzt eher theoretisch. So würde ich es probieren (in einem 
Mikrocontroller).

von Joe G. (feinmechaniker) Benutzerseite


Lesenswert?

Ulrich schrieb:
> Da wir zuvor so viel über Korrelation diskutiert haben, dachte ich die
> Erklärung könnte ich mir Sparen. Für die Kooreltation des Signal mit
> einem Siunus, berechnet man erst mal in Echtzeit die Summe über Messwert
> * Sinuswert (beim µC wohl aus der Tabelle).

Ich begreife es trotzdem nicht. Wenn ich zwei Vektoren habe, Vektor 1 
enthalt das Messsignal und Vektor 2 einen Sinus (meinetwegen in einer 
Tabelle) und ich multipliziere Elementweise die beiden Vektorgrößen und 
summiere sie dann auf, dann erhalte ich doch zum Schluss nur eine reelle 
Zahl. Was sagt mir die aus, unhabhängig ob ich diese Zahl noch auf die 
Vektorlänge normiere oder nicht.
Bsp.
V1 = [1,2,3,4]
V2 = [9,8,7,6]
E = 1*9+2*8+3*7+4*6

von Matthias (Gast)


Lesenswert?

Joe G. schrieb:
> Wie erzeugt man (rechentechnisch) von einem furchtbar verrauschten
> harmonischen Ausgangssignal ein unverrauschtes harmonisches Signal das
> genau um 90 Grad phasenverschoben ist?

Gut zu wissen, dass deine Signale beide furchtbar verrauscht sind.

Möchtest du die Phasenverschiebung bei einer bestimmten Frequenz messen 
oder die Zeitverschiebung zwischen zwei (im Prinzip) beliebigen, aber 
gleichen Signalen? Was weißst du denn überhaupt von deinem Signal? Ohne 
irgendwelche Zusatzinformationen wird es sonst beliebig lustig da etwas 
Sinnvolles zu messen. Zeig doch mal ein Bild.

von Joe G. (feinmechaniker) Benutzerseite


Lesenswert?

Ist schon OK.
Eigentlich wollte ich nur auf die Kreuzkorrelationsfunktion hinweisen. 
Viele haben davon gesprochen, dass es einfacher geht. Man könnte z.B. 
mit Sin und Cos multiplizieren und den aufsummierten Mittelwert bilden, 
man könnte den Sin nachbilden, eine um 90 Grad phasenverschobene 
Funktion nutzen, man könnte „korrelieren“, usw. usw.
JA ihr habt alle recht! Doch nun schaut noch mal genauer hin. Es ist und 
bleibt die Kreuzkorrelationsfunktion, in diesem Fall mit tau = 0.

von Detlef _. (detlef_a)


Lesenswert?

Anbei ein Matlab script, das die Frequenz, Amplitude und Phase eines 
gegebenen Sinus bestimmt. Das funktioniert auch gut unter Rauschen. Das 
script nimmt keine Rücksicht auf Speicherplatz. Das Ganze läßt sich 
modifiziert auch auf einem kleinen uC ausführen. Braucht man die 
Phasenverschiebung zweier Signale macht man die Prozedur für beide 
Signale.

Wenn man die Frequenz des gesuchten Signals kennt gibt es bessere 
Verfahren. Dieses Verfahren hat Prony erfunden.

Cheers
Detlef

clear
w=15.3*2*pi/128
sig = 1.34*sin(w*(0:127)+0.123);
n=length(sig);
%sig(n-1)+sig(n+1)=2*cos(w)*sig(n);
s1=sig(1:n-2)+sig(3:n);
s2=sig(2:n-1);
% Regression s1 auf s2
M= [s2.' ones(length(s1),1)];
coff=inv(M'*M)*M'*s1.';
wn=acos(coff(1)/2);

M=[cos((0:n-1)*wn).' sin((0:n-1)*wn).'];
coff=inv(M'*M)*M'*sig.';

cc=coff(2)+j*coff(1);
amp=abs(cc);
ph=angle(cc);

von Uwe (Gast)


Lesenswert?

Ulrich schrieb:
> Das synchron sampeln ist nicht unbedingt nötig, denn die Verzögerung
> beim AD im µC ist konstant und bekannt
wie willst Du den Jitter rausrechnen? Bei einem MC-gesteurten ADc wirst 
Du einiges an Problemen haben.

von Wolfgang (Gast)


Lesenswert?

Detlef _a schrieb:
> Wenn man die Frequenz des gesuchten Signals kennt gibt es bessere
> Verfahren. Dieses Verfahren hat Prony erfunden.

Da gibt es auch noch andere Methoden:
http://schulen.eduhi.at/htlbraunau/lehrer/ploetz/Labbsp/prony.pdf

von Simon K. (simon) Benutzerseite


Lesenswert?

Detlef _a schrieb:
> Anbei ein Matlab script, das die Frequenz, Amplitude und Phase eines
> gegebenen Sinus bestimmt.

Warum hat sich das bei Matlab eigentlich eingebürgert maximal unlesbare 
Variablennamen zu benutzen?

von Joe G. (feinmechaniker) Benutzerseite


Lesenswert?

Simon K. schrieb:
> Warum hat sich das bei Matlab eigentlich eingebürgert maximal unlesbare
> Variablennamen zu benutzen?

Weil es cool ist, weil man sich vermeintlich damit von den 
"Nichtwissenden" abhebt.

von Simon K. (simon) Benutzerseite


Lesenswert?

Ahso, klingt logisch! ...

von Sepp Obernair (Gast)


Lesenswert?

Entschuldigt wenn ich diesen Beitag wieder ausgrabe, ich versuche mich 
gerade an der implementierung eines ähnlichen Verfahrens, habe aber 
dabei so meine Probleme. Insbesondere ist mir nicht klar wo ich bei 
Detlefs Regressionsverfahren die Freqeunz des Signals erhalte. Phase und 
Amplitude ja - aber die Freqeunz?

Vielleicht liest Detlef ja noch mit - oder jemand anderes kundiges.

Grüße Sepp

von Detlef _. (detlef_a)


Lesenswert?

Hallo Sepp. Hier

wn=acos(coff(1)/2);

ist wn die Frequenz des Sinus.

Cheers
Detlef

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.