Forum: Mikrocontroller und Digitale Elektronik Periodendauer messen und in Frequenz umwandeln


von Tommy (Gast)


Lesenswert?

Hallo !

Habe folgendes Problem:

Will mir einen Bordcomputer fürs Motorrad bauen.
Dieser soll mehrere umschaltbare Screens mit verschiedenen Funktionen 
haben.
Der erste Screen soll Geschwindigkeit und Drehzahl und Ganganzeige 
besitzen.
Ganganzeige sowie Geschhwindigkeit funktioniert bereits.

Für die Drehzahl habe ich ein Rechteck zwischen 20 und 200 Hz.
Ich will nun die Periodendauer jedes Signals messen.
Dazu habe ich nun das Signal auf den ICP des Mega32 gelegt. Quarz ist 16 
MHz.

Am Display kann ich die gezählten Takte sehen. Bei 200 Hz circa 780.

Wie kann ich nun diese Taktzahl in eine Frequenz bzw. Drehzahl umrechen 
?

Progge mit Bascom.

Vielen Dank für eure Hilfe.

Gruß Tommy

von Tommy (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch das Programm was ich bis jetzt geschrieben habe.

von Falk B. (falk)


Lesenswert?

@ Tommy (Gast)

>Wie kann ich nun diese Taktzahl in eine Frequenz bzw. Drehzahl umrechen
>?

f = 1/T

MFG
Falk

von bascomer (Gast)


Lesenswert?


von crazy horse (Gast)


Lesenswert?

das ist mit einer einfachen Division erledigt.
Drehzahl ist eine Frequenz, du misst die Periodendauer. Und die stehen 
in folgender Beziehung:
f=1/T
Dann noch auf die richtigen Einheiten achten (deine Timereinheit und 
Umrechnung in U/min).
Also eine Konstante durch deine gemessene Periodendauer teilen.
Beispiel: die 200Hz würden 200km/h entsprechen:
156000(Konstante)/780(Messwert)=200 (km/h)

von Johannes M. (johnny-m)


Lesenswert?

Du musst doch nur wissen, wie lang ein Timertakt ist. Der Rest ist ein 
klassischer Dreisatz:
1
1 Timertakt = n µs (oder ms oder wasauchimmer)
2
x Timertakte = x*n µs
Dann noch die oben schon erwähnte Division und fertig...

von Manuel (Gast)


Lesenswert?

Moment, es geht um die Drehzahl, die ist unabhängig der aktuellen 
Geschwindigkeit!

Also die 20-200Hz deuten ja darauf hin, dass der Motor bei jeder 
Umdrehung eine positive Taktflanke erzeugt. Das bedeutet, du muss 
einfach nur die Takte pro Sekunde zählen (also die Frequenz bestimmen) 
und diesen Wert mit 60 multiplizieren (200Hz --> 200 Umdrehungen pro 
Sekunde * 60 = 12000 Umdrehungen pro Minute). Der Wert kann dann zB 
sekündlich aktualisiert und angezeigt werden.
Ein bestimmen der Periodendauer ist meiner Meinung nach wirklich nicht 
nötig. Wenn Dir die Sekunde zu lang dauert, kannst du ja auch die Takte 
in 500ms zählen und den Wert dann halt mit 120 multiplizieren.
Viel Erfolg!

von Tommy (Gast)


Lesenswert?

Die rechnung ist soweit klar.

Habe mich glaub falsch ausgedrückt :-(

Ich habe den Wert des Timer1 Registers auf dem LCD stehen.

bei meinem Prescaler und 16 MHZ ist ein Zyklus 64µs. ???

Wenn ich nun zb. 780 * 64µs rechne sollten doch 50ms rauskommen für die 
Periodendauer.

diese dann 1/periodendauer und mal 60.

Und ich hab am LCD immer 0 stehen.

Das ist mein Problem

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Dan zeig doch mal was du rechnest, eventuell machst du nur 
Ganzzahlarithmetik....?
Und JA du hast das extrem ungenau ausgedrückt... Das konnte man ja nun 
ÜBERHAUPTNICHT aus deiner Frage ablesen!

von crazy horse (Gast)


Lesenswert?

ist doch egal, ob Drehzahl oder Geschwindigkeit. Messen kannst du die 
Periodendauer eines Signals, haben willst du die Frequenz.

von Johannes M. (johnny-m)


Lesenswert?

@Manuel:
Ich (und vermutlich auch die anderen) habe das so verstanden, dass sein 
Drehzahl-Sensor ein Rechtecksignal mit Drehzahl-abhängiger Frequenz 
liefert (OK, dass da noch anscheinend ein Offset drauf ist, habe ich 
oben nicht berücksichtigt, allerdings macht der Offset auch Sinn, da man 
ansonsten bei Geschwindigkeiten in der Nähe von Null ziemliche Probleme 
bekommt) und er mittels ICP (was ebenfalls sinnvoll ist) die 
Periodendauer dieses Rechtecksignals bestimmt. Und da kommt nunmal 
zunächst einfach nur die Anzahl der Timertakte zwischen zwei 
Capture-Ereignissen raus. Die muss dann in die Geschwindigkeit 
umgerechnet werden. Und zwar so (oder so ähnlich) wie es oben besprochen 
wurde. Dazu kommt dann allerdings noch der Offset, der allerdings (falls 
der restliche Ausgabebereich des Drehzahlsensors linear ist) einfach 
subtrahiert werden kann.

EDIT:
Upps, da hab ich zu langsam getippt...

von Tommy (Gast)


Lesenswert?

Erstmal entschuldigung für meine unpräzise Aussage.

Bin neu auf dem Gebiet Mikrokontroller.

Also nochmal:

Das ankommende Signal ist ein sauberes Rechteck ohne Offset und mit 5V 
Spitze.

Je nach drehzahl ändert sich die Frequenz zwischen 20 HZ (1200 U/min) 
und 200 Hz (12000 U/min).

Die Frequenzänderung liegt in der Periodendauer. Das heißt, einmal ist 
sie länger und einmal kürzer.

Sprich bei 20 Hz habe ich 50ms und bei 200Hz 5 ms. Das ist ja auch 
normal.

nun stelle ich eine Drehzahl von 1200 U/min am Drehzahlmesser ein und 
gebe dieses Signal auf den ICP Eingang.

Habe 16 Mhz Quartz und Prescaler von 1024. Ergibt 64µs Zyklus. Soweit 
Richtig denk ich mal.

Bei 20Hz oder 50ms zählt mir der ICP-Timer1 nun auch richtigerweise 780 
Zyklen. Da ja die 64µs circa 780 mal in die 50ms rein passen.

die 780 hab ich nun am Display stehen.

Nun wollte ich mit Bascom diesen Wert umrechnen auf eine Drehzahl. Der 
mathematische Weg ist mir klar. Ich weiß nur nicht wie ich es in Bascom 
lösen muss. Welche Variablendimensionierung und so weiter.

So, ich hoffe diesmal ist es präzise ausgedrückt :-)

Gruß Tommy

von Rahul D. (rahul)


Lesenswert?

>Die Frequenzänderung liegt in der Periodendauer. Das heißt, einmal ist
>sie länger und einmal kürzer.

Interessante Aussage...

von Matthias L. (Gast)


Lesenswert?

>die 780 hab ich nun am Display stehen.
>Nun wollte ich mit Bascom diesen Wert umrechnen auf eine Drehzahl

Also: du hast: X Impulse, jeder stellt 64µs dar.

SOmit ist die gemessene Zeit (Periodendauer) X*64µs,
oder (X*64/1'000'000) sek.

Diese Zeit in den Kehrwert genommen, ergibt die Frequenz/Drehzahl in 
1/sek.

           1            1'000'000 [µs/sek]
f= ---------------- = --------------------
    X*64/1'000'000       X*64 [µs]

Da du vermutlich die Drehzahl in 1/min haben willst, musst du den 
Ausdruck mit 60[sek/min] erweitern:

    1'000'000 [µs/sek]                   60'000'000 [µs/min]   937'500
f= -------------------- *60 [sek/min] = ------------------- = ------- 
[1/min]
     X*64 [µs]                            X*64 [µs]              X

Somit musst du programmieren: f (in 1/min) = 937500/X (X:Anzahl, im Bsp 
780)

WIe das in Bascom geht, weiß ne. Ich nehm C.

Du musst aber auf folgendes Aufpassen:
- X darf nicht Null sein => Abfangen, zB, X:=X+1
- Der Datentyp bei der Berechung muss grßer 20bit sein, sonst kommt Mist 
raus.

Viel Spass..

von Tommy (Gast)


Lesenswert?

Super !

Das war die Lösung !

Habe einfach folgendes Programmiert:

Drehzahl = 937500 / Counts

Variablen sind jeweils als Long dimensioniert.

Den Rest der Berechnungen habe ich aus dem Prog genommen.

Danke nochmal für die Hilfe.

Gruß

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.