Forum: Mikrocontroller und Digitale Elektronik Phasenverschiebung mit AVR messen


von Alex W. (a20q90)


Lesenswert?

Hallo,

die anderen Forenthreads haben mir leider nicht geholfen!

Ich habe zwei 1khz Sinussignal (eigentlich eines aber durch 
Laufzeitverzögerung verschiebst sich die Phase am Ausgang zum Eingang.

So mein Problem:

ich möchte die Phasenverschiebung zwischen der Quelle (1khz 
Signalgenerator) und dem Ende (z.B. eine Leitung) messen.

Die Phasenverschiebung sollte erst mal auf 1° genau sein (falls möglich 
lieber gleich .1°)

Wie kann ich mit dem AVR die Phasenverschiebung bei solch einem Signal 
messen? Ursprünglich plante ich einen Timer zu starten, zu zählen und 
bei der der zweiten Phase den Nulldurchgang als stop für den timer zu 
nehmen.

Geht das so überhaupt?

wenn ja, kann ich damit später auch ein 10khz-Signal so messen?

Grüße
Alex

von Karl H. (kbuchegg)


Lesenswert?

Alex W. schrieb:

> Wie kann ich mit dem AVR die Phasenverschiebung bei solch einem Signal
> messen? Ursprünglich plante ich einen Timer zu starten, zu zählen und
> bei der der zweiten Phase den Nulldurchgang als stop für den timer zu
> nehmen.
>
> Geht das so überhaupt?

Im Prinzip ja.
Nur: bitte, bitte, bitte. Lass den Timer durchlaufen. Mit diesem Timer 
starten/stoppen wird das komplizierter, als wenn du einfach nur:
wenn Signal 1 seinen 0-Durchgang hat, dann Timer Wer merken
wenn Signal 2 seinen 0-Durchgang hat, dann ebenfalls Timer Wert nehmen

Die Differenz der beiden Werte ist dann dein gesuchtes Zeitmass. Wenn du 
alle Werte unsigned hältst, zb beim Timer 1 (16 Bit Timer) als uint16_t, 
dann brauchst du dir auch um einfache Überläufe keinen Kopf machen. 
Solange die Differenz mit 16 Bit darstellbar ist, kommt bei Ende-Start 
immer das richtige raus.

> wenn ja, kann ich damit später auch ein 10khz-Signal so messen?

Spricht nichts dagegen.

von Alex W. (a20q90)


Lesenswert?

Hey Karl Heinz die Idee ist gut!

Ich hätte tatsächlich den Timer angehalten!

Spricht was dagegen wenn der erste Nulldurchgang genutzt wird um den 
Timer auf 0 zu setzen und beim zweiten das Messergebniss zu verwenden?

Oder benötigt diese Ausführung mehr Rechenschritte im AVR als einfach 
den Wert auszulesen?

von Karl H. (kbuchegg)


Lesenswert?

Alex W. schrieb:
> Hey Karl Heinz die Idee ist gut!
>
> Ich hätte tatsächlich den Timer angehalten!
>
> Spricht was dagegen wenn der erste Nulldurchgang genutzt wird um den
> Timer auf 0 zu setzen und beim zweiten das Messergebniss zu verwenden?

Wozu?

> Oder benötigt diese Ausführung mehr Rechenschritte im AVR als einfach
> den Wert auszulesen?

Lies einfach den jeweiligen Wert aus und gut ists.

Wenn du zb mit externen Interrupts auf den Nulldurchgang reagierst:
1
volatile uint16_t Start;
2
volatile uint16_t Zeit;
3
4
ISR( .... )   // 0 Durchgang am Eingang
5
{
6
  Start = TCNT1;
7
}
8
9
ISR( .... )  // 0 Durchgang am Ausgang
10
{
11
   Zeit = TCNT1 - Start;
12
}

einfach genug? Mehr ist das nicht. Jegliches Timer starten/stoppen 
bringt nur mehr Komplexität und du kriegst nichts dafür.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@ Alex W. (a20q90)

>ich möchte die Phasenverschiebung zwischen der Quelle (1khz
>Signalgenerator) und dem Ende (z.B. eine Leitung) messen.

>Die Phasenverschiebung sollte erst mal auf 1° genau sein (falls möglich
>lieber gleich .1°)

Auflösung und Genauigkeit.

1° bei 1kHz sind 2,7 us, das geht schon. Selbst 0,27us kann man 
auflösen, das sind nur knapp 5 MHz Takt.

>Wie kann ich mit dem AVR die Phasenverschiebung bei solch einem Signal
>messen? Ursprünglich plante ich einen Timer zu starten, zu zählen und
>bei der der zweiten Phase den Nulldurchgang als stop für den timer zu
>nehmen.

Im Prinzip ja. Praktisch wird man eher die Input Capture Funktion nutzen 
wollen, damit man mehr Auflösung bekommt. Dazu braucht man aber etwas 
externen Hardware.

von Martin S. (led_martin)


Lesenswert?

Ich würde dringend zu einer Lösung mit Benutzung der Input Capture 
Funktion raten, da ist die Erfassung wirklich taktgenau, und nicht von 
der Laufzeit innerhalb der ISR abhängig (Der Aufruf der ISR streut ja 
auch schon um ein paar Takte). Schau dier mal den ATmega1284P an, der 
hat einen 2. 16 Bit Timer (Timer3), der auch einen 2. ICP-Eingang 
mitbringt. Da brauchts keine externe Umschalt-Hardware. Du solltest auch 
immer mehrere Messungen machen, und mitteln, damit die Werte stabil 
werden. Vielleicht ist es auch sinnvoll, sowohl die positive, als auch 
die negative Flanke zu vermessen, falls die Schaltschwelle nicht exakt 
mittig sitzt.

Mit freundlichen Grüßen - Martin

von m.n. (Gast)


Lesenswert?

Martin Schlüter schrieb:
> Ich würde dringend zu einer Lösung mit Benutzung der Input Capture
> Funktion raten, da ist die Erfassung wirklich taktgenau, und nicht von
> der Laufzeit innerhalb der ISR abhängig (Der Aufruf der ISR streut ja
> auch schon um ein paar Takte).

Das geht schon ab ATtiny44, der einen 16 Bit Timer mit Capture-Funktion 
hat. Geschickterweise nimmt man ADC-Eingänge, die sich separat auf den 
Analog-Komparator legen lassen und nimmt dessen Ausgang als 
Capture-Signal. Externe Hardware: 0

Bei kleinen Phasenwinkel ist es besser, das 2. Signal zu invertieren 
(bzw. die andere Flanke auszuwerten), sodaß man nicht 1° sondern 181° 
mißt. Die Umschaltung zwischen den Kanälen hat damit sehr viel Zeit.

Für 10 kHz und 0,1° Phasenwinkel wird es für einen AVR zu eng. Da hilft 
dann ein STM32F4xx, der auf ca. 6 ns genau messen kann. Ein Beispiel: 
Beitrag "Frequenz- und Pulsweitenmessung mit STM32F407"

von Martin S. (led_martin)


Lesenswert?

@m.n. (Gast):

An die Sache mit dem Komparator hatte ich nicht gedacht, ist eine gute 
Idee. Ja für 10kHz und 0,1° wirds zu knapp, ca, 0,5 Taktzyklen (20MHz 
Takt vorausgesetzt). Bei vielen Messungen kann man das vielleicht noch 
aus dem Rauschen rausfischen, aber sicher ist das dann nicht mehr. Mit 
ein Bisschen mehr externer Schaltung kann man da aber sicher auch mit 
einem AVR noch was machen, aber ob Das dann noch sinnvoll ist?

Mit freundlichen Grüßen - Martin

von Fragezeichen (Gast)


Lesenswert?

Spricht was gegen einen Vorteiler durch 2? Wenn man das mit Referenz- 
und Meßkanal macht bleit die Beziehung zueinander ja gleich.

von m.n. (Gast)


Lesenswert?

Fragezeichen schrieb:
> Spricht was gegen einen Vorteiler durch 2? Wenn man das mit Referenz-
> und Meßkanal macht bleit die Beziehung zueinander ja gleich.

Gute Überlegung, aber es wird nur die Frequenz geteilt; der Zeitversatz 
zwischen den Signalen bleibt gleich.


Martin Schlüter schrieb:
> Bei vielen Messungen kann man das vielleicht noch
> aus dem Rauschen rausfischen, aber sicher ist das dann nicht mehr.

Da müßte man testen, ob das interne Schaltverhalten des µC die Signale 
zu sehr verfälscht. Aktuell habe ich dafür keine Zeit.


Noch etwas zu der Schaltung mit dem STM32F407: für das 2. Signal müßte 
man PC.7 aktivieren, über den dann das 2. Capture-Register aktiviert 
wird. Oder man mischt beide Signale mit einem schnellen XOR-Gatter zu 
einem Signal. Anstatt der Pulsweite (Skalierung mit 100%) zeigt man den 
Phasenwinkel mit der Skalierung 360° an. Aber auch dafür fehlt mir 
momentan die Zeit.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.