Forum: Mikrocontroller und Digitale Elektronik Drehzahl Messung die Xte...


von Dennis Brücke (Gast)


Lesenswert?

Hi @all,

ich habe jetzt schon viele threads durchgelesen raffe es aber nicht so
richtig...

Also ich habe ein Drehzahl Impuls von 2 Impulse bis 5000 Impulse pro
Minute in etwa.

Jetzt gibt es 2 Methoden die am Gängigsten sind.
1. Zeitmessung von Impuls zu Impuls
2. Anzahl der Impulse pro feste Zeiteinheit

Ich denke mal am Anfang währe die 2. Variante die leichteste. Also
Timer Programmieren auf meinetwegen 500ms ? Nur wie zähle ich jetzt die
Impulse ? Beliebiger Portpin oder Über Interrupt ?

Wenn per Interupt (INT0 od. INT1) wie ?

Ich verstehe das im moment einfach nicht (prinzipieller aufbau)

Habe grad irgendwie nen Denkfehler in der geschichte...

Gruß Dennis

von ...HanneS... (Gast)


Lesenswert?

Hi Dennis in Bernau...

Das richtet sich erstmal danach, wie viele Drehzahlen du parallel
erfassen willst. Ist es nur eine, dann kannst du Hardwaremittel (wie
Timer-ICP, Ext-Int, TI) einsetzen. Sind es mehrere, dann wirst du schon
in einer Timer-ISR pollen müssen.

Meinst du wirklich 2...5000 Impulse pro MINUTE?

2 Impulse pro Minute ist ja fast Stillstand.
Ansonsten passt das aber in das Darstellungsformat des 16-Bit-Timers
und kann per ICP erfasst werden.

ICP löst einen Int aus und merkt sich in den ICP-Registern den genauen
Zeitpunkt. In der ISR subtrahierst du davon den Wert der letzten
"Runde". Dies muss allerdings 16-Bit erfolgen, ist dafür aber auch
recht genau und hat einen großen Erfassungsbereich. Als Ergebnis
erhältst du den Zeitabstand der Impulse.

Eine weitere Variante wäre, einen Timer mit externem Takt (Ti) zu
takten (dann ich es ein Counter) und dessen Inhalt in einer (langsamen)
Timer-ISR (eines anderen Timers) auszulesen und zu löschen. Dann hast du
direkt die Impulse pro Zeiteinheit.

Per Ext-Int liest du in dessen ISR den Inhalt eines freilaufenden
Timers (der noch andere Dinge steuern kann) ein und subtrahierst davon
den Timerwert des letzten Impulses (den neuen Timerwert merken). Das
ergibt den Zeitabstand der Impulse.

Welches Verfahren man anwendet, richtet sich auch danach, was der AVR
sonst noch so alles tun soll.

Gruß...
...HanneS...

von Dennis Brücke (Gast)


Lesenswert?

Hallo ...HanneS... aus ? ;)

Ich danke Dir für Deine Antwort, habe mich glaube falsch ausgedrückt
sind nicht 2-5000 Impulse p. Minute. Ich habe 1 Impuls für 2
Umdrehungen sprich maximal 10.000 Umdrehungen per Minute also maximal
5000 Impulse. Minimum währen 300 Impulse pro Minute.

Bringt mich hier schon alles durcheinander... ;) Aber ich glaube da
muss ich morgen nochmal in ruhe drüber grübeln, bin wohl schon zu sehr
durcheinander und habe nicht wirklich verstanden was Du geschrieben
hast.

Gruß Dennis

von Andi (Gast)


Lesenswert?

hmm...1 Impuls für 2 Umdrehungen.
Das hört sich nach Zündspule für einen KFZ-Motor an, richtig?

Gruß
Andi

von ...HanneS... (Gast)


Lesenswert?

Hi Dennis...

Welchen AVR willst du einsetzen?

Rechne mal die Impulse in Hertz um, die Zahlen sind dann
aussagekräftiger.
Wie realisiert man 1 Impuls bei 2 Umdrehungen? 2 Impulse pro Umdrehung
halte ich für realistischer. (ist schon spät...)

Wieviele Drehzahlen willst du nun parallel erfassen?

Gruß...
...HanneS...
vom westlichen Ende der B246, einem 650-Seelen-Dorf bei Magdeburg
namens Königsborn...

von ...HanneS... (Gast)


Lesenswert?

Ups...
Der übliche Drehzahlmesser fürs Autut...

Dann ist's nur eine Messstelle...

...

von Dennis Brücke (Gast)


Lesenswert?

Guten Morgen ;)

ja es geht um einen Drehzahlmesser für einen 3 Zylinder 4-takt ;)
µP ist ein ATMega8 (mein lieblingsprozessor)
also auch nur eine Messstelle.

;)

von Dennis Brücke (Gast)


Lesenswert?

@ HanneS

so hab mir deinen Text jetzt nochmal durchgelesen,
die Variante innerhalb einer Zeit bestimmte Impulse zu messen habe ich
schnell verworfen, da ich bei 8000upm schon eine Abweichung von 2000upm
habe. (bei 500ms messzeit)

Also denke ich mal die ICP methode klingt am besten...
Also wenn ich es recht verstanden habe.

Lasse ich den Timer z.b. mit 10ms Laufen wenn ein ICP Event eintritt
(Steigende flanke)
- Lasse ich den Aktuellen Wert mit einem im SRAM
  (z.b. 0x60/0x61)gespeicherten Wert Subdrahieren
- Dann Ergebnis wieder in eine SRAM Stelle (0x62/0x63)
- Dann speichere ich mir den Timerwert in eine SRAM Stelle (0x60/0x61)
  für die "Nächste Runde"

In der Main Routine führe ich dann meine berechnung durch Ergebnis aus
SRAM auf Drehzahl hochrechnen.

?!?!

Oder hab ich es komplett falsch verstanden ?

Gruß Dennis

von Jankey (Gast)


Lesenswert?

klingt nach 4 takter g

von Dennis Brücke (Gast)


Lesenswert?

@Jankey,

jupp aber mit 3 Zylindern ;)

Grins

von Dennis Brücke (Gast)


Lesenswert?

Juchu,

ein wenig von erfolg gekrönt ;) Ich erhalte jetzt schon den Abstand der
Impulse ;) Getestet hab ich es mit einem PC Lüfter bei einer Frequenz
von 3,6864 Mhz und Vorteiler 1024 da bekomm ich dann eine Zähldifferenz
von 25 Counterwerten.

Wie kann ich jetzt aus den 25 Counterwerten z.b. eine Drehzahl
berechnen?

Der Prescaler ist auch noch nicht so perfekt... die Auflösung ist sehr
grob.

Sorry aber Mathe & Formeln war noch nie so mein Ding

Gruß Dennis

von ...HanneS... (Gast)


Lesenswert?

f=1/t (f in 1/s, also in Hz, t in s)

f=3600/t (f in 1/min (Umdrehungen je Minute), t in s)

...

von ...HanneS... (Gast)


Lesenswert?

Quatsch...

nicht 3600 (das wären Stunden) sondern 60...

...

von Dennis Brücke (Gast)


Lesenswert?

@ ..HanneS...

also ich bin jetzt mal auf folgendes gekommen.
Wenn ich von einen Prescaler von 256 ausgehe.

Anzahl GemesseneDifferenzImpulse * 69,44µS = ZeitZwischenImpulsen

        1
-------------------- = Impulse pro Sekunde * 60 = Halbe Umdrehungen *2
ZeitZwischenImpulsen

Nur wie ich das "Vereinfache" und in ASM berechnen kann grübeln wir
jetzt schon seit mehreren Stunden...

Das sind dann die punkte wo ich merke man hätte doch in der Schule
aufpassen sollen ;)

Gruß Dennis

P.S.: HIIILLLFFEEE ;)

von Thomas O. (Gast)


Lesenswert?

Hallo,

wollte nur mal kurz erklären wie man pro 2 Umdrehungen nur 1 Impuls
erhält. Beim Auto dreht sich die Nockenwelle mit halber Geschwindigkeit
zur Kurbelwelle und wenn man am Nockenwellenrad oder am Verteiler einen
Impulsgeber hat der nur einen Impuls pro Umdrehung der Nockenwelle
liefert dann ist das nur 1 Impuls bei 2 Umdrehungen der Kurbelwelle.

Mit der Berechnung in Assembler habe ich auch noch meine
Schwierigkeiten, gibts da evtl. ne möglichkeit das ganze mit nem Basic
zu machen und das dann in Assembler zu integrieren evtl. erst
dissamblieren und dann übernehemn oder so?

von ...HanneS... (Gast)


Lesenswert?

@Thomas, ich weiß... Bin nur nicht auf die Idee gekommen, dass man sich
einen Drehzahlmesser fürs Auto selbst baut. Die gibts doch wohl für'n
Appel und'n Ei auf'm Schrottplatz. Ich dachte mit keiner Silbe an
Carmodding. - Sorry, mein Fehler...
Ansonsten brauchst du mir nix über Grundlagen der KFZ-Technik erzählen,
ich habe den Lappen seit 1966 und habe jahrelang meine Brötchen hinter
Lenkrädern verdient. Und das ohne Servolenkung, ABS usw.

@Dennis:

Du möchtest sicher Umdrehungen pro Minute angezeigt bekommen, oder?
Also Impulse pro halbe Minute (müsste die selbe Zahl sein).

Nun könntest du eine halbe Minute lang Impulse am Zähleingang T1 (PD5)
zählen (Timer 1 als Counter) und diese direkt ausgeben. Aber das dauert
zu lange (zu langsame Aktualisierung).

Wenn du nun 1/100 der halben Minute, also 0,3s lang die Impulse zählst,
dann bekommst du eine Zahl raus, die 1/100 der Drehzahl entspricht. Da
hängste einfach 2 Nullen dran und das stimmt wieder. Oder??

Dann hast du 3 Aktualisierungen pro Sekunde, die musst du erstmal
ablesen können...

Also: Mit Timer0 eine Zeitbasis schaffen, die alle 300ms Timer1
ausliest und löscht. Das könnte ein Int alle 1,17ms sein, der neben der
gesamten Programmsteuerung ein Register hochzählt, das dann alle 256
Ints überläuft und das Auslesen des Timer1 auslöst.

Timer1 wird als Zähler geschaltet (Eingang T1, steigende oder fallende
Flanke, ist egal), kein Int, kein OCR, kein ICP, nur zählen... (aber
genau die Zahlen, die du aufs Display schubsen willst!)

Auf diese Art ersparst du dir die gesamte Rechnerei...

Gruß...
...HanneS...

von Thomas O. (Gast)


Lesenswert?

Hallo,

@HanneS: Ja ich habe ja auch ein 25 Jahre altes Auto ohne ABS usw. das
dieses Jahr wieder angemeldet wird. Was habe ich mich über das ABS vom
meinem jetzigen geärgert, das löst so früh da ist man noch garnicht an
der Haftgrenze.

Ob das jetzt wirklich ein Drehzahlmesser werden sol, ich denke eher das
da nochmer gemachtz werden soll.

Es gibt nämlich noch ne andere Lösung z.b. einen LM2907 der Wandelt
eine Frequenz in eine Spannung um die kann man dann locker per A/D
einlesen und weiterverarbeiten.

Ansonsten kann ich mir nicht erklären warum der Impuls an der
Nockenwelle abgenommen wird, das kann ja nur zur Positionsbestimmung
sein.

von ...HanneS... (Gast)


Lesenswert?

@Thomas Olly:

Ich fahre einen 15 Jahre alten Trabbi.
2 Zylinder Zweitakt, 600 Kubik, Außer Zündanlage keinerlei Elektronik,
Haftreibung (für Bremse) ist bei jedem Wetter ein Thema, nicht nur bei
Glatteis. Ich muss nicht mehr besonders viel fahren, daher reicht mir
das Ding.

Ich bin aber beruflich sehr viel mit Fahrzeugen und Hebezeugen
unterwegs gewesen. Und Vieles musste selbst repariert werden. Und da
wurden nicht nur Baugruppen gewechselt, da wurde noch repariert.

Zurück zum Thema...

Warum soll man eine Drehzahl (zeitabhängige Impulse) erst in eine
Analogspannung umwandeln, um diese dann wieder zu digitalisieren? Das
hätte nur Sinn, wenn die Impulse so schnell kommen, dass sie der AVR
nicht mehr erfassen könnte.
3000 Umdrehungen pro Minute sind 50 Hz. Das sind 20 ms pro Impuls (bei
1 Impuls pro 1 Umdrehung). Mehr als 9000 U/min (150Hz) wird kaum
auftreten. Das kann man noch gut mit dem AVR zählen...

Gruß...
...HanneS...

von Thomas O. (Gast)


Lesenswert?

Hallo,

ja wollte damit auch nur sagen das ganze Elektronikzeug kann mir
gestohlen bleiben.

Das war nur ein Vorschlag um wenig Programmieraufwand zu haben da eine
A/D Wandlung ja nicht viel Code benötigt und das halt leichter wäre.
Als in Assembler ne Rechnung machen zu müssen. Glaube meine A/D
Wandlung hat keine 10 Zeilen Code, müsste nochmal nachschauen wenns
interessiert. Aber wenns wirklich ein Drehzahlmesser werden sollte kann
man ja auch ein Analoginstrument nehmen das man mit dieser
Analogspannung betrieben kann z.B. Wirbelstrominstrument.

von Dennis Brücke (Gast)


Lesenswert?

@ ...HanneS...,

also wenn ich das jetzt richtig verstanden habe, habe ich jetzt mal
folgendes gemacht:

Ich Initialisiere Timer0 mit:
 ldi temp1, (1<<CS00)|(1<<CS01) ; Prescaler 64
 out TCCR0, temp1

 ldi temp1, (1<<TOIE0)   ; Overflow Interupt Aktivieren
 out TIMSK, temp1

Timer1:
 ldi temp1, (1<<CS12)|(1<<CS11)
 out TCCR1B, temp1

Bei 3,686400 Mhz erhalte ich dann einen Takt von 17,35µS also einen
Overflow bei 4,4ms ?

In der Overflow Routine:
 dec delay1 ; Wurde vorher auf Dec 68 Gesetzt damit hab ich ca. 301ms
 tst delay1
 brne goout

 ldi delay1, 68 ; Wieder für nächste runde auf 68 setzen

 in xl, TCNT1L
 in xh, TCNT1H ; Zählerstand von Timer 1 Auslesen

 sts Timer1MSB, xh ; ab ins SRAM für Display Routine
 sts Timer1LSB, xl

 clr xl
 clr xh
 out TCNT1H, xh
 out TCNT1L, xl

Ende von Timer0 Overflow
SREG etc hab ich gesichert. Allerdings bekomme ich nur misst... raus
was ich allerdings mit dem ICP Capture nicht hatte (ruhiger und
konstanter wert)

Verstehe das einfach nicht...

Gruß Dennis

von ...HanneS... (Gast)


Lesenswert?

Timer0 für Zeitbasis nehmen

Timer 1 als Zähler schalten, externen Zähltakt an T1 einstellen,
Impulsleitung an T1 anschließen.

Alle 300ms Timer1 auslesen und danach löschen, das Ausgelesene in
Ziffern umwandeln, ans LCD schicken, 2 Nullen hinterher schicken,
fertig...

...

von Dennis Brücke (Gast)


Lesenswert?

Hi Hannes,

sorry wenn ich vieleicht "Nerve" aber hab ich das Oben nicht gemacht
?

Gruß Dennis

P.S.: Gehöre nicht zu den Carmoddern ;) Denke sowas brauch ich bei mir
nicht einbauen... ist halt nur ein gefallen für einen bekannten.

von ...HanneS... (Gast)


Lesenswert?

Dennis, wie du das realisierst ist doch deine Sache. Wir diskutieren
hier einfach nur über die Möglichkeiten. Wenn ich das machen müsste,
dann fiele mir eben diese Lösung ein. Es geht sicher auch anders.

Mit der Mathematik auf ASM-Ebene habe ich es auch nicht so. Daher
vermeide ich sie wenn es geht.
Wenn ich also eine Frequenz bzw. Drehzahl (ist das gleiche, nur eben
nicht auf die Sekunde bezogen sondern auf die Minute) anzeigen möchte,
dann reiße ich mich nicht darum, die Zeit zwischen den Impulsen zu
erfassen und dann den Kehrwert auszurechnen, wenn ich die Möglichkeit
habe, die Umdrehungen pro Zeiteinheit zu erfassen. Aber wie gesagt, ich
gehe da von mir aus. Wenn du das anders machst, so ist das für mich kein
Problem.

Gruß...
...HanneS...

von Andi (Gast)


Lesenswert?

Hi Dennis!

Was hälts Du davon, wenn Du einfach einen 16 Bit-Timer von z. B.
14400Hz machst (Prescaler = 256).
Den Drehgeber vom Motor oder Zündspule, was auch immer, an Int0 mit
aktivem Interrupt.
Immer, wenn am Int0 ein Int. ausgelöst wird, merkt sich die Int0-ISR
(in ein Registerpaar oder Bytepaar im SRAM) den Timerwert von Timer1
und setzt Timer 1 zurück (auf 0x0000).
Dadurch hast Du die Zeit in 1/14400 Sekunden zwischen 2 Drehsignalen.
Im Main-Prog nimmst Du einfach den gemerkten Zeitwert und benutzt ihn
als Divisor für eine Division wie z. B.:

 432000 / Zeitwert

Wenn der Motor alle 2 umdrehungen 1 Signal abgibt ergibt das bei einer
Zeitlänge von 144/14400 Sekunden 3000RPM.
Bei einer Zeitlänge von 143/14400 Sekunden ergibt es 3020RPM.

Wenn Du eine bessere Auflösung möchtest dann mißt Du einfach mittels
einem Zähler in der Int0-ISR die Zeit für mehr als von einem zum
nächsten Impuls z. B. für 4 Umdrehung die nächsten 2 für 8 Umdrehungen
die nächsten 4 Impulse.
Dadurch verdoppelt sich allerdings auch der Dividen von 432000 auf
864000 und 1728000.

Eine nötige 24Bit-Divisionsroutine, umgestellt vom original 16Bit auf
24Bit, kannst Du bei bedarf von mir haben.

Gruß
Andi

von Dennis Brücke (Gast)


Lesenswert?

Hi Andi,

das klingt auf jedenfall schonmal richtig gut ;)
Die Methodik von ...HanneS... hab ich gestern nochmal durchprobiert
(man sollte register die man benutzt nicht einfach so überschreiben
patsch)

Leider sind mir die 1000er und 100er Stellen zu ungenau.

Vorhher habe ich mittels ICP mir den Timerwert Geschnappt mit dem alten
wert subdrahiert die differenz abgespeichert. Und den neuen Timerwert
als alten abgespeichert für die nächste runde. Funktioniert gut bekomme
z.b. bei nem PC Lüfter ne Differenz von 25 Timertakten nur wie ich damit
jetzt halt weiter rechne...

Und ich denke mal da kommt jetzt deine Division ins spiel... mein
Problem ich vieleicht denkbar einfache mathematik...

Wie kommst du in deinem beispiel auf 430200 ? bzw. 144/14400
Die 14400 ist die f in Hz bei Prescaler 256 richtig ? Aber die 144 ?
Ist das der gezählte wert ?

Gruß Dennis

P.S.: @...HanneS... ich danke Dir und allen anderen auf jedenfall für

      die hilfe.

von Dennis Brücke (Gast)


Lesenswert?

@all,

ich möchte nur noch mal kurz Anmerken, ich verlange von keinem die
Aufgabe für mich zu Lösen oder den Code zu schreiben. Ich versuche es
Nur zu verstehen.

1.) Den Rechenweg
2.) die Vereinfachung um in ASM damit zu rechnen.

Dies ist für mich die wirklich 1. Rechenaufgabe die ich irgendwie mit
dem µC mache. Und irgendwo hab ich einfach einen Denkfehler drin. Das
ich mittlerweile schon nicht mehr mit dem Taschenrechner auf das
ergebnis komme. Wenn ich richtig gerechnet habe
(egal ob jetzt Drehzahlmesser oder irgendeine andere Frequenz)

Bekomme ich bei 1 Impuls / 2 UPM sprich bei 800upm eine Taktfrequenz
von 6,667 Hz. Wenn ich die Methode nutze mit fester Zeitbasis z.b.
300ms oder 500ms und die Impulse innerhalb dieser Zeitbasis zähle, hab
ich bei so einer "Langsamen Taktung"  eine zu hohe Ungenauigkeit
messe ich länger dann hab ich zwar eine höhere Genauigkeit aber auf
Kosten der Aktualisierungsgeschwindigkeit.

Also kommt ja nur die Möglichkeit in betracht wie Andi und ...HanneS...
(am Anfang) beschrieben hat die Zeit zwischen 2 Impulsen zu messen. Sehe
ich das dann Richtig das ich eine Dynamische Anzeigenaktualisierung
erhalte ?

(Langsam bei 800upm schnell bei 8000upm)

Also ist mein Problem ja nur noch das "Hochrechnen" der Zeit zwischen
Impulsen und der eigendlich UPM (oder frequenz * 60)

Und genau da hört es bei mir auf... Ich verstehe es einfach nicht. Die
Messung an sich Funktioniert. Ich kann mir den Zeitabstand zwischen den
Impulsen anzeigen lassen...

Gruß Dennis

von Michael (ein anderer) (Gast)


Lesenswert?

@Dennis Brücke:

Tja, Mathematik ist doch nicht so nutzlos, wie viele Schüler denken,
gell?

Also, hier eine exklusive, Pisa-Kompatible Einführung in Frequenz,
Drehzahl und Periodendauer:

1. Frequenz
===========

Frequenz bedeutet Ereignisse, Impulse oder Takte pro Zeiteinheit. D.h.
man zählt eine festgelegte Zeit lange die auftretende Ereignisse. Die
Anzahl der Impulse ist gleich der Frequenz.

Also z.B. 6 Schulstunden pro Tag. Oder 3 mal in's Kino pro Woche. Oder
einmal pro Jahr Geburtstag feieren. Oder auch fünf mal pro Stunde "Boah
ey!" sagen.

Das alles sind Frequenzen. Allerdings sind sie in verschieden langen
Zeiträumen gemessen und nicht direkt Vergleichbar. Darum hat man sich
entschieden, die Frequenz in Ereignisse pro Sekunde anzugeben. Zu ehren
des Herrn Hertz hat man diese Angabe "Hertz" getauft. Hertz bedeutet
also, Ereignisse, Impulse oder Takte pro Sekunde.

Und wie bekommt man nun die Frequenz raus für fünf mal pro Stunde
"Boah ey!" sagen?

Ganz einfach: Man muß nur wissen, wieviel Sekunden eine Stunde hat!

(Eine Stunde hat übrigens 3600 Sekunden. Warum das so ist, ist ein
anderes Thema und soll hier nicht weiter diskutiert werden...)

D.h. 5 mal "Boah ey!" pro Stunde ist das gleiche wie 5 mal "Boah
ey!" pro 3600 Sekunden!

Und wie bekommt nun endlich die Frequenz in Hertz raus, also "Boah
Ey!"s pro Sekunde?

Ganz einfach: Durch 3600 dividieren! Also:

5 / 3600 = 0,001389

Die "Boah Ey!" Frequenz beträgt also ca. 0,001389 Hertz.


2. Drehzahl
===========

Da man oft wissen möchte, wie schnell sich etwas dreht, und Angaben wie
"langsame", "schneller", "sau schnell" einfach zu ungenau sind,
hat man sich überlegt, man könnte doch eine gewisse Zeit lang die
Umdrehungen zählen und diese Zahl angeben.

Wenn Du oben aufgepasst hast, hast Du natürlich sofort bemerkt, dass
die Idee "Umdrehungen eine Zeit lang zu zählen", nichts anderes als
die Frequenz ist!

Aber: Aus verschiedene Gründen, z.B. weil die KFZ-Leute wussten, dass
der gemeine Autofahrer eine Abneigung gegen Kommas hat, haben die sich
entschieden, die Umdrehungen nicht eine Sekunde lang zu zählen und das
Ergebnis in Hertz anzugeben, sondern sie haben sich entschieden eine
Minute lang die Umdrehungen zu zählen. Da die KFZ-Leute etwas
Einfallslos sind, ist ihnen keine Einheit eingefallen, und sie sind
dabei geblieben, das Ergebnis als UPM anzugeben. UPM heisst nichts
anderes als "Umdrehungen pro Minute".

Und jetzt kommt der Clou: Umdrehungen pro Minute kann man in Hertz
umrechnen! Denn das haben wie ja oben schon gelernt.

Wenn sich also ein Motor, mit fetten 3000 Umdrehungen pro Minute dreht,
bedeutet das, dass sich der Motor mit 3000 Umdrehungen pro 60 Sekunden
dreht. Um das in Hertz umzurechnen, muss man wieder dividieren:

3000 / 60 = 50

Also, die Umdrehungsfrequenz des Motors ist in diesem Fall exakt 50
Hertz.


3. Periodendauer
================

Irgendwann einmal, wollte ein schlauer Mathematiker oder Physiker die
Umdrehungen eines Motors pro Minute bestimmen. Da aber besonders
Mathematiker sehr faule Menschen sind, und der Mathematiker nicht eine
Minute lang die Umdrehungen eines Motors zählen wollte hat er sich
etwas überlegt:

Wenn man weiss, das etwas 'n' mal pro Zeit 't' passiert, passiert
dieses Ereignis alle t/n Zeiteinheiten.

Also, wenn etwas 2 mal pro Sekunde vorkommt, ist der Abstand dieser
beiden Ereignisse 0,5 Sekunden. Und wenn etwas 50 mal pro Sekunde
vorkommt, ist der Abstand 1 / 50 = 0,02 Sekunden.

Wenn man also den Zeit-Abstand zwischen zwei Ereignissen kennt, kann
man ganz einfach die Frequenz bestimmen, in dem man schaut, wie oft
dieser Zeitabstand in einer Sekunde reinpasst.

Beispielsweise sollte ein PISA-Schüler alle 5 Minuten einen leichten
Schlag auf den Hinterkopf zur Erhöhung des Denkvermögens bekommen, und
der Mathematiker rechnet daraus sofort die die Frequenz aus, ohne erst
eine Stunde lang zu zählen wieviel Schläge das denn nun waren. Dazu
muss der Mathematiker natürlich wissen, dass eine Minute gleich 60
Sekunden ist, und somit 5 Minuten 300 Sekunden entsprechen (der
Mathematiker weiss das). Also:

1 / 300 = 0,0033

Die Frequenz der Schläge beträgt somit ca. 0,0033 Hertz.

Aber nun möchte der Mathematiker endlich die Umdrehungen seines neuen
Motors wissen, also besorgt er sich eine Stoppuhr, und macht auf der
Welle des Motors eine kleine Markierung. Sobald der Motor läuft, stopt
der Mathematiker mit seiner Stopuhr, wie lange die Markierung für eine
Umdrehung benötigt. Der Mathematiker stopt eine Zeit von 0,108
Sekunden. Daraus errechnet er jetzt erstmal die Frequenz:

1 / 0,108 = 9,259

Die Umdrehungsfrequenz beträgt also 9,259 Hertz. Der Motorenverkäufer
hat aber seinen Motor mit UPM beworben, weil er nicht mit dem Komma
umgehen kann. Der Mathematiker rechnet also ihm zuliebe die Frequenz in
Hertz noch in Umdrehungen pro Minute um. Der Mathematiker weiss nämlich,
dass sich der Motor in einer Minute 60 mal häufiger gedreht hat, als in
einer Sekunde. Also:

9,259 * 60 = 555,56

Der Motor dreht sich also mit 555,56 Umdrehungen pro Minute.


4. Ende
=======

Nun habe ich keine Lust mehr, die Geschichte weiter zu schreiben...

von ...HanneS... (Gast)


Lesenswert?

Denkanstoß:

Du brauchst eigentlich 2 Berechnungen:
- Bildung des Reziprokwertes der gemessenen Impulsabstandszeit
  (1/t)
- Kalibrierung auf die anzuzeigende Maßeinheit.

Wenn du diese zusammenfasst, musst du eine große Konstante (in der die
Umrechnung auf deine Maßeinheit RPM steckt) durch deine gemessene Zeit
dividieren.

Da es dir vorrangig nicht darum geht, irgendwelchen kryptischen Code
unverstanden abzukupfern müsstest du die Division erstmal ganz einfach
beginnen. Dauert zwar, zeigt dir aber das Problem und lässt sich dann
optimieren.

Wie dividiert man nun ohne Taschenrechner und wenn man das "Kleine
Einmaleins" nicht kennt??

Man subtrahiert (in einer Schleife) solange den Divisor vom Dividenden
(und zählt dabei die Subtraktionen), bis der Dividend negativ wird. Da
man nun eimal zuviel subtrahiert hat, nimmt man die letzte Zählung
zurück.

Wenn du das nachvollziehen kannst, kannst du es optimieren, indem du
(binär, nicht dezimal) anfängst Stellen zu schieben. Damit werden es
bedeutend weniger Schleifendurchläufe und es geht schneller, wird aber
auch schnell unübersichtlicher bzw. schwerer durchschaubar.

...

von ...HanneS... (Gast)


Lesenswert?

@Andi:

Der war gut...

...HanneS...

von ...HanneS... (Gast)


Lesenswert?

Ups...

Nix Andi, Anderer Michael war gemeint... - Sorry... (schäm)

...

von Dennis Brücke (Gast)


Lesenswert?

@Michael,

habe ja kein Problem damit wenn ich etwas nicht verstehe das es mir
jemand erklären muss... aber es auf so eine Art zu tun finde ich
einfach albern und auch ein wenig respektlos vor anderen Menschen die
evtl. nicht ganz so viel Ahnung haben wie einer selbst. Wenn Du meinen
Beitrag darüber genauer gelesen hättest, hättest Du auch gemerkt das
ich schon in etwa 1 + 1 zusammenzählen kann und weis was eine Frequenz
ist... aus dem "boa ey" Alter bin ich schon lange raus. Abgesehen
davon das der letzte Teil doch ein wenig Informativ war.

Dennoch ein höffliches Danke.

@ ..HanneS,

danke für den Denkanstoß dieser hat mir sehr geholfen und ich werde
mich heute abend mal wieder hinsetzen und ausprobieren.

Ist ja im Prinzip wie die BCD Arimetik ?! Nur nicht mit Konstanten
sondern mit Messwerten ?!

Gruß Dennis

von ...HanneS... (Gast)


Lesenswert?

Hi Dennis...

Bei BCD-Umwandlung muss man auch dividieren, zwar durch Zehnerpotenzen,
aber Division ist das auch. Und Division ist erstmal wiederholte
Subtraktion, die man (wenn man sie richtig verstanden hat) etwas
optimieren kann.

Nochmal zu dem "Anderen Michael" seinen Beitrag. Ich finde ihn toll,
da sachlich richtige (und verdammt wichtige!!!) Informationen so
herrlich sarkastisch verpackt wurden. Wenn wir Beide hier am
Kaffeetisch darüber diskutiert hätten, dann hätte ich sicherlich auch
so überspitzt (sarkastisch) diskutiert. Ich mag nunmal diese Art. Sowas
ist mir hundertmal lieber als ein hochwissenschaftlicher Vortrag den
(fast) niemand versteht. Du brauchst dich dadurch nicht angegriffen
fühlen. Sieh es einfach als "Satire mit Inhalt".

Gruß...
...HanneS...

von Michael (ein anderer) (Gast)


Lesenswert?

@Dennis Brücke:

Also als wir noch Kinder waren, teilweise sogar noch als Jugendliche,
hat uns so mancher (Erwachsener) das Sprichwort: "Betroffene Hunde
bellen!" um die Ohren gehauen. Das hat bei uns meisten einen gewissen
Gegenprotest hervorgerufen, weil stets ein Quäntchen Wahrheit dran war.


;->

von Dennis Brücke (Gast)


Lesenswert?

@ Michael,

nur das ich nicht gebellt habe, sondern nur ein wenig geknurrt ;)
ok ...HanneS... mag recht haben "War vieleicht nur Satire von Dir"

Also ;)

Gruß Dennis

von Dennis Brücke (Gast)


Lesenswert?

@Andi,

danke Dir nochmal für die Formel oben. Habe das jetzt mal bei mir
ausprobiert und einfach mal 14400 Hz * 60 als 24bit Zahl in meinen
Registern hinterlegt. (864000)

Leider hab ich jetzt noch das Problem, das die Sprünge immer um die 256
betragen. Also hab ich nochmal die division im Simulator Probiert dort
hab ich schon von vorne rein einen rechenfehler drin... ich denke mal
das es an meiner Divisionsroutine liegt finde aber den fehler nicht so
richtig.

;*********************************************************************** 
*************************************************
;.def DividentLSB  = r0
;.def DividentMSB  = r1
;.def DividentHSB  = r2
;.def DivisorLSB    = r3
;.def DivisorMSB    = r4
;
;.def HilfsLSB    = r5
;.def HilfsMSB    = r6
;
;.def ErgebnisLSB  = r7
;.def ErgebnisMSB  = r8
;*********************************************************************** 
*************************************************
division:

    clr HilfsLSB
    clr HilfsMSB
    clr ErgebnisLSB
    clr ErgebnisMSB
    inc ErgebnisLSB

div_a:
    clc
    rol DividentLSB
    rol DividentMSB
    rol DividentHSB

    rol HilfsLSB
    rol HilfsMSB
    brcs div_b

    cp HilfsLSB, DivisorLSB
    cpc HilfsMSB, DivisorMSB
    brcs div_c

div_b:
    sub HilfsLSB, DivisorLSB
    sbc HilfsMSB, DivisorMSB

    sec

    rjmp div_d

div_c:
    clc
div_d:
    rol ErgebnisLSB
    rol ErgebnisMSB
    brcc div_a

ret


Sorry ist noch nicht kommentiert.

Gruß Dennis

von Andi (Gast)


Lesenswert?

Hi!

Find ich gut, das Du Deine eigene 24 Bit-Division machst.
Ich habe einfach die 16/16-Division (Div16u) aus dem 'avr200.asm'
genommen und auf 24 Bit 'aufgebohrt'.
Habe die umgebaute Routine gerade nicht zur Hand, erst heute Abend.

Gruß
Andi

von Dennis Brücke (Gast)


Lesenswert?

@Andi,

ganz selber gemacht ist sie nicht, habe Sie von avr-asm-tutorial
ausgedruckt -> versucht zu verstehen -> und selber auf 24bit
geschrieben. Allerdings ist wie gesagt noch ein grober fehler drin...
z.b. 432000 / 144 = 3000 kommt bei mir 2816 raus... :( grmpf

Gruß Dennis

von Andi (Gast)


Angehängte Dateien:

Lesenswert?

Hi Dennis!

Im Anhang die Routine für 24 Bit-Divisionen.

Der Dividend kommt in die Register DD24u0, DD24u1 und DD24u2 (r16,r17
und r18) der Divisor (gemessene Zeit) in DV24u0, DV24u1 und DV24u2
(r19, r20 und r21).
Das Ergebnis (Result) ist dann in DRes24u0, DRes24u1 und DRes24u2 (r16,
r17 und r18) und der Rest (Remainder) in DRem24u0, DRem24u1 und DRem24u0
(r13, r14 und r15).
Natürlich ist für Dich nur das Result (DRes24u0 (low-Byte) und DRes24u1
(high-Byte)) interessant das das Ergebnis - die RPM - immer nur ein 16
Bit-Ergebnis sind.

Die oben genannten 144/14400 Sekunden ist das gleiche wie 10/1000, also
10ms.
Teilt man nun 432000  144 ist es das selbe wie 30000  10, Ergebnis
bei beiden = 3000RPM.
Der Dividend ist für eine halbe Minute ausgelegt da Du ja 1 Signal für
2 Umdrehungen bekommst.
Dadurch verdoppelt sich dann auch gleich das Ergebnis da die
Umdrehungen bei 1 Signal auch 2, das doppelte, sind.
Die Auflösung, also die Stufung, kannst Du noch verringern in dem Du
mittels interner Zählvariable im Int0 nicht bis zum nächten Signal die
Zeit mist, sondern die Zeit für 2 oder 4 Signale.
Dazu muß dann der Dividend das doppelte oder 4 fache sein.

Zeiten für ein Signal:
 432000 / 144 = 3000
 432000 / 143 = 3020

Bei 2 Signalen:
 864000 / 288 = 3000
 864000 / 287 = 3010

Bei 3 Signalen:
 1728000 / 576 = 3000
 1728000 / 575 = 3005

Die Stufung wird bei höheren Drehzahlen allerdings immer größer also
mist man lieber die Zeit von mehr als einem Signal und bezieht das in
der Division mit ein.

Man kann die Auflösung auch noch zusätzlich mit einer
Mittelwertberechnung verfeinern:

 RPMMittel = (RPMittel + RPMNew) / 2 oder
              RPMittel / 2 + RPMNew /2

Gruß
Andi

von Andi (Gast)


Lesenswert?

Hoppla... der Anfang der Registerdefinition sollte so aussehen:

 .def  drem24u0=r13
 .def  drem24u1=r14
 .def  drem24u2=r15

Keine Ahnung, warum ich das mal andersrum gemacht hatte.

Gruß
Andi

von Dennis Brücke (Gast)


Lesenswert?

@Andi,

danke Dir für Deine Routine,

ich habe jetzt mir App200 von Atmel angeschaut. Mir nochmal den Code
von avr-asm-tutorial angeschaut. Meine Routine läuft einfach nicht, sie
rechnet an irgendeiner stelle falsch... :( Ich finde den Fehler einfach
nicht, hat nicht irgendeiner eine Idee was ich falsch gemacht habe ?

Entweder Raff ich es einfach nicht oder es so ein trivialer fehler das
es schon peinlich ist...

Help pls.

Gruß Dennis

von Andi (Gast)


Lesenswert?

Hi Dennis!

Wenn Du schon die 16 Bit-Version auf 24 Bit umstellst, mußt Du
natürlich alle 4 Dinge, Dividend, Divisor, Result und Remainder, auf 24
Bit erweitern, also für jedes dieser Dinge ein Register dazu machen.
Wo vorher 2 ROL-Befehle waren gehört ein dritter mit einem weiteren
Register drunter, wo sub und sbc war gehört ein weiteres sbc drunter
mit zusätzlichem Register.

Die Routine Div24u benutzt Shared-Register (Dividend und Result) und
spart damit 3 Register ein.

Um eine ASM-Division zu verstehen muß man auf nen Blatt Papier (oder
Editor) einfach mal Dividend und Divisor Bitweise darstellen und dann
Befehl für Befehl das machen was in der Routine steht und auch nach dem
Carry-Bit Entscheidungen treffen.

Gruß
Andi

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.