Forum: Mikrocontroller und Digitale Elektronik Frequenzmessung


von Tom Müller (Gast)


Lesenswert?

Hi User,
Ich will mit einem PIC16F690 die Frequenz eines an einem Eingangspin
anliegenden Rechtecksignals messen.
Hab mir folgendes überlegt:
Zeitfunktion von 0,5s Länge, wärend dieser Zeit wird mit einer
Zählvariable die anzahl der Highpegel am Eingang gemessen, und nach
Zeitablauf an eine RS232 Funktion übergeben.
Mein Problem ist dabei, dass der Code die Zeit scheinbar nicht wartet.
Wie kann man sowas (am besten in C) programmieren?
Meine Idee war eine While- Schleife, die solange läuft, bis die Zeit
abgelaufen ist, und eine Null von der Zeitfunktion zurückgegeben wird.
Das funktioniert aber nicht.
Vielleicht hat einer von Euch eine Idee?

von Micha-78 (Gast)


Lesenswert?

Hi,

versuch es doch einmal ueber eine Capture Compare EInheit! Ich kenne
leider den PIC nicht, daher kann ich dir da keine Genaue Auskunft
geben.

Lege das Eingangssignal (die Frequenz) auf einen Pin der auch mit einer
CapCom Einheit verbunden ist. Danach stellst du den Timer ein, auf
steigende Flanke wird die Einheit gestartet, und auf fallende Flanke
wird die Einheit gestoppt. Timereinstellung ist bekannt, DutyCycle ist
denke ich 50/50 somit kein Problem.
Da nun alles in einem Interrupt abgearbeitet wird, und noch dazu vom
Silizium selbst hast du viel Zeit und dein System ist komplett frei
fuer wichtige andere Aufgaben. Beachte aber das deine INterruptroutine
so kurz wie nur denkbar moeglich sein sollte. Wenn du hier
Zeitverschleppungen reinbekommst, kann sich alles verschieben oder
wunderbare nebeneffekte zeigen. Aber das weisst du selbst.


viel Spass
gruss micha

von Tom Müller (Gast)


Lesenswert?

Hi micha,
Capture hat dieser Controller. Ich denke dass dies auch die einfachste
Variante sein kann. Bei meiner Idee muss ja permanent noch abgefragt
werden, ob die Zeit schon abgelaufen ist. Ich wollte das Programm
eventuell noch auf eine Controller ohne Capture brennen, da wäre eine
eigene Lösung ja eigentlich das Beste.
Aber Capture ist auch ne Variante.
Die von Dir angesprochenen Wunderbaren Nebeneffekte kenne ich schon.
Das wären zB. immer bis zum Rand gefüllte Zeitvariablen, oder al
garkeine Zeit.

von Peter D. (peda)


Lesenswert?

"...wärend dieser Zeit wird mit einer Zählvariable die anzahl der
Highpegel am Eingang gemessen..."

Wäre richtig, wenn Du die Impulslänge messen willst.

Für ne Frequenzmessung mußt Du aber die low-high-Übergänge zählen.



"Mein Problem ist dabei, dass der Code die Zeit scheinbar nicht
wartet....Das funktioniert aber nicht."

Mein Hellseher-Gen ist diesen Monat rezessiv.

Da mußt Du schon Deinen Code ganz profan visuell posten, um den Fehler
darin finden zu können.


Peter

von Micha-78 (Gast)


Lesenswert?

aehm, fuer eine Variante ohne Capture Einheit wuerde ich eine aehnliche
Version verwenden.
Also Pin mit externem Interrupt, welcher eine Zaehlervariable die vom
Timer hochzaehlt steuert. Steigende Flanke Interrupt, fallende Flanke
Interrupt, somit bekommst du den gleichen Effekt wie mit Capture
Einheit, nur das eben zwei Interrupts daran beteiligt sind (ext Pin
Interrupt, Timer Interrupt) und nicht nur die CaptureEinheit.
Bin mir jetzt nicht sicher, ob du die Timervariable dann per Semaphore
sperren solltest waehrend der Berechnung. Nicht das der Timer die
Variable hochzaehlt waehrend du rechnest. Aber dies ist denke ich
einfach mal rumspielen und testen. aehm was auch denkbar ist ueber das
Start/Stop bit vom Timer diesen einfach anzuhalten.


gruss micha

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>Steigende Flanke Interrupt, fallende Flanke Interrupt

Wieso willst du beide Flanken auswerten? (hab nicht alles verfolgt, was
oben passierte bis auf die Frequenzmessung.)

Sonst ist die Lösung richtig.

von Micha-78 (Gast)


Lesenswert?

upps,

ja sorry. Da ist ein kleiner Denkfehler drin.
Bei Frequenzmessung mit 50/50 DutyCycle reicht natuerlich nur eine
Flanke.
Bei Messung mit variierendem DutyCycle (PWM Signal) benoetige ich beide
Flanken.

Danke

von Frank (Gast)


Lesenswert?

U.a. sollte man auch wissen, in welchem Frequenzbereich du messen
willst, wie genau die Frequenzmessung sein sollte, und ob während der
Frequenzmessung noch weitere zeitkritische Prozesse laufen:

Hier aber allgemein die Dokumentation und Codr zweier weiteren
Möglichkeiten Frequenzen mit dem PIC zu messen:

Für eher niedrige Frequenzen:
http://www.burger-web.com/Projects/FMeasure/de_Ex_FMeasure.htm.de

Sehr grosser Frequenzbereich aber in Assembler geschrieben:
http://www.sprut.de/electronic/pic/programm/freqled4/freqled4.htm


Grüsse

Frank

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>Bei Messung mit variierendem DutyCycle (PWM Signal) benoetige ich
>beide Flanken.

Nö, warum?
Die Frequenz ist immer noch der Kehrwert der Periodendauer.
Und die Periodendauer wird dadurch beschrieben, dass es sich dabei um
die Zeit handelt, nach der sich das Muster wiederholt.
Bei Digitalsignalen kann man das darauf reduzieren, dass man
feststellt, in welchem zeitlichen Abstand zwei gleiche Flanken
auftreten.
Wenn man beide Flankenrichtungen auswertet, kann man die Pulsdauer und
die Periodendauer feststellen, und somit den Tastgrad (Duty-Cycle)
berechnen. Die Variation des Tastgrads wird gerne bei digitalen
Temperatursensoren benutzt. Die Pulslängenmessung ist bei der
Auswertung von Modell-Fernsteuerungs-Signalen interessant.
Für eine Periodendauer- oder Frequenzmessung ist nur eine Flanke
interessant.

von Manfred auch (Gast)


Lesenswert?

Habe so eine Geschichte auch schon bearbeitet.
Mit der Capture Einheit die steigenden Flanken auswerten. Am besten
mehrere Messwerte des Timers speichern, differenzen bilden (aufpassen
ob nicht ein Timerüberlauf in der zwischenzeit stattgefunden hat) und
mitteln jetzt nur noch die berechnung zur Frequenz und fertig.

von Tom Müller (Gast)


Lesenswert?

Hallo Manfred,
Da Du schon mal mit dem Capture was gemacht hast, frage ich mal ganz
frech nach einem Code. Initialisierung von Capture und Timer1 würde
mich interessieren. Das selbstgeschriebene Programm war nur eine
Ausweichvariante, weil eventuell noch ein anderer PIC zur Realisierung
genutzt werden sollte. Jetzt habe ich einen 16F690, der hat internen
CCP. Falls Du  mir mit einem INIT für Capture und Timer1 aushelfen
könntest, das wäre echt cool. Meiner läuft nämlich nicht.
MfG Tom

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.