Forum: Mikrocontroller und Digitale Elektronik Frequenzmessung


von Stevko (Gast)


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

von Wolle (Gast)


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.

von Markus_8051 (Gast)


Lesenswert?

@Wolle: hääää?

von Peter D. (peda)


Lesenswert?

Der Fehler ist mit Sicherheit in Deinem Programm.


Peter

von Dave (Gast)


Lesenswert?

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


dave

von Stevko (Gast)


Angehängte Dateien:

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

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.