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
> 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
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
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
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
> 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
> 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
> 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
> 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
>> 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
>
........................
> 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
Es läßt sich doch auch nicht mit einem Zollstock die Genauigkeit einer
Meßschraube bestimmen!
Steffen
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
> 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
> 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
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
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
> 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
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
> 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
Gruß
Vitor
--
++++++++++++++++++++
Warnung:
Alle Fehler in der Rechtschreibung sind gewollt und urheberrechtlich
geschützt.