PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeit zwischen Impulsen messen



boeseTURBO-CT
08.06.2004, 09: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, 10: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, 10:52
Na dann reicht das ja dicke! :) Vielen dank!

Gruss

Jan

x-ryder
08.06.2004, 12:35
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, 13:13
Misst dieser Befehl jetzt den Zeitraum wo die Flanke auf 0 gefallen ist, bis zu dem Zeitraum bis diese wieder ansteigt?

x-ryder
08.06.2004, 21:30
Jo

MfG
Martin

Trabukh
20.07.2004, 11:23
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

x-ryder
20.07.2004, 13:42
Ja das ist richtig.

Wenn du 160 Hz hättest, dann hättest du auch 160 Impulse...

Martin

Trabukh
20.07.2004, 13:51
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

x-ryder
20.07.2004, 13:59
Du musst das Ergebnis des Befehls durch 10µs teilen, dann müsstest du die Impulszeit in µs haben.

Trabukh
20.07.2004, 14:05
Da ist noch ein Problem: Pulsein zäht nur bis 655.35mS

Gruß, Trabukh

x-ryder
20.07.2004, 14:28
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, 15:32
Hat jemand mal n beispiel wie man das mit nem Timer macht? Will die Zeiten jeweils zwischen einem Int. haben....

Gruss

Jan

x-ryder
20.07.2004, 15:49
Also das pulsein ist mit einem Timer gemacht.

Martin

boeseTURBO-CT
20.07.2004, 16: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

x-ryder
20.07.2004, 16:22
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, 17:07
super! Danke!

Trabukh
20.07.2004, 17:33
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