mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frequenzmessung


Autor: Stevko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo an alle,

da ich noch auf meine Bauteile fürs Telescop warten muß, wollte ich
gestern mal "fix" einen kleinen Frequenzmesser bauen. Der Grund ist
mein Synchronmoter zur Nachführung. Dieser muß mit 12V/50Hz angesteuert
werden und das wollte ich überprüfen.
Dazu habe ich eine Schaltung mit dem Nec555 aufgebaut, welche mir ein
Rechtecksignal mit ca. 5V/50Hz und einem Tastverhältniss 50:50 ausgibt.
Das Signal wurde auf Int0 vom AtMega32(Experimentierplatine) gelegt.
Vorgehensweise:
Counter von Timer1 wird zu Beginn der Messung auf 0 gesetzt. Int0 auf
"rising Edge". Jetzt werden 1sec lang die Impulse auf Int0
gezählt(kurze Interruptroutine). Nach der Sekunde habe ich ja direkt
die Frequenz auf dem Display.
Aber was zeigt er an? Etwas über 100Hz also das Doppelte! Der Timer1
funktioniert aber, genau eine Sekunde.
Hinter den 555 einen 7414 gelegt und noch mal probiert. 100Hz! Altes
Oszi rausgeholt und Signal angesehen. 52Hz / Tastverhältnis 50:50 und
schöne steile Flanken.
Routine von Int0 verändert. Wenn rising Edge erkannt dann: Zähler um 1
erhöhen und auf Erkennung von falling Edge umschalten. Löst die falling
Edge ein Int aus, dann nichts zählen, sondern wieder auf Erkennung der
rising Edge umschalten. Meine Vermutung war daß die rising Edge
mehrmals erkannt wird. Jetzt stimmt auch die Frequenzanzeige wieder.
Das ganze habe ich bis 50kHz treiben können. Ohne "Umschalten" wurde
immer die doppelte Frequenz angezeigt.
Wo ist hier der Fehler? Bedeutet rising Edge nicht ein Wechsel von 0
auf irgendwas oder ist die ganze Flankenlänge die rising Edge?

Den Fehler, wenn es einer ist , muß ich finden. Mein selbstgebauter
Encoder (alte Maus + 7414) arbeitet auch auf dem Prinzip. Wenn da auch
die rising Edge mehrmals einen Int auslöst wird die Position
verfälscht.

Gruß
  Stevko

Autor: Wolle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der  Denkfehler ist wohl in deinem Kopf.
Bei einer Frequenz hast du immer 2 High/Low-Wechsel pro Schwingung.
Impulse bestehen aber nur aus einem High/Low-Wechsel.

Autor: Markus_8051 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Wolle: hääää?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Fehler ist mit Sicherheit in Deinem Programm.


Peter

Autor: Dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht den IRQ falsch eingesetzt? Als "On Toggle"?
Quellcode wäre doch auch immer schön hehe ;)


dave

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

Bewertung
0 lesenswert
nicht lesenswert
Danke erst mal an alle.

Mußte am Freitag die Kinder holen und konnte deshalb nicht antworten.
Ohne den Code wäre das sowieso nur ein rumstochern gewesen.
Also der Code ist im Anhang.

@Peter
Natürlich liegt der Teufel im Detail oder Programm. Aber ...
Wäre nett wenn Du Dir mal den Code anschaust. Es ist nur ein
Testcode.

Ok fasse noch mal zusammen:

Timer1 eingestellt auf 1sec. Stimmt genau, habe trotzdem mal 2Stunden
die Interrupts gezählt -> ok.

Vorbereitung:
Prescaler auf Null(=Stop) + Timer1 auf Null + Int0 auf rising Edge +
Counter Int0 = 0(Type: Word)

Meßschleife für doppelte Frequenz:
---------------------------------------------------
Prescaler auf /256 -> Int0 freigegeben -> ISR für Int0 = Inc(Count
Int0) -> until ISR Timer1 Compare Match -> Prescaler auf Null(Stop)->
Count Int0 auf Display -> alles auf Null setzen und von vorn beginnen
==> doppelte Frequenz

Meßschleife für richtige Frequenz:
------------------------------------------------
Prescaler auf /256 -> Int0 freigegeben -> Boolean(R21) auf rising Edge
-> ISR für Int0 -> Verzweigung:

rising Edge:
Inc(Count Int0) -> Int0 auf falling Edge setzen -> Boolean(R21) auf
falling Edge

oder

falling Edge:
Int0 auf rising Edge setzen -> Boolean(R21) auf rising Edge
==> richtige Frequenz

Zum Schluß wieder alles stop + aufs Display und neue Messung.

Gruß
  Stevko

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.