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
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.
@ 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.
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.
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...
@ Ε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
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.
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.
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.
@ 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.
@ 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
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.
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