Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

10 MHz mit AVR zählen...

95 views
Skip to first unread message

Martin Müller

unread,
Feb 24, 2003, 10:42:12 AM2/24/03
to
Hallo!

Ich suche nach einer Möglichkeit, ein 10MHz TTL-Signal eines Sensors mit
dem ATmega 32 zu zählen. Dabei sollte die Auflösung 1Hz betragen. Mit
dem 16-Bit Zähler wird das wohl etwas schwierig, weil der dann ca. 150
pro Sekunde überläuft.
Was gibt's da für Alternativen? Hat jemand kreative Ideen?

Schönen Gruß,

Martin

Rick Sickel

unread,
Feb 24, 2003, 11:30:08 AM2/24/03
to
Der Zähler löst pro Überlauf einen Interrupt aus, wenn das entsprechende
Bit in irgendeinem Register gesetzt ist. In der Interupptserviceroutine
muß man dann nur noch zählen wie oft der Zähler übergelaufen ist, mit
2^16 multiplizieren ;-) und den Zählerstand am Ende dazuaddieren.
Fertig.

Rick

Martin Müller

unread,
Feb 24, 2003, 12:22:28 PM2/24/03
to
Rick Sickel schrieb:

> Der Zähler löst pro Überlauf einen Interrupt aus, wenn das entsprechende
> Bit in irgendeinem Register gesetzt ist. In der Interupptserviceroutine
> muß man dann nur noch zählen wie oft der Zähler übergelaufen ist, mit
> 2^16 multiplizieren ;-) und den Zählerstand am Ende dazuaddieren.
> Fertig.

Mh, naja, das hatte ich auch zuerst gedacht, aber dann Zweifel bekommen, ob
das bei der Geschwindigkeit auch noch geht...? Aber wenn Du da überzeugt bist,
dann steht dem Projekt ja nix mehr im Weg.

Danke,
Martin

Jan-Hinnerk Reichert

unread,
Feb 24, 2003, 12:59:03 PM2/24/03
to
Martin Müller wrote:

Was willst Du genau tun?
Ich lese das jetzt als:
Du hast ein 10MHz +/- irgendwas, und willst irgendwas bestimmen, indem Du
eine Zeit lang zählst...

BTW: Sowohl low als auch high Deines clk-Signals müssen mindestens einen
Systemclock-Zyklus lang sein, d.h. allerhöchstens 8MHz ;-(

BTW: 1Hz Auflösung ist nicht dasselbe wie 1Hz Genauigkeit.

Jan-Hinnerk

Hendrik van der Heijden

unread,
Feb 24, 2003, 1:22:45 PM2/24/03
to
Jan-Hinnerk Reichert wrote:
> Martin Müller wrote:
>
>
>>Hallo!
>>
>>Ich suche nach einer Möglichkeit, ein 10MHz TTL-Signal eines Sensors mit
>>dem ATmega 32 zu zählen. Mit dem 16-Bit Zähler wird das wohl etwas

>>schwierig, weil der dann ca. 150 pro Sekunde überläuft.
>
> Was willst Du genau tun?
> Ich lese das jetzt als:
> Du hast ein 10MHz +/- irgendwas, und willst irgendwas bestimmen, indem Du
> eine Zeit lang zählst...
>
> BTW: Sowohl low als auch high Deines clk-Signals müssen mindestens einen
> Systemclock-Zyklus lang sein, d.h. allerhöchstens 8MHz ;-(

Also noch einen kleinen Vorteiler /4 in Hardware vor den Zählereingang
löten. Damit die Auflösung von 1 Hz dann noch hinkommt, muß man halt
über 4 Sekunden messen.

Das Problem bei den 150 Überläufen pro Sekunde seh ich nicht, zähl doch
die Überläufe und berechne daraus die Frequenz.


hth Hendrik vdH


Rick Sickel

unread,
Feb 24, 2003, 1:37:34 PM2/24/03
to
Jan Schomerus wrote:

>
> * Martin Müller <martin....@iws.uni-stuttgart.de> wrote:
> > Mh, naja, das hatte ich auch zuerst gedacht, aber dann Zweifel bekommen,
> > ob das bei der Geschwindigkeit auch noch geht...? Aber wenn Du da
> > überzeugt bist, dann steht dem Projekt ja nix mehr im Weg.
>
> Nicht ganz.
> Die externe Clock-Source für den Counter darf maximal die
> halbe Taktfrequenz haben, besser f_T/2.5, sonst zählt er
> nicht mehr richtig.

Den Gedanken hatte ich auch schon im Hinterkopf, war aber der Meinung,
die neuen AVRs gehen bis 32MHz.
Abhilfe schafft hier nur ein Vorteiler, also mindestes ein 1-bit Zähler.
Für die gleiche Auflösung müsste man dann allerdings doppelt so lang
zählen, oder den externen Zählerstand am Ende einlesen und entsprechend
hizufügen.

Rick

Falk Brunner

unread,
Feb 24, 2003, 1:20:26 PM2/24/03
to
"Jan-Hinnerk Reichert" <hi...@despammed.com> schrieb im Newsbeitrag
news:b3dmhb$1lbn91$1...@news.hansenet.net...

> BTW: Sowohl low als auch high Deines clk-Signals müssen mindestens einen
> Systemclock-Zyklus lang sein, d.h. allerhöchstens 8MHz ;-(

Eben.

Schau dir doch zuerst mal prinzipiell an, wie eine Frequuenzmesung
funktioniert.
Dazu braucht man einen Zähler sowie einen Torimpuls. Der Torimpuls bestimmt
die Messzeit, sagen wir mal vereinfacht 1s. Diesen Puls kann der AVR sehr
leicht relativ genau erzeugen. Den eigentlichen Zähler zum Pulse zählen
musst du ausserhalb des AVR Realisieren, zumindest brauchts du einen
Vorteiler, denn 10 MHz Pulse kann der AVR nicht direkt zählen. Also nimmst
du z.B. einen 4520, da sind zwei binäre 4-Bit Zähler mit Reset und Enable
drin. Der Zähler teilt deine 10 MHz auf 625 kHz, das kann der AVR leicht
zählen. Nun musst du flogendes im AVR tun.

4520 reseten
4520 Enable HIGH
1s warten
4520 enable LOW

während Du 1 s wartest, musst du mit dem AVR die Ausgangspulse (max. 625
kHz) des 4520 Zählen. Am Ende hast du das Zählergebnis im AVR + den
Zählerstand im 4520 als dein Ergebnis.

--
MfG
Falk


Martin Müller

unread,
Feb 24, 2003, 1:37:24 PM2/24/03
to
Rick Sickel schrieb:

> Den Gedanken hatte ich auch schon im Hinterkopf, war aber der Meinung,
> die neuen AVRs gehen bis 32MHz.
> Abhilfe schafft hier nur ein Vorteiler, also mindestes ein 1-bit Zähler.
> Für die gleiche Auflösung müsste man dann allerdings doppelt so lang
> zählen,

mh, das ist schonmal auch nicht soo toll, denn ich habe insgesamt 4 Sensoren,
die ich sowieso schon multiplexen müßte. Wenn ich dann noch immer mindestens
2sek. warten muß... Mh, schneller wäre besser... ;-)

> oder den externen Zählerstand am Ende einlesen und entsprechend
> hizufügen.

Hm, wie würde das gehen?

Gruß,
Martin

Martin Müller

unread,
Feb 24, 2003, 1:38:08 PM2/24/03
to
Jan Schomerus schrieb:

> Die externe Clock-Source für den Counter darf maximal die
> halbe Taktfrequenz haben, besser f_T/2.5, sonst zählt er
> nicht mehr richtig.

> D.h. du bräuchtest eine Taktfrequenz von etwa 25 MHz, um
> dein Sensorsignal korrekt erfassen zu können. Maximum ist
> laut Datenblatt 16 MHz.

:-((
Tja, das hatte ich noch gar nicht gelesen... Und dabei betreibe ich ihn im
Moment sogar "nur" mit 3,86MHz...

:-((

Martin

Martin Müller

unread,
Feb 24, 2003, 1:43:49 PM2/24/03
to
Jan-Hinnerk Reichert schrieb:

> Was willst Du genau tun?

Ich möchte Quarz-Sensoren auswerten, die um die 10MHz schwingen und diese
Frequenz in Abhängigkeit von äußeren Einflüssen um wenige Hz ändern.

> Ich lese das jetzt als:
> Du hast ein 10MHz +/- irgendwas, und willst irgendwas bestimmen, indem Du
> eine Zeit lang zählst...

Genau, ich möchte die genaue Frequenz bestimmen. Und dafür möglichst nicht
allzu lange warten (insgesamt habe ich nämlich 4 Quarze, die ich ja auch
multiplexen müßte...)

> BTW: Sowohl low als auch high Deines clk-Signals müssen mindestens einen
> Systemclock-Zyklus lang sein, d.h. allerhöchstens 8MHz ;-(

Ja, schade...

> BTW: 1Hz Auflösung ist nicht dasselbe wie 1Hz Genauigkeit.

Oh, stimmt, meinte Genauigkeit :-)

Also gibt's noch andere Möglichkeiten?

Gruß,
Martin

Volkmar Dierkes

unread,
Feb 24, 2003, 2:58:15 PM2/24/03
to
On Mon, 24 Feb 2003 19:43:49 +0100, Martin Müller wrote:

>> BTW: 1Hz Auflösung ist nicht dasselbe wie 1Hz Genauigkeit.
>
> Oh, stimmt, meinte Genauigkeit :-)
>
> Also gibt's noch andere Möglichkeiten?

Mußt Du die Genauigkeit als Absolut-Wert erzielen? Übliche
Oszillatoren, mit denen zB ein AVR betrieben wird, haben so 100ppm,
d.h. bei 10MHz gibt das eine Abweichung von 1KHz. Selbst wenn Du
temperaturkompensierte o.ä. verwendest, wird es schwierig und
zumindest teuer um in Deinen gewünschten Bereich zu kommen.

Du hattest in einem anderen Thread geschrieben:

| denn ich habe insgesamt 4 Sensoren,

Mußt Du einen Vergleich zwischen diesen Sensoren machen, oder alle
in Bezug auf eine Referenz bestimmen? Bei ersterem macht der o.g.
Fehler nicht so viel aus.

Volkmar

Markus Mandl

unread,
Feb 24, 2003, 4:30:18 PM2/24/03
to
Martin Müller wrote:

>

........................

> Also gibt's noch andere Möglichkeiten?
>
> Gruß,
> Martin

Hallo Martin,

spontan fallen mir noch zwei weitere Moeglichkeiten ein:

1. Die benoetigeten Zaehler koennen mit der zugehoerigen Start/Stop-Logik
in einem CPLD (Altera,Xilinx,Lattice etc) realisiert werden. Dem Prozessor
verbleibt dann nur mehr die Aufgabe, die Zaehlung zu starten und nach
Beendigung des Zaehlvorgangs die Zaehlerstaende auszulesen.

2. Prinzipiell ist es auch moeglich die Frequenz "analog" zu messen indem
man einen Kondensator mit einem konstanten Strom waehrend einer Periode
oder Halbwelle laedt. Der Ladestand wird dann mittels eines A/D-Wandlers
gemessen.
Typischerweise wird man dieses Verfahren in Kombination mit einem
Zaehlverfahren einsetzen und nur den letzten Takt, der von der Torzeit
"abgeschnitten" wird, auf diese Art vermessen. Dadurch liese sich die
Torzeit (theoretisch) mit einem 8bit-Wandler auf 1/256 senken.

Gruss,
Markus

Steffen Braun

unread,
Feb 24, 2003, 3:22:59 PM2/24/03
to
1Hz Genauigkeit läßt sich mit einem "ungenauen" 16MHz - Quarz wohl nicht
messen.Das AVR-Quarz sollte mindestens eine Größenordnung stabiler laufen
wie die zu messenden Quarze - oder?

Es läßt sich doch auch nicht mit einem Zollstock die Genauigkeit einer
Meßschraube bestimmen!

Steffen


Markus Mandl

unread,
Feb 24, 2003, 4:54:39 PM2/24/03
to
Steffen Braun wrote:

Ich habe auch nie behauptet/empfohlen den Prozessortakt als Referenz zu
verwenden. Mit einem genaueren Zollstock steigt natuerlich auch die
Wahrscheinlichkeit bessere Messungen zu erziehlen...

Gruss,
Markus

Juergen Hannappel

unread,
Feb 24, 2003, 3:37:27 PM2/24/03
to
Martin Müller <martin....@iws.uni-stuttgart.de> writes:

> Jan-Hinnerk Reichert schrieb:
>
> > Was willst Du genau tun?
>
> Ich möchte Quarz-Sensoren auswerten, die um die 10MHz schwingen und diese
> Frequenz in Abhängigkeit von äußeren Einflüssen um wenige Hz ändern.

Nimm einen Oszillator mit einer festen Frequenz, z.b. 8 MHz, mische
diese Frequenz mit den 10MHz und zaehle die Differenzfrequenz, also
2MHz um wenige HZ geaendert...
Oder noch besser einen Oszillator mit 9.9MHz, die 100Khz sind dann
kein Problem mehr, den AVR solltest Du dann mit dem stabilen
Oszillator takten (und fuer den genuegned Aufwand treiben!)
--
Dr. Juergen Hannappel http://lisa2.physik.uni-bonn.de/~hannappe
mailto:hann...@physik.uni-bonn.de Phone: +49 228 73 2447 FAX ... 7869
Physikalisches Institut der Uni Bonn Nussallee 12, D-53115 Bonn, Germany
CERN: Phone: +412276 76461 Fax: ..77930 Bat. 892-R-A13 CH-1211 Geneve 23

Falk Brunner

unread,
Feb 24, 2003, 3:50:01 PM2/24/03
to
"Juergen Hannappel" <hann...@lisa2.physik.uni-bonn.de> schrieb im
Newsbeitrag news:x18yw51...@lisa2.physik.uni-bonn.de...

> Nimm einen Oszillator mit einer festen Frequenz, z.b. 8 MHz, mische
> diese Frequenz mit den 10MHz und zaehle die Differenzfrequenz, also
> 2MHz um wenige HZ geaendert...
> Oder noch besser einen Oszillator mit 9.9MHz, die 100Khz sind dann
> kein Problem mehr, den AVR solltest Du dann mit dem stabilen

Naja, ich würde die Prescaler-Variante bevorzugen.

> Oszillator takten (und fuer den genuegned Aufwand treiben!)

Aber bitte nicht das Fahrrad neu erfinden. Stabile Oszillatoren (TCXO, OCXO)
gibts fertig, wenn auch nicht für 3,50 in der Apotheke.

--
MfG
Falk


jetmarc

unread,
Feb 24, 2003, 6:15:36 PM2/24/03
to

Also Dein AVR Timer reicht dafuer leider nicht aus, da er den Eingang
mit dem AVR-Takt synchronisiert. Du brauchst entweder einen Vorteiler
(74HC) was sich aber auf die Genauigkeit auswirkt. Oder Du lagerst
die ganze Erfassung nach aussen, zB in ein CPLD. Ein Kollege hat das
schon mal erfolgreich so gemacht. Damals mussten nicht 10 MHz erfasst
werden, sondern Impulse, die in Bursts von bis zu 10 MHz eintreffen
koennen. Es war besonders wichtig, alle Impulse exakt zu zaehlen,
weshalb ein Vorteiler ausschied.

Marc

Ulrich Lukas

unread,
Feb 25, 2003, 3:09:27 AM2/25/03
to
Hi!


Du kannst auch einfach genau die 65536 Eingangsimpulse zählen, bis der
16-Bit-Zähler überläuft. (Wenn der die 10 MHz mitmacht) Das würde ohne
Vorteiler rd. 6,6 ms dauern. Wenn Du dann dabei mit dem zweiten
16-Bit-Zähler den heruntergeteilten Prozessortakt misst (z.B. 1MHz bei
16MHz Quarztakt), dann kannst Du die Zählerstände vergleichen und das
Ergebnis berechnen.

Du hast zwar nur noch knapp 13 Bit Auflösung, aber eben schon alle
6,5536 ms ein Ergebnis vorliegen. Wenn Du dann die Messwerte über einige
zig-Male mittelst, oder einen höheren Referenztakt nimmst, stimmt die
Auflösung eh wieder besser. Nur über die Genauigkeit des Prozessortaktes
kommst Du natürlich nicht.

Das ganze nennt sich übrigens Verhältnismessung.


Gruß,
Ulrich Lukas

Axel Schwenke

unread,
Feb 25, 2003, 5:35:31 AM2/25/03
to
In article <3E5A67E5...@iws.uni-stuttgart.de>,
Martin Müller <martin....@iws.uni-stuttgart.de> writes:

> Ich möchte Quarz-Sensoren auswerten, die um die 10MHz schwingen und diese
> Frequenz in Abhängigkeit von äußeren Einflüssen um wenige Hz ändern.

Aha. Dann solltest du dir unbedingt mal das mit dem "Mischen mit
konstanter Frequenz" ansehen. Bei deinen Genauigkeitsanforderungen
von 0.1ppm (1Hz auf 10MHz) brauchst du sowieso einen temperatur-
stabilen externen Oszillator.

Außerdem ist

> ... ich möchte die genaue Frequenz bestimmen. Und dafür möglichst nicht


> allzu lange warten (insgesamt habe ich nämlich 4 Quarze, die ich ja auch
> multiplexen müßte...)

dann ebenfalls einfacher hinzubekommen.

Eine weitere Alternative wäre, den ganzen Kram in ein PLD zu packen.
Dazu müßtest du diverse Zähler (z.B. 1x Referenzfrequenz, 4x f1..f4)
hinreichender Länge (z.B. 32 Bit) die Torlogik und eine Mimik zum
Auslesen (seriell?) der Zählerstände vorsehen.

Die Messung erfolgt dann nach dem Reziprok-Zähler-Prinzip. Zwei Zähler
für Eingangs- und Referenzfrequenz laufen dabei gleichzeitig und
synchron zum Eingangssignal. Die unbekannte Eingangsfrequenz kann man
dann aus den Zählerständen und der Referenzfrequenz ausrechnen:

n_x
f_x = f_ref * -------
n_ref

Vorteil dabei: du kannst dein Eingangssignal in kurzer Zeit genauer
messen als mit asynchroner Torung.

Beispiel: f_x ~ 10MHz, f_ref = 100MHz. Wir messen ca. 0.1 Sekunde lang
und halten das Tor synchron zu f_x, messen also eine ganzzahlige Anzahl
(sagen wir mal 1Mio) Perioden von f_x. Der Referenzzähler zählt dabei
ca. 10Mio Impulse. Durch die Asynchronität der Torzeit mit der Referenz
haben wir den üblichen +/- 1 Fehler, wegen der 10Mio Impulse bleibt
*dieser* Fehler allerdings innerhalb der geforderten 0.1ppm. Wir messen
also ~10MHz in 0.1s auf ca. 1Hz genau.

XL
--
Das ist halt der Unterschied: Unix ist ein Betriebssystem mit Tradition,
die anderen sind einfach von sich aus unlogisch. -- Anselm Lingnau

Thiemo Stadtler

unread,
Feb 25, 2003, 8:41:40 AM2/25/03
to
On Mon, 24 Feb 2003 19:43:49 +0100, Martin =?iso-8859-1?Q?M=FCller?= <martin....@iws.uni-stuttgart.de> wrote:
> > BTW: 1Hz Auflösung ist nicht dasselbe wie 1Hz Genauigkeit.
>
> Oh, stimmt, meinte Genauigkeit :-)

1Hz bei 10MHz sind < 1e-7 rel. Fehler!

Bei einem Frequenzzähler brauchst Du dann zwangsläufig
eine lange Meßzeit. Für 1 Hz Genauigkeit mußt Du bei
idealer Zeitbasis schon mindestens 2 Sekunden messen.
Die Zeitbasis müsste dann auf <0.1us genau sein.

Wenn Du andererseits die Zeit misst, bis z.B. 65000 Takte aufgelaufen
sind, benötigst Du mindestens eine auf 0.65ns genaue Uhr.

Beide Verfahren sind bei Deiner Vorstellung von Genauigkeit
völlig ungeeignet.

Du kannst versuchen das Signal mit einer Referenz (analog) zu mischen.

Anderer Vorschlag: Du nimmst einen schnellen DSP, Referenz und
Testsignal jeweils an einen Interupteingang, pro Referenzinterrupt wird
ein Zähler um eins heruntergezählt, pro Testinterrupt wird der gleiche
Zähler heraufgesetzt. Nach definierter Zeit ließt Du den Zähler aus und
hast damit die Differenz der beiden Frequenzen. Um auf 1 Hz Genauigkeit
zu kommen, musst Du auch hier 2 s messen, allerdings ist die
Zeitbasis unkritisch. Das Verfahren sollte auch auf einem FPGA
funktionieren.


Thiemo

Falk Brunner

unread,
Feb 25, 2003, 1:52:11 PM2/25/03
to
"Thiemo Stadtler" <DerSt...@gmx.de> schrieb im Newsbeitrag
news:1104_1046180500@pc58...

> 1Hz bei 10MHz sind < 1e-7 rel. Fehler!
>
> Bei einem Frequenzzähler brauchst Du dann zwangsläufig
> eine lange Meßzeit. Für 1 Hz Genauigkeit mußt Du bei
> idealer Zeitbasis schon mindestens 2 Sekunden messen.

?? Wieso mus er bei 10 MHz bei einer Genauigkeit von 1 HZ 2 Sekunden messen?
Ich würde mal sagen 1 Sekunde reicht.

> Die Zeitbasis müsste dann auf <0.1us genau sein.

Ist sie bei jedem halbwegs brauchbaren Frequenzzähler.

> Wenn Du andererseits die Zeit misst, bis z.B. 65000 Takte aufgelaufen
> sind, benötigst Du mindestens eine auf 0.65ns genaue Uhr.
>
> Beide Verfahren sind bei Deiner Vorstellung von Genauigkeit
> völlig ungeeignet.
>
> Du kannst versuchen das Signal mit einer Referenz (analog) zu mischen.
>
> Anderer Vorschlag: Du nimmst einen schnellen DSP, Referenz und
> Testsignal jeweils an einen Interupteingang, pro Referenzinterrupt wird
> ein Zähler um eins heruntergezählt, pro Testinterrupt wird der gleiche
> Zähler heraufgesetzt. Nach definierter Zeit ließt Du den Zähler aus und

BOOOM. Wieder mal mit ner Kannone nen Spatz erschossen.

> hast damit die Differenz der beiden Frequenzen. Um auf 1 Hz Genauigkeit
> zu kommen, musst Du auch hier 2 s messen, allerdings ist die

Na toll, und dafür nem ich den tollen Mischer, DSP und restlichen Pipapo, wo
es ein einfacher Frequenzzähler mit stabiler Referenz (GPS??) auch tut.
Eieieie, warum einfach, wenns auch umständlich geht.

--
MfG
Falk


Vitor Ribeiro

unread,
Feb 27, 2003, 1:59:11 AM2/27/03
to

Nimm doch einfach einen PIC. Habe einen PIC873 als Frequenzzähler bis
30MHZ mit einem Widerstand als einzigem externen Bauteil im Einsatz. Die
Dinger haben einen asynchronen Prescaler vor einen internen Timer. Der
Prescaler kann, fall ich mich recht erinnere, bis ca 40MHz verkraften. Sein
Überlauf liefert den Clock für den internen Zähler. Ist alles in einer
AppNote von Microchip beschrieben. Suche auf der Microchip Webseite nach der
AppNote "AN592 - Frequency Counter using Pic16C5x".

Gruß

Vitor


--
++++++++++++++++++++
Warnung:
Alle Fehler in der Rechtschreibung sind gewollt und urheberrechtlich
geschützt.

0 new messages