www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Avr-Frequenzzähler+Überlegung


Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Ich habe mir gerade überlegt, daß man Frequenzbereich eines Zählers mit
AVR´s nicht einfach erweitern kann, in dem man Vorteiler davor setzt.
Wenn ich den mit 20Mhz takte, kann ich bestenfalls bis 10 Mhz direkt
zählen.
Angenommen, ich hätte einen 16:1 Teiler davor, dann wird meine
angezeigte Frequenz (bei sagen wir 100Hz) nur 96Hz sein.
(100Hz/16=6,25Hz abgerundet auf 6Hz*16 ergibt 96Hz). Das ist eine
Ungenauigkeit von 4%.

Meine Idee wäre ein externer Zähler der ebenso wie der interne Timer1
(als Counter)65536 Schritte zählen kann. Wenn ich dessen Zählerstand
über 2 Ports einlese(muß ich ja, denn das Ding ist ja dann 16 Bit
breit)und dann drin die 2 Bytes "zusammenschiebe", müßte ich doch
auf´s Hertz genau messen können?
In der Not würde ich 4 Stück D193 oder etwas etwas Schnelleres
kaskadieren.

....oder liege ich komplett falsch?

MfG Paul

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Paul,

D193 ??? Hatten wir zu DDR Zeiten. Habe damals schon 093 benutzt.
193 hat so viel Strom geschluckt....
Also bin ich auch ein O....
Aber das ändert ja nichts am Fankt.
Der Zähler vor dem IC muß ja gestartet und gestoppt werden.
Also mußt Du natürlich bei Vorzähler die "Torzeit" entsprechend
dem "vorzähler" zB./10 verkürzen.
 Auf zB. 1/10 von "normal" wenn der Teiler /10 teilt.
Oder ohne Änderung der Torzeit, das Ergebnis mit 10 multiplizieren.

Schau mal bei www.sprut.de vorbei.
Ist zwar Pic, aber das Prinzip bleibt das gleiche

So denn

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Fehler ist, Du denkst noch in alten Schaltkreisgräbern.

Der MC kann rechnen, also ist es ein einfaches, immer genau mit den
Flanken des Eingangssignals zu messen und dann in Frequenz
umzurechnen.

Dann nimmt Dir ein Vorteiler kein Fitzelchen an Genauigkeit.


Für kleine Frequenzen (<16Hz) ist es natürlich sinnvoll, den Vorteiler
überbrücken zu können, aber das geht ja mit dem 74HC193 sehr einfach.


Peter

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut, also werde ich es mit Vorteiler machen. Wenn der Meßwert einen
bestimmten Betrag unterschreitet, kann ich ihn "überbrücken" lassen.

@Peter
Ich denke aber schon, daß der Vorteiler mir die Auflösung "stiehlt".
Man sieht in vielen Veröffentlichungen, daß 2 Eingänge vorgesehen
werden, einmal mit Vorteiler, einmal ohne um direkt in den Professor
einzuspeisen. Wegen der Genauigkeit.
Das wollte ich mit meiner obigen Idee umgehen.

Tja, ich habe hier noch Unmengen von alten Schaltkreisen, von denen
ich bei etlichen die Funktion noch aus dem Kopf kenne. Ein "Hoch"
auf das HFO! :-))

MfG Paul

Autor: Hagen (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi

die Schaltung im Attachment habe ich selber schon so aufgebaut.

Der 74HC4060 ist der Vorteiler. An seinen Q-Ausgängen schließt man den
AVR am T1 oder T2 Eingang an, je nach gewünschtem Teilerfaktor. Der
4060 taktet also den Timer 1 oder Timer 2 über dessen externen
Takteingang.

Der 4060 selber wird gefüttert über 2 NAND Gatter. An IN kommt unser zu
messendes Signal rein. Über ENABLE=HIGH und FLUSH=HIGH wird dann damit
der 4060 getaktet. ENABLE und FLUSH kommen ebenfalls an 2 Pins des
AVRs. Wenn ENABLE=LOW ist kann man über das Takten von FLUSH per AVR
den 4060 weiter zählen lassen.

Eine Messung sieht nun so aus:

1.) ENABLE = LOW und FLUSH = getaktet per AVR so lange bis T1 auf HIGH
geht und wieder auf LOW schaltet.

2.) Timer 1 (16 Bit) im AVR wird extern getaktet über T1 und auf 0
gesetzt

3.) Timer 2 im AVR wird auf eine entsprechende Zeitbasis initialisiert,
zb. 100ms

4.) ENABLE = HIGH und FLUSH = HIGH. Nun wird der 4060 über IN
getaktet.

5.) nachdem Timer 2 nach zb. 100ms abgelaufen ist wird ENABLE=LOW
gesetzt

Nun haben wir im Timer 1 die Anzahl der Takte an IN / 2^x stehen. 2^x
ist der Teilerfaktor des 4060. Wir müssen nun den 4060 zurücksetzen auf
0 und gleichzeitig ermitteln wie groß der Rest an Takten am IN EIngang
war.

Dazu ENABLE = LOW setzen und FLUSH wieder so lange Takten bis T1 auf
HIGH geht. Wir zählen die dazu notwendigen Takte im AVR per Software
mit. Dieser Wert kann nun umgerechnet werden mit IN_TAKTE = (Timer1 +1)
* 2^x - Anzahl Takte an FLUSH bis T1 = HIGH ist.

Im Grunde erweitern wird das 16 Bit Register des Timer 1 im AVR extern
um x Bits im 74HC4060. Wenn der Teilerfaktor des 4060 zb. 256 ist ==
2^8 dann wäre unser viertuelles Timer 1 Register defakto 24 Bit groß.
16 Bits im AVR + 8 Bits im 4060.

Durch die vorgeschalteten NAND Gatter haben wird nun die Möglichkeit
den 4060 per AVR zu takten und somit auch die Chance dessen Register
Inhalt "auszulesen".

Gruß Hagen

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich mache das gerade mit einem 74HC590, hat für mich 2 Vorteile:
er hat ein Ausgangs-Latch, ich kan den Datenport zum Einlesen also auch
noch für andere Dinge nutze (ext. ADC), weiter kann man bei geschickter
Zusammenschaltung der Steuerleitungen des 590 (CNT_OE und CNT_CLR
zusammen und CNT_CE mit CNT_STR zusammen) mit 2 Portbits die Steuerung
komplett erledigen. Mit CNT_OE/CNT_CLR wird das Ausgangslatch mit dem
gezähliten Zählerstand vom AVR eingelesen und gleichzeitig der Zähler
auf 0 gesetzt (nur der Zähler, nicht das Latch behält den Zählwert).
Zum Zählen wird mit CNT_CE/CNT_STR ab der H/L-Flanke bei Low gezählt.
Am Ende der Torzeit geht CNT_CE/CNT_STR auf H, der Takteingang ist
gesperrt und mit der L/H-Flanke wird der Zählerstand ins Ausgangs-Latch
übernommen.

Kürzer habe ich es noch nicht hinbekommen. ;)

Gruß aus Berlin
Michael

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Michael:

wenn ich deine Verschaltung richtig verstanden habe dann benötigst du
aber 2 Pins als Steuerleitung und 8 Pins um den Zählerstand auslesen zu
können. Das sind 8 Pins zuviel ;)

Gruß hagen

Autor: Holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mahlzeit,

ich habe einen 32 Bit-Zähler in einen CPLD programmiert. Davon habe ich
zwei. Der eine zählt die Frequenz eines OCXO, der andere die zu zählende
Frequenz. Durch Doppelzählung entfällt die exakte Torzeitlänge! Ein
weiterer Vorteil ist, dass der auswertende µC lediglich Start, Stop,
Reset und eben die Zählerstände abfragen muss und somit Zeit für andere
Spielereien hat :-)

Ein XL9572-15 schafft mindestens 100MHz. Torzeitlängen >30 Sekunden
sind auch drin!


Holger

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Hagen
Gute Idee und vor allem gute Erklärung der Funktion. Ich denke aber,
daß der 4060 zu langsam ist, um z.B. bis 100Mhz zu messen. Ich habe
noch welche hier und eben mal mit einem 80 Mhz-Generator geguckt.
Da kam nur noch Unfug aus dem 4060. :-(

@Michael
Das ist es, was ich meine. Ich habe im Datenblatt gesehen, daß man
den 590 auch vom Bus "hochnehmen" kann. Da würde man mit einem Port
des Prozessors für die Daten reichen.
Kannst Du mal Dein Programm schicken? (Hoffentlich nicht in C), bin
alter Bascom Freak. Aber Zeit spielt ja dann keine Rolle, wenn der
eigentliche Zähler "draußen" dran ist.

Mfg Paul

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, der 590 kann gerade mal bis 24 MHz getaktet werden, der 4060 aber
bis 80Mhz laut Datenblättern.

Als NAND Gatter benutze ich den 74HC132, das ist ein Quad NAND Schmitt
Trigger. Damit bin ich bis auf 50Mhz gekommen, reichte mir damals aus,
weil der Frequenzzähler-Part nur ein zusätzliches "Gimmeck" war.
Hauptanwendungszweck war die Messung von Kapazitäten und
Induktivitäten.

Gruß Hagen

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Hagen
Da muß ich mal sehen, ob ich einen anderen 4060 auftreibe. Das war hier
ein V4060 aus DDR-Produktion. Vielleicht gibt es HC Typen.
Womit hast Du Dein Programm geschrieben?

MfG paul

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verwende immer einen AHC oder AC4040, oder was ich sonst so an
schnellen Teilern da habe. Die machen problemlos 50MHz und das reicht
für die meisten üblichen Schaltungen.
Mehrere Ausgänge davon gehen auf einen 8zu1 Multiplexer, so dass der UC
sich das beste Signal aussuchen kann:
Dazu stellt er vor der Messung den Auswahlschalter auf maximales
Teilerverhältnis, misst kurz die Frequenz und wählt dann abhängig von
der sehr ungenau gemessenen Frequenz den Teiler für die richtige
Messung aus.
Allerdings sollte man den Messbereich des AVRs nicht voll ausnutzen,
denn wenn das Tastverhältnis nicht 50% beträgt, wird der Messbereich
kleiner, da die kurzen Impule dann nicht mehr erkannt werden. Ich
schalte daher schon ab 100kHz auf Teilerfaktor 2 um. 5 Stellen
genauigkeit reichen für einen einfachen Frequenzzähler mit Quarz als
Zeitbasis.
Daher kann man den Vorteiler auch immer laufen lassen, und kann dessen
Werte ignorieren, denn der Fehler des Quarzoszillators ist größer als
die 24bit Auflösung die alleine der uC interne Zähler liefert.

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

@Hagen
ich habe noch nicht probiert, was wirklich mit dem '590 geht.
Prinzipiell reichen mir im Moment auch 20MHz.
Schneller würde ich es für mich dann eher mit einem Vorteiler :4
machen. Die Stellen brauche ich da sowieso nicht, dazu ist die
Zeitbasis (16MHz-Quarz am ATMega) sowieso zu ungenau.

@Paul Baumann
Ja, 2 Steuerleitungen und den Datenport.
Am Datenport hängen bei mir sowieso noch ein ADC0820 für Speicheroszi
und Spannungsmessung, ein 74HCT373 für Logikanalyzer, ein 74HCT137 für
die Bereichsumschaltung mit DIL-Relais, Datenport eines 240x128-Pixel
Display und 8k externer Ram (ATMega8515).
Sind alle Tri-State-fähig, es wird also jeweils nur der passende
Baustein aktiviert.

Source wäre kein Problem, ist Assembler.

Prinzipiell: 16Bit-Counter auf 0, Zählen von ext. Impulsen (da hängt
der Übertrag des '590 dran). Dann CNT_CE/CNT_LE auf L
- Hier startet die Zählung
- Torzeit abwarten (bei mir ein Loop mit bekannter Taktzahl)
- CNT_CE/CNT_LE auh H, jetzt übenimmt der '590 den Zählerstand ins
Latch

16Bit Counter-Daten holen (Byte2 und Byte1 des Ergebnisses)
- CNT_OE/CNT_RE auf L, jetzt liegen die Latch-Daten am Port an
(Der Zähler wird hier schon wieder auf 0 gesetzt für die nächste
Zählung)
Einlesen '590 Wert als Byte 0
- CNT_OE/CNT_RE wieder auf H, Zählerport ist wieder frei

Gruß aus Berlin
Michael

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Michael
Danke für die Erklärung der Funktion. Ich werde mir mal einen
Ablaufplan machen und dann mal sehen, ob ich dem Prozessor meine
Absichten klarmachen kann. :-)

Im Moment habe ich hier eine Schaltung mit 2 74F74 und Attiny
2313(20Mhz) dahinter. Das funktioniert bis ca.97 Mhz einwandfrei, aber
die Auflösung ist eben durch den 16:1 Teiler zu ungenau und ich
muß über ein Gatter einen 2. Eingang direkt in den Countereingang
des Professors basteln. Das wollte ich vermeiden.

Gut, da versuch ich es mal mit den 2 74HC590, die hier liegen.

MfG Paul

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bei üblichen Quarzen stimmen bei 100MHz die letzten 3-4 Stellen sowieso
nicht mehr...
Selbst Vergleiche zur Stabilität der Frequenz bringen nichts, da man
nicht weiß, ob die Quelle oder die Torzeit weggelaufen ist.

0,005% sind etwa erreichbar ohne Ziehtrimmer und Kalibrierung.
Sind bei 100MHz also rund 5kHz Fehler...

100MHz auf 100Hz genau zu zählen, erfordert eine Zeitbasis, die auf
10Hz, besser auf 1Hz genau ist. Woher nehmen, womit eichen, wie stabil
bekommen? Es ist nur vorgetäuschte Genauigkeit, die man so erreicht und
wenn man sich der Fehlergrenzen nicht bewußt ist, verführt es zu
tagelanger Fehlersuche, wo garkein Fehler ist. :)

Gruß aus Berlin
Michael

Autor: alfsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#paul
will auch nen counter bauen, habe mir schon das konzept überlegt:
avr, tiny2313 od mega48, hc4020, tsa5511, lcd display.
in a: 1hz...50Mhz, in b: 50Mhz...1Ghz
wenn du willst, bzw auch wer sonst interessiert ist, machen wir
teamwork : alfsch<at>freenet.de

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Michael
Da hast Du auch wieder Recht mit der Genauigkeit. Also mit dem 590
kriege ich ein Signal von 97 (mehr habe ich nicht) sauber geteilt.
(oszi)

@Alfsch
Zu spät :-) Ich mache es so, wie Michael vorschlug, da ich die
Schaltkreise da habe.

Von ganzem Hertzen :-)
Paul

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.