Hallo Zusammen, ich bin bei der Arbeit an einem Drehzahlmesser auf folgendes Problem gestoßen: Ich kriege pro Umdrehung einen Impuls und ich messe die Zeit zw. aufeinanderfolgenden Impulsen um die Drehzahl zu berechnen: RPM = (timer_frequency * 60) / ticks Für einen Eingangsfilter der für die nächste Messung nur ein Intervall [old_RPM - 100; old_RPM + 100] erlaubt müsste ich nun wissen, wieviel ticks denn (old_RPM +/- 100) entspricht. Der direkte Weg ist klar: 1. ticks in RPM : RPM = (timer_frequency * 60) / ticks 2. RPM = RPM + 100 : RPM += 100 3. RPM in ticks : filter_high = (timer_frequency * 60) / RPM Ich würde hier gerne die fiesen Divisionen vermeiden! Kennt jemand ne Methode wie ich direkt im Zeitbereich rechnen kann? Vielen Dank schigndix
Vielleicht hat dich auch niemand verstanden. Ich jedenfalls nicht. Da Frequenz der Kehrwert von Zeit ist, kommst du bei Umrechnung Zeit => Frequenz um eine Division schlecht herum, wenn alles was du hast eine Zeit ist. Wenn du allerdings die Anzahl Impulse pro Zeiteinheit misst, dann hast du die Frequenz direkt. Nur möglicherweise etwas ungenau.
Deine Timer-Frequenz ist ja sicher konstant. Warum rechnest du dann nicht einfach: filter_high = ticks + (timer_frequency * 60) / 100 ticks ist dabei der Wert des letzten Durchlaufs und der hintere Teil der Gleichung ist konstant und kann somit doch direkt zur Compile-Zeit berechnet werden. Ich bin mir nun nicht sicher, ob ich dein Problem richtig verstanden habe.
es geht auch ohne Division (hatte genau das gleiche Problem) ziehe einfach den Teiler von der Zahl ab bis die zahl <= 0 ist und zähle dabei die Anzahl der Subtraktionen. (Ich weiss es ist nicht sehr elegant)
@Peter: Das ist auch nichts anderes als eine Division, nur i.A. weniger effizient. @Moi: Die übliche binäre Division funktioniert so wie die schriftliche, nur eben binär statt dezimal. Das ist nicht ganz das gleiche wie solange abziehen bis 0 rauskommt (das könnte bei einer 64bit Division ein bischen dauern).
@Andreas Kaiser @Moi Ja das ist mir ja auch klar, aber das kann man in einer kleinen Schleife ohne libs machen, denn von selber kann es ja der AVR nicht. Und wenn es für die Anzeige ist (max 5 mal in der sec), Reicht die geschwindigkeit auch locker aus. Beim letzten Projekt habe ich auch auf die Binäre Division gesetzt, weil die Geschwindigkeit wichtiger war.
wie wärs mit ner approximation mit summe (1/2^n) mit entsprechenden n? das entspricht einfach n rechtsshifts also beispielsweise ist x/3,5 ungefähr = (x+x/8+x/32)/4
Ok, ich hab mich wohl etwas verworren ausgedrückt.... mein Eingangsfilter erlaubt nur ein Intervall im Zeitbereich (in ticks). Die Intevall-Grenzen ergeben sich aber aus dem Frequenzbereich (in RPM nämlich +/- 100RPM zum letzten Wert) Es ist mir wichtiger den die Intervall-Grenzen schnell zu berechnen anstelle von super genau! @Thorsten: Wie kommst du auf die Formel? Ich krieg da auf alle Fälle nix Richtiges bei raus... @ballkack : wie soll ich eine Division approximiern wenn ich den Divisor nicht kenne?
@ Schigndix Z. Die Formel ist so auch falsch. Mir war deine Problemstellung nicht ganz klar und ich bin daher auf diese falsche Formel gekommen. Daher jetzt eine andere Idee: Wenn es dir auf Geschwindigkeit ankommt, Genauigkeit aber nicht so wichtig ist, dann wäre vielleicht eine Lookup-Table das beste.
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.