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
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.
Vielleicht den IRQ falsch eingesetzt? Als "On Toggle"? Quellcode wäre doch auch immer schön hehe ;) dave
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.