Forum: Mikrocontroller und Digitale Elektronik freqeunzzähler


von tobias hofer (Gast)


Lesenswert?

hallo

ich möchte mit einem ds89c420 einen frequenzzähler realisieren.
nun habe ich mir zwei möglichkeiten überlegt:
1. während einer festen zeit von 1s die anliegenden rechteck
   pulse zählen. das gäbe mir dann direkt die frequenz
2. den internen 16bit timer starten durch eine possitive
   flanke des rechteck. den timer stoppen durch die nächste
   possitive flanke des rechtecksignals.der timer wert        ergibt mir 
wiederum die frequenz.

ich möchte gerne frequenzen bis ca.25Mhz messen. mir ist klar das ich 
bei einer frequenz von 25Mhz einen vorteiler gebrauchen muss.

ich wollte nur einmal fragen ob jemand von euch schon einmal so etwas 
programiert hat, und wenn ja, welche variante würded ihr mir empfehlen?

weiss jemand vieleicht eine gute seite oder hat ein bsp. wie er das 
programiert hat?
(das ganze will ich in c-programieren)

besten dank
tobias

von Michael (Gast)


Lesenswert?

www.mino-elektronik.de/fmeter/fm_software.htm
und
www.mino-elektronik.de/fmeter/fmeterx.htm
wenn ich mich nicht vertippt habe.

von Peter D. (peda)


Angehängte Dateien:

Lesenswert?

Anbei mein Frequenzmesser, geht von 0,5Hz .. 125MHz.


Peter

von tobias hofer (Gast)


Lesenswert?

hallo zusammen

danke vielmals.
werde das einmal studieren und ausprobieren.

gruss tobias

von tobias hofer (Gast)


Lesenswert?

hallo

ich habe folgendes problem und habe das auch nicht gerade aus
dem bsp. code lesen können.

nach einer messung hat mein 16bit timer einen wert den ich lesen möchte. 
und zwar ein high byte und ein low byte.

ich speichere beide byte's als uchar.

wie kann ich diese beiden charakter werte in einer ulong variabel 
zusammensetzten das ich einen 16bit wert habe?

oder muss ich das ganz anders anstellen.

besten dank tobias

von tobias hofer (Gast)


Lesenswert?

@peter

kannst du mir vieleicht nicht kurz dein programm erklären?
ich kenne die ganzen register nicht da ich mit einem 8051
arbeite.

wie genau läuft bei dir die messung der frequenz ab mit der ganzen 
interrupt routine?

besten dank tobias

von Peter D. (peda)


Lesenswert?

Der 2051 ist ein 100% 8051, bloß P0 und P2 fehlen.

Für die Messung arbeitet T0 im 2*8bit-Mode,
TH0 ist die Zeitbasis, TL0 zählt die geteilte Eingangsfrequenz. Per 
Interrupt werden beide auf 24Bit erweitert.

Im NF-Bereich zählt statt TL der T1 die ungeteilte Frequenz.


Angezeigt wird: fx = Quarz * n / m

Siehe auch:
http://www.specs.de/users/danni/appl/soft/c51/frequenc/index.htm


Peter

von tobias hofer (Gast)


Angehängte Dateien:

Lesenswert?

ich habe es auf diese weise versucht:

ich inkrementiere den timer1 16bit mit jeder fallenden flanke
am eingang t1 (timer input).
die ganze messung lasse ich eine sekunde laufen.
und somit habe ich schon die freqeuenz.

jetzt habe ich aber folgendes problem: ist die frequenz kleiner als 
255Hz funktioniert es, erhöhe ich die frequenz nun
bekomme ich ein falsches resultat.
vermutlich wird das lsb und msb nicht richtig zusammengesetzt.
ich finde jedoch diesen fehler nicht. vieleicht kann
mir jemand weiterhelfen.

besten dank

tobias

von Peter D. (peda)


Lesenswert?

"high_byte*0x80+low_byte" kann ja nicht gehen

Ein Byte hat 8Bit also *256 oder *0x100 oder <<8


Peter

von tobias hofer (Gast)


Lesenswert?

habe ich gerade auch gesehen.
jetzt funktioniert der frequenzzähler. ist aber viel zu ungenau. da ich 
ja ein internes delay habe das mir die messzeit von 1 sekunde bestimmt. 
so habe ich eine relativ
grosse abweichung je höher die zu messende frequenz.

jetzt muss ich mal schauen ob ich deine variante programieren kann. dann 
sollte dieses problem ja umgehen können.

gruss tobias

von tobias hofer (Gast)


Angehängte Dateien:

Lesenswert?

hallo
ich habe das neu programiert. nun habe ich
folgendes problem:

den timer0 lasse ich zählen durch meine externe (zu messende) frequenz.
der timer0 arbeitet im 16bit mode, nun möchte ich immer
bei einem entstehenden owerflow einen interrupt auslösen und
den merken.
der timer1 läuft auch im 16bit mode wird aber durch den internen takt 
gezählt.

aber irgendwo liegt ein fehler beim merken des timerowerflow von timer1 
und timer0.
oder der timer0/1 interrupt wird gar nicht ausgelöst!

kann mir vieleicht jemand helfen wo der fehler liegt?
ich benutze einen 8051 compatiblen "ds89c420"

besten dank

tobias

von tobias hofer (Gast)


Angehängte Dateien:

Lesenswert?

hallo

das mit dem timer owerflow interrupt habe ich gelöst.
die messung funktioniert, aber noch zu ungenau.

in der berechnung der frequenz habe ich im moment noch einen
korrekturfaktor. vieleich kann mir jemand sagen wo
dieser fehler passiert.

besten dank tobias

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.