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
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.
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?
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
@ 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.
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
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"
@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
Spricht was gegen einen Vorteiler durch 2? Wenn man das mit Referenz- und Meßkanal macht bleit die Beziehung zueinander ja gleich.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.