www.mikrocontroller.net

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


Autor: Jasper (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jasper (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jasper (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernhard R. (barnyhh)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.