Hallo,
Ich habe eine Frage zu einem Projekt: Ich hab einen Controller, der alle
20 ms ein Sensorsignal einliest. Dieses Signal wird in einem Ringpuffer
gespeichert, aufsummiert und dann durch die grösse des Ringpuffers
geteilt. Also ein klassisches Mittelwertfilter. Dieses gefilterte Signal
wird zur Anzeige auf einem Display benötigt.
Nun besteht meine Aufgabe diesen Mittelwertfilter durch ein IIR Filter
zu ersetzen. Mit den Filtern kenne ich mich etwas aus, auch wenn bisher
nur in der Theorie.
Ich habe auch schon einen IIR Filter programmiert und er liefert mir
fast identische Werte wie der Mittelwertfilter. Da ich das ganze nun
simulieren möchte um den optimalen Filter für diese Anwendung zu finden
benötige ich ja die Grenzfrequenz des Sensors. Da ist mein grosses
Problem, da ich keinen Ansatz finde wie ich diese Frequenz bestimmen
könnte.
Für ein paar Anregungen wäre ich sehr dankbar!
Pit schrieb:> benötige ich ja die Grenzfrequenz des Sensors. Da ist mein grosses> Problem, da ich keinen Ansatz finde wie ich diese Frequenz bestimmen> könnte.
Du musst viele Daten aufzeichnen und dann mit einer FFT nachschauen,
welche Frequenzen da so auftreten. Aber eigentlich ist die Grenzfrequenz
eines Sensors uninteressant. Sie muss nur hoch genug sein, um alle
gewünschten Signale der Strecke/des Prüflings aufnehmen zu können.
Oder du verrätst einfach, was das für ein geheimer Sensor ist und an
welcher Strecke der montiert ist. Evtl. hat schon mal jemand sowas
ähnliches gemacht...
Pit schrieb:> Es handelt sich um einen Drehzahlsensor, der mir 100 Pulse pro Umdrehung> liefert. Die max. Drehzahl des Motors liegt bei ca. 350 1/min.
Das sind 583 Hz. Ich glaube das ist für jede Art von Sensor die ich mir
vorstellen kann ziemlich langsam.
Pit schrieb:> Ich hab einen Controller, der alle> 20 ms ein Sensorsignal einliest.
Der Drehzahlsensor erhält Impulse mit max. 583 Hz und Dein Controller
liest mit 50 Hz aus.
Pit schrieb:> Dieses Signal wird in einem Ringpuffer> gespeichert, aufsummiert und dann durch die grösse des Ringpuffers> geteilt. Also ein klassisches Mittelwertfilter. Dieses gefilterte Signal> wird zur Anzeige auf einem Display benötigt.
Also, alle 20 ms liest Du den Ringpuffer aus und ermittelst Deinen
Mittelwert. Im Ringpuffer kann man ja irgendwann die ersten Werte
überschreiben. Verwaltest Du da einen Zeiger der den Anfang und ggf. das
Ende speichert?
Wozu ein Ringpuffer. Zähle doch einfach die Impulse und bilde alle 20 ms
den Mittelwert.
Gruss Klaus.
Guten Morgen,
Die Pulse werden zuerst in 1/min umgerechnet und dann in den Puffer
geschrieben.
Ja der Ringpuffer wird mit Zeigern realisiert und die Tiefe ist über ein
define bestimmt.
Ich frage mich, WAS das eigentliche Problem hier ist. WARUM soll denn
hier das Sensorsignal gefiltert werden? WAS soll mit diesem Filter
erreicht werden?
Denn wenn der Sensor mit 500Hz misst und mit 50Hz ausgelesen wird, dann
muss der Sensor schon "intelligent" sein. Eine Filterung hinterher ist
nur noch Gebastel mit Tiefpassfunktion...
Hallo,
du brauchst einmal mindestens ein Tiefpassfilter, dass dir relevante
Anteile ab fabtast/2 herausfiltert, damit das Abtasttheorem erfüllt ist.
Diese kann man digital überhaupt nicht filtern, weil sie sich an fabtast
in deinen Nutzsignalanteil "spiegeln" können - auch nach DC.
Ob es solche Anteile gibt, kannst du mit einem Oszilloskop mit
FFT-Funktion prüfen. Die Filterordnung muss dann so gewählt werden, dass
der Fehler kleiner als der maximal zulässige Fehler ist - gehe davon
aus, das die gemessenen hochfrequenten Anteile 1:1 im Nutzsignalbereich
sein werden.
Am besten die Abtastfrequenz sehr viel größer wählen als die max.
Sensorsignalfrequenz (d.h. die Frequenz von den Anteilen, die du
wirklich haben möchtest), dann kann man das Filter mit niedrigerer
Ordnung bauen. z.B. 5kHz für 50 Hz, wenn es leicht möglich ist.
Um niederfrequentere Anteile kann sich dein IIR-Filter kümmern.
Hallo,
da habe ich Käse geschrieben.
Heißen muss es natürlich dass die Abtastfrequenz 5kHz sein müsste, nicht
die Grenzfrequenz des Filters. Die muss natürlich kleiner sein, z.B.
250Hz.
Man sollte nicht so früh aufstehen...
Lothar Miller schrieb:> Ich frage mich, WAS das eigentliche Problem hier ist. WARUM soll denn> hier das Sensorsignal gefiltert werden? WAS soll mit diesem Filter> erreicht werden?
Zuerst geht es halt um die Anzeige des Wertes auf einem Display. Man
will halt nicht laufend Sprünge der Drehzhal sehen. Hier könnte man
natürlich auch an der Updaterate des Displays drehen. Später soll die
Drehzahl in andere Rechnungen eingehen und daher will man die Drehzahl
glätten.
Pit schrieb:> Es handelt sich um einen Drehzahlsensor, der mir 100 Pulse pro Umdrehung> liefert. Die max. Drehzahl des Motors liegt bei ca. 350 1/min.
Bei einer Drehzahlmessung braucht man kein Filter. Man mißt einfach so
lange wie möglich.
Da es angezeigt werden soll, ist eine Meßzeit von 200..500ms
ergonomisch.
Pit schrieb:> Man> will halt nicht laufend Sprünge der Drehzhal sehen.
Wo sollen die Sprünge denn herkommen?
Mechanische Systeme haben eine Trägheit.
Bzw. wenn man eine Notbremsung macht, will man den "Sprung" auch sofort
sehen und die Anzeige nicht sekundenlang hinterher schleichen lassen.
Man will einfach nicht das "gezappele" von 280 1/min auf 279 1/min oder
281 1/min sehen. Letztendlich ist es auch egal, ob sowas Sinn macht oder
nicht. Meine Aufgabe besteht darin das IIR Filter zu realisieren.
Zur Abtastung: Die Frequenz des Sensors kommt von einer Biosfunktion des
Controllers. Abgetastet wird mit 6,5 kHz und ein analoger Tiefpass ist
schon integriert. Ich rufe die Funktion, die mir die Frequenz gibt alle
20 ms auf. Sorry dafür!
Ergo ist der Abtastvorgang vollkommen ok aber nun bin ich wieder am
Punkt, wie ich meine Daten filtere. Wahrscheinlich nimmt man einfach ein
Filterdesigntool, packt seine Daten rein und implementiert das
Ergebnis?!
Pit schrieb:> Man will einfach nicht das "gezappele" von 280 1/min auf 279 1/min oder> 281 1/min sehen. Letztendlich ist es auch egal, ob sowas Sinn macht oder> nicht. Meine Aufgabe besteht darin das IIR Filter zu realisieren.
Das ist aber ein rein numerisches Problem und verschiebt sich durch
einen Filter höchstens.
Was dir da eher Hilft ist ein Threshold für Übernahmen in der Anzeige.
Pit schrieb:> Man will einfach nicht das "gezappele" von 280 1/min auf 279 1/min oder> 281 1/min sehen.
Schwankungen um 1 LSB sind bei allen digitalen Messungen Pflicht, daran
kannst Du nichts ändern.
Du könntest einen Schlupf programmieren, d.h. ein neuer Wert wird erst
übernommen, wenn er um 2 LSB abweicht.
Ehe man filtert, muß man erstmal wissen, was man filtern soll.
D.h. man muß wissen, wie und welche Störungen entstehen.
Da Du was von BIOS sagst, vermute ich mal, daß die Meßmethode ungünstig
ist und einen Jitter erzeugt. Die einfachste Art der Filterung wäre
dann, den Jitter zu verringern, z.B. durch eine bessere Meßmethode.
Z.B. haben viele MCs eine Input Capture Unit. Damit kann man Drehzahlen
unabhängig von Programmlaufzeiten und Interruptlatenzen messen, also
jitterfrei.