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