Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeit zwischen Impulsen messen
boeseTURBO-CT
08.06.2004, 10:50
Ich möchte die Zeit zwischen 2 Impulsen messen.... Die Frequenz beträgt maximal 160 hz.
Wie "genau" kann ich da eine Zeit messen ? (ATMEGA32 mit 16 MHz)...
Freiheitspirat
08.06.2004, 11:35
Wenn Du Dir unmittelbar nach einem Impuls die Werte von Timer1 in eine Variable speicherst und die Differenz von zwei gespeicherten Variablen mit Deinem Systemtakt multiplizierst und durch dem im "Config Timer1" eingetragenen Teiler/Prescale (Siehe Bascomhife) teilst, ist die Genauigkeit Dein Systemtakt / Prescale.
z.B. 1 / (16.000.000 / 1024) = 0,000064 Sekunden
boeseTURBO-CT
08.06.2004, 11:52
Na dann reicht das ja dicke! :) Vielen dank!
Gruss
Jan
Das ganze kann man vereinfachen wenn man den dafür vorgefertigten Befehl verwendet . O:)
Pulsein
Dim w As Byte
pulsein w , PIND , 1 , 0 'detect time from 0 to 1
print w
end
MfG
Martin
boeseTURBO-CT
08.06.2004, 14:13
Misst dieser Befehl jetzt den Zeitraum wo die Flanke auf 0 gefallen ist, bis zu dem Zeitraum bis diese wieder ansteigt?
Was gibt pulsein eigentlich wieder? Das ist doch nicht die Zeit in Sekunden... Wenn ich das richtig verstehe, ist ein Impuls, wenn an einen Port kurz 5 V anliegen, oder?
Gruß, Trabukh
Ja das ist richtig.
Wenn du 160 Hz hättest, dann hättest du auch 160 Impulse...
Martin
Also, ich müsste die Länge zwischen zwei Impulsen messen und das ganze dann in Millisekunden oder halt noch kleiner, aber in XXX-sekunden bekommen. Weißt du, wie das geht? Ich hab mit der Umrechnung irgendwie Probleme... Ach und der Abstand zwischen 2 Impulsen kann bei bis zu 3 Sekunden liegen.
Gruß, Trabukh
Du musst das Ergebnis des Befehls durch 10µs teilen, dann müsstest du die Impulszeit in µs haben.
Da ist noch ein Problem: Pulsein zäht nur bis 655.35mS
Gruß, Trabukh
Dann kannst du das ganze doch in eine Schleife machen bis ein Pulsein keinen Timeout hat. Du zählst mit, wie oft die Schleife durchlaufen musste und addierst die Zeiten, dann hast du einen Pulsein mit unbegrenzter Laufzeit.
Beispiel: 2,5 sek Puls
2500 ms
2500000 µs
250000 units / 65535 = 3.8
also läuft die Schleife 4 mal
2. Beispiel: 627834 units (frei ausgedacht 8-[ )
627834 / 65535 = 9.58
d.h. die schleife läuft 9 mal komplett durch und dann folgt ein impuls von den noch übriggebliebenen 380190 units.
Dies entspricht ca. 38019 µs = ca. 380 ms
Das Ergebnis: 9 * 655.35 ms + 380 ms
= 6.3 sek
boeseTURBO-CT
20.07.2004, 16:32
Hat jemand mal n beispiel wie man das mit nem Timer macht? Will die Zeiten jeweils zwischen einem Int. haben....
Gruss
Jan
Also das pulsein ist mit einem Timer gemacht.
Martin
boeseTURBO-CT
20.07.2004, 17:10
pulsein ist für mich leider ungeeignet, da das Programm an dieser Stelle unterbrochen wird. Bei mir muss die Software weiterlaufen und beim nächsten int. die Zeit ausgeben.
Gruss
Jan
Achso, jetzt versteh ich dein Problem..... 8-[
on timer1 timer1_isr
on int0 int0_isr
.................
timer1_isr:
timer1 = wert
incr i
return
int0_isr:
zahl = timer1
return
dann wird in "zahl" der aktuelle timer1-status gespeichert wenn an int0 eine 1er oder 0er flanke anliegt (hängt von der konfig ab) und in i der faktor für die timerüberläufe.
du musst natürlich noch den timer1 konfigurieren.
Martin
boeseTURBO-CT
20.07.2004, 18:07
super! Danke!
Dann kannst du das ganze doch in eine Schleife machen bis ein Pulsein keinen Timeout hat. Du zählst mit, wie oft die Schleife durchlaufen musste und addierst die Zeiten, dann hast du einen Pulsein mit unbegrenzter Laufzeit.
OK, verstanden hab ich das, nur leider kenne ich mich mit BASCOM noch überhaupt nicht aus. Könntest du einen kleinen Beispielcode geben? Bitte...
Gruß, Trabukh
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.