mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frequenzmessung


Autor: Tom Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Micha-78 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tom Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Micha-78 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Micha-78 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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_...

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


Grüsse

Frank

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Manfred auch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tom Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.