Forum: Mikrocontroller und Digitale Elektronik Frequenzzählung möglichst sparsam mit 2313


von Alexander (Gast)


Lesenswert?

Hallo Leute,
bin gerade dabei einen Funktionsgenerator mit dem XR2206 oder XR8038 zu
bauen. Das eigentliche Problem betrifft aber die Anzeige der Frequenz
auf dem Display. Eine Frequenzmessung ist eigentlich recht leicht aber
ich möchte kein "Gatter-Grab" anlegen.
Meine erste Idee war der 12-bit Zähler 4040, dann 2 Schieberegister (4
Pins bleiben wohl frei oder aufrüstbar), die das in den AVR 2313
reinschieben.
Ausgangsseitig ein MUX 4051 (liegt grad rum) für die 5(?) Ziffern und
ein 74xx164 für die Segmente, danach jeweils Treiber.
Dann hab' ich im Netz das hier gefunden:
http://hem.passagen.se/communication/freqcount.html
Der Unterschied der Schieberegister 4014 zu meinen (74xx165) ist
irgendwie fast null. Die kaskadierung spart aber Portpins.
Das nächste Projekt ist schon ziemlich genial:
http://www.myplace.nu/avr/countermeasures/index.htm
Der Zähler 74xx590 hat 3-state Ausgänge und ein Ausgangsregister, damit
kann man die Portpins mehrfach verwenden, spart Schieberegister am Ein-
und Ausgang!
Leider gibt's den 590er bei Reichelt als LS zum Sparpreis von 4,05€,
als HC auch nur in DIL, bei Conrad eine SMD Version, die ich garantiert
bestellen muß.
Kennt jemand vielleicht eine Alternative zum dem 590er? Irgendwas mit
mehr als 8 bit. Ansonsten ist mir nämlich keine sparsamere Variante
eingefallen. Man könnte höchstens einen 590er einsparen und
softwaremäßig die 16bit Zählerstand erreichen.
Bei meiner ersten Version wird's langsam blöd, auf der Platine alles
zu verdrahten...

von Michael (Gast)


Lesenswert?

Suche doch 'mal nach:

reziproker frequenzzähler at90s2313

von Hannes L. (hannes)


Lesenswert?

Schau dir die AVR-Timer/Counter mal genauer an. Die lassen sich nämlich
auch als Counter mit einem I/O-Pin hochzählen.
Dann noch in regelmäßigen Abständen den Counterstand abfragen und
daraus die Frequenz errechnen. Wenn man das Abfrage-Intervall sinnvoll
auswählt, kann die Rechnerei recht trivial werden. Da bleibt dann auch
noch Kapazität für die Ansteuerung eines LCD oder einer mehrstelligen
7-Segment-Ziffernanzeige (Multiplexbetrieb) übrig. Und das alles in
einem Chip, der kaum Ansprüche an die Platine stellt.

...

von Alexander (Gast)


Lesenswert?

Ja, das mit dem Interrupt auf dem Timer Pin ist mir bewußt. Ich hatte
einfach Angst, daß das nicht so genau hinhaut. Also Du meinst, daß der
16-bit Timer einfach bei jeder steigenden Flanke hochzählt. Da das
Signal eh vor der Endstufe des Generators kommt, also um die 0V
herumschwankt, dürfte die Aufbereitung mit nem LM358 oder LM393
genügen.

Dann bei bestimmten Zählerständen überprüfen, wieviel Zeit vergangen
ist und eventuell die Torzeit verlängern (Autorange). Das Problem ist
evtl, daß nur ein 16-bit Timer vorhanden ist, zur Zeitmessung oder
Taktzählung muß dann der Überlauf softwaremäßig gehandelt werden.
Die Links sind übrigens nicht schlecht!

von Hannes L. (hannes)


Lesenswert?

Ich meinte aber keinen Interrupt auf einem Timerpin.

Ich meinte den Zähleingang T1, der als Taktquelle für Timer/Counter1
genutzt werden kann, ohne dass man dazu einen Interrupt braucht. Dies
macht dann die Hardware im Hintergrund, es wird nur der Vorteiler auf
externen Takt an Pin T1 (PD5 beim 2313) eingestellt.

Timer0 nutzt man dann für die Steuerung des Programms. Z.B Interrupt
alle 10ms, in dem der "Torzähler" gezählt wird, das
Anzeige-Multiplexing (falls 7-Segment-Ziffernanzeige) erledigt wird,
falls erforderlich Tasten abgefragt werden usw.
Bei Überlauf des Torzählers wird dann Timer1 ausgelesen, gelöscht und
der Wert zur Anzeige aufbereitet. Anhand des gemessenen Wertes kann man
auch die Torzeit variieren, z.B. langsame Frequenzen 1s, schnellere 10ms
bzw. 100ms, und dabei den Dezimalpunkt verschieben. Dies ermöglicht in
allen Bereichen eine brauchbare Auflösung.

...

von Alexander (Gast)


Lesenswert?

Oder so. Mein Layout sieht gleich besser aus!
Obwohl der andere Timer nur 8 bit hat, ist die Genauigkeit auch nicht
so gering, wenn man den Prescaler einsetzt.

von Peter Dannegger (Gast)


Lesenswert?

Ne feste Torzeit ist ungünstig bei kleinen Frequenzen.

Deshalb macht man üblicher Weise eine kombinierte
Frequenz-/Periodendauermessung:

Man zählt für etwa 500ms die Frequenz (input an T0) und dann wartet man
auf die nächste Flanke (input an ICP) und stopt damit die genaue Zeit
der Flanke.
Eine Multiplikation und Division später hat man dann die Frequenz.

Mehr als 4 Stellen braucht die Anzeige für einen RC-Generator nicht.


Hier mal ein Beispiel mit dem AT89C2051:

http://www.progforum.com/attachment.php?attachmentid=144


Peter

von Hagen (Gast)


Lesenswert?

@Hannes:

>>Ich meinte den Zähleingang T1... es wird nur der Vorteiler auf
>>externen Takt an Pin T1 (PD5 beim 2313) eingestellt.

Snip aus dem Datenblatt:

The synchronization and edge detector logic introduces a delay of 2.5
to 3.5 system clock cycles from an edge has been applied to the T1/T0
pin to the counter is updated. Each half period of the external clock
applied must be longer than one system clock cycle to ensure correct
sampling. The external clock must be guaranteed to have less
than half the system clock frequency (fExtClk < fclk_I/O/2) given a
50/50% duty cycle. The edge detector uses sampling, the maximum
frequency of an external clock it can detect is half the sampling
frequency (Nyquist sampling theorem). However, due to variation
of the system clock frequency and duty cycle caused by Oscillator
source (crystal, resonator, and capacitors) tolerances, it is
recommended that maximum frequency of an external clock source is less
than fclk_I/O/2.5.

An external clock source can not be prescaled.

End Snip.

1.) ein externer Clock an T1/T0 kann nicht den Prescaler benutzen
2.) ein externer Clock sollte mindestens 2.5 mal langsammer sein als
der Main Clock. Bei 16Mhz Takt kann man also nur maximal 6.4 MHz mit
T0,T1 messen.

@Alexander:

>> also um die 0V herumschwankt, dürfte die Aufbereitung mit nem LM358
>> oder LM393 genügen

Was schwebt dir da vor ?

Der LM393 Komparator benötigt ca. 1.5µs pro Flankenwechsel bei 5mV
Overdrive. Das beschränkt die maximal messbare Frequenz auf ca.
700KHz.

Ich arbeite nämlich zur Zeit an einem ähnlichem Problem, und komme mit
der analogen Inputlogik nicht so recht weiter. Ziel wäre es ein
beliebiges Taktsignal, sei es Rechteck oder Sinus mit DC Offsets zu
messen. Die minimale Amplitude sollte 1V betragen. Mit normalen
Logikgattern zb. LVS Reihe kommt man da nicht weit.

Mich würde also brennend interessieren wie man ein solches Signal so
aufbereiten kann das es mit größtmöglichem Meßbereich ein sauberes
Rechtecksignal für die nachfolgende digitale Logik liefert.

Zz. experimentiere ich mit dem LM319 Komparator der 80ns schafft.

Gruß Hagen

von Läubi (Gast)


Lesenswert?

Wie wäre es mit einem Eisntelbarem Vorteiler?

von Hannes L. (hannes)


Lesenswert?

@Hagen:

Ich hatte mich nicht präzise genug ausgedrückt, stimmt.
Aufgrund das zweiten Beitrags (Hinweis auf 2313) hatte ich mich auch
(fälschlicherweise) auf eine Lösung mit (Mega) 2313 eingeschossen.

Ich meinte natürlich das zuständige Controlregister des 16-Bit-Timers
mit den Bits für die Auswahl der Timer-Taktquelle. Dort wo der
"Vorteiler" eingestellt wird. Denn eine dieser Einstellmöglichkeiten
(mit den "Vorteiler-Bits") schaltet den Timer auf den Eingang T1. Der
Vorteiler hängt fest am Prozessortakt und kann daher natürlich
(zumindest beim 2313) nicht zwischen T1 und dem Zähleingang geschaltet
werden. Das hatte ich auch nicht gemeint.

Dass ich die Bits nicht konkret benenne hat damit zu tun, dass ich in
erster Linie Hilfe zur Selbsthilfe geben möchte, dem Fragenden also den
Blick ins Datenblatt nicht ersparen möchte. Er soll nur einen Tip
bekommen, wo es weitere Informationen gibt.

Dass die Taktfrequenz an T1 begrenzt ist, sollte aber akzeptiert
werden. Ein Frequenzzähler in LS-TTL oder CMOS (bei 5V) ist sicherlich
auch nicht schneller. Und ein professioneller (schneller)
Frequenzzähler kostet nicht umsonst richtig Geld. Aber das weißt du ja
alles selbst.

...

von Hagen (Gast)


Lesenswert?

@Hannes: war auch keine Kritik an deinem Posting, sondern nur eine
weitere Präzisierung der Möglichkeiten ;)

@Läubi:

>> Wie wäre es mit einem Eisntelbarem Vorteiler?

Der digitale Teil dürfte das geringste Problem sein. In die engere
Auswahl kommt bei mir der 74HCT4060 der bis 88Mhz läuft und den ich
gerade in der Bastelkiste finde.

Der analoge Eingangsteil macht mir die Probleme.

Gruß Hagen

von Alexander (Gast)


Lesenswert?

Also der 4060 hat zwar 14-bits aber nur 12 Ausgänge, deswegen wollte ich
den nicht verwenden.

@Hagen
Zum analogen Eingangsteil: Der LM358 liegt halt gerade rum, dachte der
geht schon. Zum Testen reichts jedenfalls.
Bei beliebigen Quellen muß der DC-Anteil weg, klar. Mein Problem ist
dann auch, daß ich negative Halbwellen bekomme. Wie krieg' ich die
weg?? Überspannung mit Z-Diode aber Unterspannung? Dachte, daß die
Z-Diode das übernimmt aber erst bei -0,6V. Ist halt nicht ganz
digital...
Ich seh' grad, daß sowas wie der NE529 geht. Schnell und TTL Ausgang.

Wegen der Geschwindigkeit: 10MHz Systemtakt sind beim 2313 drin. Ein
Vorteiler für höhere Frequenzen scheint mir bei den obigen Postings
sinnvoll. Im Programm müßte dann zuerst der Zählerstand des Teiles
abgefragt werden um dann bei niedrigen Frequenzen auf T1 umzuschalten.

Eine Frage hätte ich noch zum Ausgangsteil des Generators: Einfach
einen 50 Ohm Widerstand an den OP-Ausgang? Oder per Schaltung aus dem
Tietze/Schenk die Überstrombegrenzung einstellen. Leider ist dann der
rauschende Transistor dazwischen. Wahrscheinlich macht das nix aus.

von Hagen (Gast)


Angehängte Dateien:

Lesenswert?

Hi Alexander,

mein derzeitger Entwurf sieht so aus.

Ich benutze 2 74ACT163, das sind zwei synchrone binäre 4 Bit Counter
die kaskadiert sind. Sie teilen den takt für T1 eines ATMega8 auf 1/128
runter. Davor liegt ein 4fach NAND Gatterdas die Selektion des
Inputkanales übernimmt.

Der AVR setzt RUN_F auf H, FLUSH_F auf H und RUN_CL auf L. Nun kann von
der FREQUENCY Eingangslogik der Takt an die 4Bit Zähler durch.
Der AVR wartet nun eine Zeit und zählt 128'tel der Takte per T1 mit.
Dann setzt er RUN_F auf L Pegel, und taktet FLUSH_F solange selber
weiter T1 wieder auf 0 steht. Der AVR ermittelt also die Anzahl der
nötigen Takte bis der 8 Bit Zähler intern wirder auf 0 steht. Damit
haben wir also einen 16Bit Wert aus Timer1->T1 + 8Bit unterste Bit um
die Genauigkeit zu erreichen. Da der AVR über FLUSH_F den 8Bit Zähler
immer auf 0 inkrementiert fält die komplette zusätzliche Beschaltung
des Zählers recht simpel aus.

Als NAND benutze ich 74F00 und somit komme ich auf eine theoretische
maximale meßbare Frequenz von 140MHz.

Bisher habe ich den analogen Eingansteil noch sehr einfach aufgebaut
und weis eben nicht ob er funktonieren wird.

Gruß Hagen

von Alexander (Gast)


Lesenswert?

Also 2^8*(Zählerstand T1) + (2^8-Takte bis Überlauf 163)
ist die Wellenanzahl am Eingang. Das ganze durch die Zeit ist die
Frequenz.
Was der OP bei Dir macht weiß ich nicht. Ist das ein Tiefpaß? Was kommt
eigentlich bei C und L rein? Bei dem 163er Counter gibt's auch welche
in einem Gehäuse. 390 oder 393 glaub ich.
Bei dem analogen Eingangsteil brauchst Du für 140MHz aber einen
schnelleren Transistor. Wenn ich mich nicht verrechnet habe ist auch
der Eingangswiderstand bei 140MHz und 100pF nur 11mOhm, verstärkung ist
angesagt.
Schau mal bei ELV, deren Counter heit FC700x (7 oder 8) und hat einen
LT1016 als Komparator drin.

von Michael (Gast)


Lesenswert?

<<bin gerade dabei einen Funktionsgenerator mit dem XR2206 oder XR8038
zu bauen. Das eigentliche Problem betrifft aber die Anzeige der
Frequenz>>

Wieviel GHz kann man denn mit diesen F-Generatoren so erzeugen ?
Oder was soll die Diskussion über MHz-Eingangsstufen und Vorteiler ?
Oder raffe ich wieder etwas nicht ?

von Hagen (Gast)


Lesenswert?

@Alexander:

2^7 * T1, da ich ja am zweiten 4Bit Counter Q3 benutze um T1 zu takten.
Um nun nach einer Messung die Bits aus den Counter'n, sprich den Rest
der Messung ermitteln zu können (ohne das ich über Q0 bis Q7 wieder 8
Pins am opfern muß) taktet der AVR nun selber den Zähler. Dabei werde
ich so vorgehen: Ein 8Bit register auf 0 gesetzt. Nun wird solange
FLUSH_F getoggelt bis T1 auf1 geht. In dieser Schleife wird das 8Bit
register natürlich dekrementiert. Dann wird in einer zweiten Schleife
solange FLUSH_F getoggelt bis T1 von 1 auf 0 geht und das 8Bit register
wiederum dekrementiert. Dies benötigt also maximal 256
Schleifendurchläufe.

Gesamttakte wären dann T1 * 2^7 + 2^7 - Register / 2.


>> Was der OP bei Dir macht weiß ich nicht. Ist das ein Tiefpaß? Was
>> kommt eigentlich bei C und L rein?

Das ist ein LM319 dual Comparator. Er misst entweder die Kapazität oder
Induktivität. Den Schaltplan dazu findet man oft im WEB.

Den zweiten LM319 möchte ich wenn es klappt bei der ESR Messung
verbauen. Diese ESR Messung ist ebenfalls eine Kombination aus
verschiedenen Einzelschaltplänen aus dem WEB. Ich dachte mir das ich
eine Kombination als ELM Chang's Kapazitätsmessung (aber mit LM319
Komparator) + einem 100KHz Lock-In-Amplifier zu Milli Ohm Messung ein
ESR Messgerät hinbekommen könnte.

Das es andere fertige Chips gibt ist mir bewusst, aber bei diesem
Projekt verbaue ich NUR Bauteile die ich auch hier liegen habe.

Das Gerät wird mit > 5V aus einer Batterie oder Akku gespeist.
Es wird nur einen Schalter geben, nämlich einen Einschalttaster.
Möglich wird dies da ich den MAX8880 als Spannungsregler verbauen
werde. Der AVR schaltet also selbständig den MAX8880 in den Standby
Modus und das Boad verbraucht dann nur noch 1.5µA.

Die Buchsen sind 3.5mm Stereo Klinke mit Schaltern, von denen ich auch
noch einige rumliegen habe. Dabei werden die integerierten Schalter in
den Klinkenbuchsen benutzt um den AVR mitzuteilen was man messen
möchte. Es gibt also nur EINE Meßklammer die ich mir sprichwörtlich aus
einer Wäscheklanmmer gebastelt habe. Messen möchte ich hauptsählich
SMDs.

Anzeige könnte es 3 mögliche geben:

1.) RS232 + Windows Software
2.) Pollin LCD per I2C
3.) Nokia LCD per SPI, deshalb auch den ATMega16 als MCU.

Allerdings bin ich bis jetzt immer noch am konstruieren der Schaltung.
Immerhin habe ich noch nie sowas "kompliziertes" in Analogtechnik
gemacht.

Mein persönliches Ziel bei der ganzen Geschichte ist es eher mich zu
zwingen mit den Grundlagen der einzelnen Bauteile auseinanderzusetzen.
Dasa kann man wie an der UNI natürlich auch alles in reiner Theorie aus
Büchern, ich aber weiß das ich es nur begreifen kann wenn ich es
praktisch aufbauen muß. Das ist halt ein anderer Lernprozess.

>>Bei dem analogen Eingangsteil brauchst Du für 140MHz aber einen
>>schnelleren Transistor. Wenn ich mich nicht verrechnet habe ist auch
>>der Eingangswiderstand bei 140MHz und 100pF nur 11mOhm, verstärkung
>>ist angesagt.

Gut, da habe ich gleich ne Frage: Wenn ich die 100p auf 1n vergrößere
komme ich mit der max. Meßfrequenz von 140MHz noch hin ??

Den BC547 habe ich erstmal nur eingebaut weil er die richtige Bauform
hat. Im Datenblatt steht aber das er bis 300Mhz geht ??

Ich wollte einen C-Typ verbauen hFe >= 420 -800 ??


@Michael:

Mir geht es erstmal um eine Frequenzmessung, nicht Erzeugung. Und so
wie ich die Eingangsfrage verstanden hatte geht es Alexander auch nur
darum.

Gruß Hagen

von Alexander (Gast)


Lesenswert?

Ok, mit dem BC327 hab ich mich verdacht. Dachte, der ist viel
langsamer.
Hier auf S.9 ist was nettes: ELV MFG9001
UTZ100, S. 6 ist einfach und gut (wichtig ist die Diode Eingang-GND
damit bei negativen Spannungen nix abraucht)
Wegen der Eingangimpedanz bin ich mir auch nicht sicher. Würde halt wie
bei ELV zuerst nen Widerstand einbauen. C in die Leitung und dann R nach
GND ist doch ein Hochpaß. Den dann auf ein paar Hz einstellen. Bei
meinem Oszi wird's ähnlich sein. Wenn man die DC Spannung aufdreht,
folgt der Strahl bei AC Kopplung noch etwas.
Bei ELV raff ich die FET Verstärkerstufe nicht. Der komlizierte Eingang
muß aber nicht sein, beim UTZ100 ist es ganz passabel.
LC Meter kommt bei mir auch noch aber mit einem funktionierenden
Generator und Oszi brauch ich den net unbedingt. Am präzisesten geht's
über Meßbrücken aber mit manuellem Abgleich ist das ein ziemlicher
Scheiß.

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
Noch kein Account? Hier anmelden.