mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Konvertierung Zeitbereich/Frequenzbereich


Autor: Schigndix Z. (schigndix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Schigndix Z. (schigndix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...keiner ne Idee?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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)

Autor: Moi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist denn bitte sonst eine Division?!

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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).

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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.

Autor: ballkack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Schigndix Z. (schigndix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.