Forum: Mikrocontroller und Digitale Elektronik 2,048Mhz mit AVR messen


von Jasper (Gast)


Lesenswert?

Hallo,

Folgendes Problem:
Ich muss genau 2048000Hz erzeugen. Dazu verwende ich eine DDS mit recht 
genauem Osziallator. Das funktioniert auch schon sehr gut. Um die 
Ausgangsfrequenz der DDS jetzt ganz genau einzustellen und irgendwelche 
Drifts zu kompensieren verwende ich den 1PPS Puls von einem GPS 
Empfänger. Dieser ist extrem genau. Ich möchte jetzt einfach die Anzahl 
Pulse zählen, die zwischen zwei PPS Pulsen aufgelaufen sind und damit 
weiß ich die Ausgangsfrequenz der DDS aufs Hz genau. Das Problem ist 
nur, das Mein Mega128 mit anderen Applikationen auf 7,3728Mhz läuft. Ich 
hatte jetzt gedacht einen Tiny2313 mit 20Mhz zusätzlich zu nehmen, der 
nur für das Zählen zuständig ist und nach der Zählung mir den Wert per 
irgendeiner Schnittstelle überträgt. Würde der 2313 das von der 
Geschwindigkeit überhaupt schaffen? (Interrupt erkennen, in 
Interruptroutine springen, Plus 1 addieren und Interrupt wieder scharf 
schalten)

Grüsse
Jasper

von Εrnst B. (ernst)


Lesenswert?

Einer der Timer in deinem AVR sollte extern taktbar sein.
Dann wird das Hochzählen in Hardware erledigt, und du musst nur alle 256 
(oder 64k) Zählimpulse einen Interrupt abarbeiten.

von Falk B. (falk)


Lesenswert?

@  Jasper (Gast)

>Ich muss genau 2048000Hz erzeugen.

WIE genau? 1ppm? 1ppb?

> Dazu verwende ich eine DDS mit recht
>genauem Osziallator. Das funktioniert auch schon sehr gut. Um die
>Ausgangsfrequenz der DDS jetzt ganz genau einzustellen und irgendwelche
>Drifts zu kompensieren verwende ich den 1PPS Puls von einem GPS
>Empfänger. Dieser ist extrem genau. Ich möchte jetzt einfach die Anzahl
>Pulse zählen, die zwischen zwei PPS Pulsen aufgelaufen sind und damit
>weiß ich die Ausgangsfrequenz der DDS aufs Hz genau. Das Problem ist
>nur, das Mein Mega128 mit anderen Applikationen auf 7,3728Mhz läuft.

Dann musst du halt deinen 2,048MHz Takt extern vorher teilen, durch zwei 
per FLipFLop reicht. Dann kann dein AVR mittels Timer die Pulse zählen.

>nur für das Zählen zuständig ist und nach der Zählung mir den Wert per
>irgendeiner Schnittstelle überträgt. Würde der 2313 das von der
>Geschwindigkeit überhaupt schaffen? (Interrupt erkennen, in
>Interruptroutine springen, Plus 1 addieren und Interrupt wieder scharf
>schalten)

Macht man so nicht, sondern per Timer!
Aber wenn man es sich GENAU überlegt muss der AVR innerhalb EINER 
Taktperiode des Messsignals (hier 1,024 MHz) den Timer abschalten. Das 
wird sehr knapp. Mit Interrupt, ASM und 20 MHz CPU-Takt könnte es gehen.

MFg
Falk

Einfacher wäre das Ganze in einem CPLD.

von Εrnst B. (ernst)


Lesenswert?

Falk Brunner schrieb:
> Macht man so nicht, sondern per Timer!
> Aber wenn man es sich GENAU überlegt muss der AVR innerhalb EINER
> Taktperiode des Messsignals (hier 1,024 MHz) den Timer abschalten. Das
> wird sehr knapp. Mit Interrupt, ASM und 20 MHz CPU-Takt könnte es gehen.

Muss ja nicht unbedingt innerhalb der "letzten" Taktperiode passieren.
Ich würde den Timer durchlaufen lassen, und in der ISR nur den Timerwert 
umkopieren. Das geht zwar nicht innerhalb des einen externen Taktes, hat 
aber vom IRQ-Start immer die gleiche Verzögerung.
andere Interrupts müssen dann halt tabu sein, aber einen Jitter von ± 1 
AVR Takt gibts trotzdem, wg. der unterschiedlichen 
Opcode-Ausführungszeiten.

Vielleicht mal verschiedene Frequenzzähler-Projekte anschauen. Die sind 
zwar meistens mit PIC, weil bei denen der externe Timereingang nicht mit 
der CPU-Clock synchronisiert ist, aber für AVR gibts da sicher auch ein 
paar.

von Εrnst B. (ernst)


Lesenswert?

Mit etwas Zusatzhardware wird es natürlich einfacher.
z.B. deine 2.048MHz per AND-Gatter mit dem Frequenznormal verknüpfen, 
dann hast du immer eine Sekunde Zeit um den Zählerstand auszulesen und 
zurückzusetzen...

von Falk B. (falk)


Lesenswert?

@  Εrnst B✶ (ernst)

>andere Interrupts müssen dann halt tabu sein, aber einen Jitter von ± 1
>AVR Takt gibts trotzdem, wg. der unterschiedlichen
>Opcode-Ausführungszeiten.

Man könnte wahrscheinlich sogar eher die ICP-Funktion nutzen. Dann wird 
es entspannt und exakt!

MfG
Falk

von Purzel H. (hacky)


Lesenswert?

Eine Synchronisation mit einem GPS 1 Sekunden Puls ist etwas 
aufwendiger. Man muss dem GPS Signal einen Jitter erlauben. Dh man muss 
ueber einige Sekunden, zB 100 Sekunden integrieren. Dh anstelle in einer 
Sekunde auf 2'048'000 zu Zaehlen muss man in 100 sekunden auf 
204'800'000 zaehlen und aufgrund von dieser Differenz den VCO 
nachstellen. Jetzt mach diesen Vorgang  kontinuierlich.

von Jasper (Gast)


Lesenswert?

Danke für die Tipps schon mal vorweg.

@Ernst
Das mit dem And habe ich nicht ganz begriffen. Kannst du das noch etwas 
näher ausführen? Das Layout ist noch nicht fertig. Somit könnte ich ein 
und noch einfügen.

Wie willst du das denn mit der ICP Funktion lösen.

von Purzel H. (hacky)


Lesenswert?

Man darf uebrigens nicht vorteilen, sonst ist die Genauigkeit weg. Also 
nicht extern oder intern vorteilen. Der ICP funktioniert hier nicht, da 
der nur auf 65'000 zaehlen kann. Ich wuerd ein CPLD nehmen und dem einen 
29bit Zaehler verpassen.

von Jasper (Gast)


Lesenswert?

@ Nebliger Pfad

Das mit dem integrieren über z.B. 100sek ist eine Gute idee. Meinst du 
es würde auch mit den internen Timern funktionieren? Würde den Timer 1 
in 16Bit ohne Teiler laufen lassen und alle 65536 Takte in einen 
Überlaufinterrupt laufen.

von Falk B. (falk)


Lesenswert?

@  Nebliger Pfad (Firma: vorgestern) (hacky)

>Man darf uebrigens nicht vorteilen, sonst ist die Genauigkeit weg.

Nöö, nur die Auflösung. Siehe Auflösung und Genauigkeit.

MfG
Falk

von Ulrich (Gast)


Lesenswert?

Es hängt ein wenig vom Jitter des GPS Signals ab, denn der Schwierigere 
Teil ist es die 1 sekunde genau mit einen höheren Takt zu verknüpfen. 
Die Methode der Wahl wäre es das 2 MHz Signal auf etwa 10-100 kHz 
runterzuteilen und dann genau wie die GPS Sekunde per ICP zu vermessen.
Je nach Qualität des GPS Signals lohnt es sich dafür auch einen höheren 
Takt (20 MHz) zu nutzen.

Die einfachere Wahl, und vermutlich besser wäre es einen Quarz mit z.B. 
8x2,048 MHz zu nehmen, und den per Kappazitätsdiode nach zu justieren, 
anhand des GPS Signals. Mit den gut 16 MHz könnte ein µC laufen, der 
dann per ICP das GPS Signal vermisst.

von Bernhard R. (barnyhh)


Lesenswert?

Hier fehlt einiges:
Wie genau "muß" die Frequenz denn sein?
Welchen Jitter darf der Oszillator haben?
...

Ohne die fehlenden Informationen wird das doch "Herumgestochere im 
Nebel".

Bernhard

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.