Forum: Mikrocontroller und Digitale Elektronik welche Signalfilterung für meine Messdaten?


von SP90 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich messe mit einem Raspberry Pi eine Drehzahl indem ich Interrupts 
zähle und dann auf U/Min umrechne. Anbei ein beispielhafter Verlauf der 
Drehzahl (oben) und der Interrupts (unten). Das Problem ist, dass die 
Messwerte sehr stark zappeln. Ich glaube das kommt daher, dass man von 
einem sehr kurzen Zeitraum in dem man die Interrupts zählt (ca. 100-150 
ms) auf eine Minute hochrechnet. Der Intervall muss aber kurz sein, da 
ich eine flüssige Anzeige möchte. Aber ein Interrupt mehr oder weniger 
macht dann in U/Min viel aus.

Ich habe versucht das ganze mit einem Tiefpass zu glätten. Sowohl die 
Drehzahl selbst, als auch die Interrupts. Allerdings wird das Ganze viel 
zu träge bevor das Signal genug geglättet ist.

Gibts da eine zielführendere Methode der Signalfilterung? Oder 
vielleicht überhaupt einen anderen Ansatz?

Vielen Dank und schönen Abend noch!

von MaWin (Gast)


Lesenswert?

Simple moving average oder exponential moving average.

von Wolfgang (Gast)


Lesenswert?

SP90 schrieb:
> Anbei ein beispielhafter Verlauf der Drehzahl (oben) und der
> Interrupts (unten).

Jetzt fehlt nur noch eine vernünftige Zeitachse, um beurteilen zu 
können, wie die Dynamik der Daten in Relation zu deiner gewünschten 
Zeitauflösung steht. Was verwendest du als Interruptquelle?
Und warum zählst du nur die Interrupts, statt jedem Interrupt einen 
Timestamp zuzuordnen?

von A. S. (Gast)


Lesenswert?

Du musst Dir klar werden, warum die Messwerte zappeln.

Ein Verlorener Interrupt geht gar nicht --> dann ist die Messung 
wertlos.

Vermutlich musst Du Dich mit "Fehlerrechnung" bzw. "Auflösung" 
beschäftigen.

Meist zappeln die Werte, weil die Auflösung der Messung (z.B. 1ms) und 
der Messjitter (z.B. Verzögerung des Interrupts) zu groß sind. Dass 
musst Du herausfinden/messen und Dir vergegenwärtigen 
(ausrechnen/aufmalen). (Was macht eine Einheit mehr oder weniger aus)

(Der Mess-Jitter ist etwas anderes als Genauigkeit, da der Wert in der 
einen loop zu lang, in der nächsten dann vermutlich zu kurz wird)

Glätten kannst Du erst dann und nur nachdem Du Dir klar wirst, was Du 
sehen willst und was nicht.

von Wolfgang (Gast)


Lesenswert?

SP90 schrieb:
> Gibts da eine zielführendere Methode der Signalfilterung?

Kannst du akausale Filter verwenden oder muss der geglättete Wert für 
die Drehzahl live zur Verfügung stehen?

von Gerd E. (robberknight)


Lesenswert?

Ich könnte mir vorstellen daß der Interrupt-Jitter hier einiges 
ausmacht. Ein normales Linux ist halt kein Echtzeit-OS.

Vorschlag: nimm einen Mikrocontroller, z.B. irgendeinen kleinen STM32 
den Du grad zur Hand hast. Dort auch keine Interrupts nehmen, sondern 2 
Timer. Der eine als Referenz, hochgezählt mit dem Takt des 
Mikrocontrollers (oder einem Teiler davon), der andere zählt immer bei 
Deinen Umdrehungspulsen eins hoch. Dann alle n Events des 
Referenzzählers den Umdrehungszähler auslesen und an den Raspi senden 
(z.B. per UART).

Am besten Timer verwenden die in Hardware koppelbar sind, also der 
Referenzzähler löst das Auslesen des Pulszählers in der Hardware aus. 
Dann ist es taktgenau. Aber ob das wirklich nötig ist hängt von den zu 
messenden Frequenzen ab.

Alternativ geht auch Input-Capture. Also der Zähler im Mikrocontroller 
zählt mit dem Takt des Controllers hoch. Immer wenn Dein 
Umdrehungs-Event kommt, wird der aktuelle Zählerstand in ein Register 
gespeichert. Jetzt kannst Du das Register per Interrupt auslesen oder 
per DMA in einen Puffer schreiben lassen. Das ist bei langsameren Events 
(im Verhältnis zur Controllerfrequenz) besser geeignet.

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

SP90 schrieb:
> ch glaube das kommt daher, dass man von
> einem sehr kurzen Zeitraum in dem man die Interrupts zählt (ca. 100-150
> ms) auf eine Minute hochrechnet.

Das denke ich auch. Wenn sich dein Hauptbereich der Interrupts in so 
einem Zeitintervall im Bereich 5 bis 10 abspielt, ist das einfach eine 
zu geringe Auflösung. Das wirst du mit Filterung nur sehr begrenzt 
kompensieren können. Die Frage ist, ob du mechanisch dafür sorgen 
kannst, dass nicht nur ein Interrupt pro Umdrehung ausgelöst wird.

von Achim M. (minifloat)


Lesenswert?

Was für einen Sensor bzw. Messwertaufnehmer benutzt du denn?
Wenn du einen Winkelsensor hast, ginge das ganze über Differenzieren des 
überstrichenen Winkels und Abtasten in festem Intervall eventuell 
besser.

Wenn du bei interruptbasierter Auswertung und im Prinzip Zeitmessung 
bleibst, bringt's vielleicht ein Dezimationsfilter innerhalb des festen 
Zeitrasters? Die Erfassung geht ja prinzipbedingt schneller als die 
Anzeige und Weiterverarbeitung.

mfg mf

von Georg (Gast)


Lesenswert?

SP90 schrieb:
> Ich glaube das kommt daher, dass man von
> einem sehr kurzen Zeitraum in dem man die Interrupts zählt (ca. 100-150
> ms) auf eine Minute hochrechnet

Dann ist schon die Messung ungeeignet, da helfen Filter nicht mehr viel. 
In so einem Fall zählt man nicht Impulse, sondern misst den Abstand 
zwischen den Impulsen - also Periodendauer statt Frequqnz, das macht man 
auch bei Frequenzmessungen so. Die Periodendauer lässt sich praktisch 
beliebig genau messen, das hängt nur von der Hardware ab, während die 
Zählung von Perioden in einem festen Intervall prinzipiell beschränkt 
ist durch die Dauer des Intervalls und die Zahl der darin auftretenden 
Impulse, daran kann man nichts ändern ausser längere Intervalle zu 
nehmen.

Georg

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

SP90 schrieb:
> Ich glaube das kommt daher
Das solltest du ändern und in Gewissheit umwandeln.

> Das Problem ist, dass die Messwerte sehr stark zappeln.
Welche Sensorik hast du denn? Was für Werte bekommst du, wenn sich die 
Geschwindigkeit nicht ändert? Und was sagt ein Oszilloskop zum 
Sensorsignal?

von Andreas M. (amesser)


Lesenswert?

Gerd E. schrieb:
> Ich könnte mir vorstellen daß der Interrupt-Jitter hier einiges
> ausmacht. Ein normales Linux ist halt kein Echtzeit-OS.

Genauso ist es. Der typische Linux Scheduler Takt sind 100Hz bei Static 
Systick. ( früher waren es 10Hz) Du hast also mindestens 10% Jitter bei 
deinem Zeitintervall, alleine durch die Scheduler Auflösung. Wenn dein 
Linux Dynticks macht wirds noch ekeliger. Von parallelen Interrupten 
(z.B. MMC) usw wollen wir gar nicht erst sprechen.

Dann wurde oben schon die Anzahl der Ereignisse/Zeitfenster 
angesprochen. Die einfache Zählmethode steuert einen Fehler von 1/Anzahl 
Ereignisse bei. Besser wäre es daher die Zeitabstände zwischen n 
Interrupten (n darf durchaus auch 1 sein) zu messen und daraus dann die 
Drehzahl zu bestimmen. (Reziproke Frequenzmessung)

Bei Python vermutlich der einfachste Weg einer der beiden folgenden:

http://abyz.me.uk/rpi/pigpio/index.html
http://abyz.me.uk/lg/py_lgpio.html

Scheint so als ob der RPI keine Timer mit Capture Inputs hat, ergo 
eigentlich die falsche Platform dafür. Zumindest ist da wohl nichts 
dokumentiert, kann gar nicht glauben, dass der das nicht kann.

von SP90 (Gast)


Lesenswert?

Hallo,

und vielen Dank für die zahlreichen Antworten. Ich werd versuchen das 
genauer zu erklären bzw. drauf einzugehen.

Mein Programm ist in C# programmiert und läuft als UWP auf Windows IoT 
am Raspberry. Ich verwende einen DispatcherTimer um die GUI zu 
refreshen. Der ist nicht allzu genau, muss er dazu aber auch nicht. 
Daher kommt mein Intervall von ca. 100-150 ms. Daher läuft eine (genaue 
bzw. genauere) Stopwatch. Diese misst die Zeit zwischen den Timer-Ticks 
und wird mit jedem Tick wieder auf Null gesetzt und gestartet. Aus 
dieser Zeit und den Interrupts wird die Drehzahl in U/Min berechnet.


A. S. schrieb:
> (Was macht eine Einheit mehr oder weniger aus)

Ein Interrupt mehr oder weniger macht bei dem Intervall 200-300 U/Min 
aus.

MaWin schrieb:
> Simple moving average oder exponential moving average.

Das werd ich auf jeden Fall mal ausprobieren

Wolfgang schrieb:
> Jetzt fehlt nur noch eine vernünftige Zeitachse, um beurteilen zu
> können, wie die Dynamik der Daten in Relation zu deiner gewünschten
> Zeitauflösung steht.

Ja stimmt, die Zeit würde nicht schaden. Da aber der Intervall in etwa 
konstant ist würde sich die Achse nur als ganzes dehnen oder stauchen. 
Die Aufzeichnung war nur gedacht zur Bestimmung der Dämpfung des 
Tiefpassfilters. Werde ich noch ergänzen.

Wolfgang schrieb:
> Was verwendest du als Interruptquelle?

Am Ende der Schaltung is ein Transistor BC547B.

Wolfgang schrieb:
> Kannst du akausale Filter verwenden oder muss der geglättete Wert für
> die Drehzahl live zur Verfügung stehen?

Ich brauch die Drehzahl möglichst in Echtzeit.

Gerd E. schrieb:
> Vorschlag: nimm einen Mikrocontroller, z.B. irgendeinen kleinen STM32
> den Du grad zur Hand hast. Dort auch keine Interrupts nehmen, sondern 2
> Timer. Der eine als Referenz, hochgezählt mit dem Takt des
> Mikrocontrollers (oder einem Teiler davon), der andere zählt immer bei
> Deinen Umdrehungspulsen eins hoch. Dann alle n Events des
> Referenzzählers den Umdrehungszähler auslesen und an den Raspi senden
> (z.B. per UART).

War ursprünglich der Plan, den Arduino zu verwenden. Zusammen mit 
anderen Messdaten kommt der Wert über UART aber viel zu langsam (dürfte 
ein Windows Problem sein). Daher jetzt direkt am Raspi.

Rolf M. schrieb:
> SP90 schrieb:
>> ch glaube das kommt daher, dass man von
>> einem sehr kurzen Zeitraum in dem man die Interrupts zählt (ca. 100-150
>> ms) auf eine Minute hochrechnet.
>
> Das denke ich auch. Wenn sich dein Hauptbereich der Interrupts in so
> einem Zeitintervall im Bereich 5 bis 10 abspielt, ist das einfach eine
> zu geringe Auflösung. Das wirst du mit Filterung nur sehr begrenzt
> kompensieren können. Die Frage ist, ob du mechanisch dafür sorgen
> kannst, dass nicht nur ein Interrupt pro Umdrehung ausgelöst wird.

Ja stimmt, die Auflösung ist zu gering. Ich bekomm aber Systembedingt 
nur zwei Interrupts pro Umdrehung.

Georg schrieb:
> SP90 schrieb:
>> Ich glaube das kommt daher, dass man von
>> einem sehr kurzen Zeitraum in dem man die Interrupts zählt (ca. 100-150
>> ms) auf eine Minute hochrechnet
>
> Dann ist schon die Messung ungeeignet, da helfen Filter nicht mehr viel.
> In so einem Fall zählt man nicht Impulse, sondern misst den Abstand
> zwischen den Impulsen - also Periodendauer statt Frequqnz, das macht man
> auch bei Frequenzmessungen so. Die Periodendauer lässt sich praktisch
> beliebig genau messen, das hängt nur von der Hardware ab, während die
> Zählung von Perioden in einem festen Intervall prinzipiell beschränkt
> ist durch die Dauer des Intervalls und die Zahl der darin auftretenden
> Impulse, daran kann man nichts ändern ausser längere Intervalle zu
> nehmen.
>
> Georg

Das klingt sehr interessant. Da wären wir wieder beim Vorschlag von 
Wolfgang jedem Interrupt einen Timestamp zuzuordnen, oder? Bzw. bei der 
"reziproken Frequenzmessung"? Nur wie mach ich das programmtechnisch? Da 
müsst ich mit der Stopwatch die Zeit zwischen den Interrupts messen und 
hab dann die Zeit pro halber Umdrehung die ich dann wieder in U/min 
umrechnen kann.

Lothar M. schrieb:
>> Das Problem ist, dass die Messwerte sehr stark zappeln.
> Welche Sensorik hast du denn? Was für Werte bekommst du, wenn sich die
> Geschwindigkeit nicht ändert? Und was sagt ein Oszilloskop zum
> Sensorsignal?

Ein Transistor, der den Pegel zwischen GND und 3,3 V schaltet. Genau so 
schauts am Oszi auch aus, also das passt soweit. Auch bei konstanter 
Drehzahl hab ich das "gezapple".


Und alles zum Thema Jitter übersteigt jetz mein Verständnis leider ein 
wenig.


Vielen Dank und schöne Grüße!

von Georg (Gast)


Lesenswert?

SP90 schrieb:
> Bzw. bei der
> "reziproken Frequenzmessung"? Nur wie mach ich das programmtechnisch?

Ich würde bei so einer Aufgabe einen Controller programmieren, 
wahrscheinlich mit einer Interruptroutine in Assembler, insofern kann 
ich dir mit Raspbi und C nicht viel weiterhelfen. Die Aussage mit der 
reziproken Frequenzmessung bleibt aber richtig, ergänzt um die Aussage 
dass der Raspbi zur Frequenzmessung weniger geeignet ist als so ziemlich 
jeder andere Microcontroller.

Daher findet man auch wenig zum Thema, aber hier ist die letzte Antwort 
interessant:
https://forum-raspberrypi.de/forum/thread/39413-frequenzmessung-mit-dem-raspberry-pi/

Ob der Raspbi eine Funktion hat zur Messung von Periodendauern, die 
nicht von Taskwechseln beeinträchtigt wird, weiss ich nicht, anscheinend 
nicht, sonst hätte das jemand erwähnt. Die meisten empfehlen einen 
anderen Controller oder einen eigenen kleinen Controller für die 
Frequenzmessung.

Georg

von Adam P. (adamap)


Lesenswert?

SP90 schrieb:
> Auch bei konstanter Drehzahl hab ich das "gezapple".

Aber das würde ja dann zusammenpassen,
ein bissel Versatz beim Scheduler, ein bissel Versatz bei dir und schon 
hast du ein "gezapple" bei den berechneten Werten (bei gleicher 
Drehzahl).

Wahrscheinlich wird nicht jeder meiner Meinung sein, aber wie wäre es 
mit folgender Idee:
Du nimmst dir nen kleinen µC der auf die Interrupts reagiert und die 
Berechnung durchführt.
Diese Werte sendest du dann an dein Raspi und fertig.

von Wolfgang (Gast)


Lesenswert?

Georg schrieb:
> Die meisten empfehlen einen anderen Controller oder einen eigenen kleinen
> Controller für die Frequenzmessung.

Bei so seltenen Ereignissen kommt man mit einer Frequenzmessung nicht 
weiter. Es ist besser, den Zeitabstand der Pulse zu messen und die 
Frequenz daraus zu berechnen.

von Faulenzer (Gast)


Lesenswert?

SP90 schrieb:
> Und alles zum Thema Jitter übersteigt jetz mein Verständnis leider ein
> wenig.

Hausaufgabe für Dich:

Du schreibst ein kleines Test-Progrämmchen, das z.B. für 20 Sekunden 
alle Interrupts sammelt. Bei jedem Interrupt liest Du Deinen (Mess-) 
Timer aus. Der Timer läuft ungestört durch. Du stoppst ihn nicht. Du 
merkst Dir also für jeden Interrupt den Zeitpunkt. D.h. Du sammelst eine 
Liste von Zeitstempeln.

Dann misst Du für die gewünschte Zeit eine konstante Drehzahl.

Diese Zeitstempel überführst Du nun in Dein gnuplot, Matlab, Python oder 
was auch immer Du benutzt. Dazu berechnest Du zu jedem Zeitstempel die 
Differenz zum vorherigen Zeitstempel (Delta). Du bekommst natürlich eine 
Differenz weniger, als Zeitstempel vorhanden sind.

Nun plotest Du auf der X-Achse mit der Zeit, zu jedem Zeitstempel auf 
der Y-Achse das Delta (Differenz zum vorhergehenden Zeitstempel).

Das was Du nun siehst, ist der Jitter. Wäre nett, wenn Du das hier auch 
postest.

von Georg (Gast)


Lesenswert?

Wolfgang schrieb:
> Bei so seltenen Ereignissen kommt man mit einer Frequenzmessung nicht
> weiter

Was genau verstehst du an "reziproker Frequenzmessung" nicht?

Georg

von Faulenzer (Gast)


Lesenswert?

Faulenzer schrieb:
> Nun plotest Du auf der X-Achse mit der Zeit, zu jedem Zeitstempel auf
> der Y-Achse das Delta (Differenz zum vorhergehenden Zeitstempel).

Ach Blödsinn.

Einfach auf der X-Achse für alle Zeitstempel das Delta auf der Y-Achse 
plotten. Also nicht die X-Position eines Punktes aus dem Wert des 
Zeitstempels bestimmen, sondern aus seiner laufenden Nummer.

von Peter D. (peda)


Lesenswert?

SP90 schrieb:
> ich messe mit einem Raspberry Pi eine Drehzahl indem ich Interrupts
> zähle und dann auf U/Min umrechne.

Typisch macht man das nicht so.
Man mißt die Zeit zwischen 2 Interrupts, d.h. die Periodendauer und 
rechnet sie in Drehzahl um.
Viele Timer habe dafür einen extra Capture Mode, der den Timestamp 
unabhängig von der Softwarelaufzeit abspeichert.
Bei höheren Drehzahlen kann man auch die Zeit für n Perioden messen.

von c-hater (Gast)


Lesenswert?

SP90 schrieb:

> Mein Programm ist in C# programmiert und läuft als UWP auf Windows IoT
> am Raspberry.

OMG. Hier kommen zu den Unwägbarkeiten des Task-Scheduling des OS 
(generelles Problem im Userspace) ja auch noch die Unwägbarkeiten des 
temporal extrem nichtdeterministischen Backends der Mono-Runtime hinzu.

Dieses Konstrukt ist völlig unbrauchbar zur Erfassung von Messwerten im 
für dich relevanten Bereich zeitlicher Auflösung.

Zumindest in dieser Form. Du musst entweder die eigentliche Messung auf 
externe Hardware auslagern oder irgendwas von der intern verfügbaren 
Hardware des Raspi (UART oder SPI) mit deterministischem Timing 
zweckentfremdet verwenden.

Anders geht's nicht.

von Wolfgang (Gast)


Lesenswert?

Georg schrieb:
> Ich würde bei so einer Aufgabe einen Controller programmieren,
> wahrscheinlich mit einer Interruptroutine in Assembler

Wozu solche Künsteleien. Eigentlich fast jeder uC besitzt Timer, mit 
denen man per Input Capture den Zeitpunkt eines Impulses erfassen kann - 
ganz ohne Software. Danach hat man alle Zeit der Welt, um das 
Timerregister auszulesen. Man muss es nur rechtzeitig vor dem nächsten 
Impuls erledigt haben.

von c-hater (Gast)


Lesenswert?

Wolfgang schrieb:

> Wozu solche Künsteleien. Eigentlich fast jeder uC besitzt Timer, mit
> denen man per Input Capture den Zeitpunkt eines Impulses erfassen kann -
> ganz ohne Software.

Ja, nur ist halt das Target des TO ein RaspBerry Pi. Und der hat sowas 
halt leider nicht. Zumindest ist es nicht "leicht benutzbar". Ich bin 
fast sicher, dass die Hardware das könnte. Aber davon ausgesperrt zu 
sein, ist halt das Los all derer, die irgendwelche Abstraktionen der 
Hardware benutzen, sei es im Kontext eines OS-Treibers oder irgendeines 
dubiosen "Framework"s auf dem Level unterhalb eine eines richtigen OS.

Wer alles aus der Hardware herausholen will, muss 
BareMetal-Programmieren. Und wer dann auch noch alles aus der Software 
herausholen will, muss Assembler programmieren.

Es geht bei diesen beiden Ansätzen natürlich jeweils "etwas" Komfort 
verloren...

von Christian F. (christian_f476)


Lesenswert?

Ein Zähler ic wie mos 4020 und daran einen billigen uC der einen 
externen Quarz hat und ms zählt. Dann einfach bei jeder Anfrage den ic 
auslesen und die Drehzahl ausrechnen und dann die Zähler zurück setzen.

von Georg (Gast)


Lesenswert?

Christian F. schrieb:
> einen billigen uC

Der braucht keinen externen Zähler, der kann das gut selber.

Georg

von Wolfgang (Gast)


Lesenswert?

Christian F. schrieb:
> Dann einfach bei jeder Anfrage den ic
> auslesen und die Drehzahl ausrechnen und dann die Zähler zurück setzen.

Wozu den Zähler zurück setzen?
Der ausgelesene Zählerstand ist bereits der Bezugszeitpunkt für die 
nächste Messperiode. Eine Subtraktion wird der auslesende uC doch wohl 
hin kriegen ;-)

von Christian F. (christian_f476)


Lesenswert?

Wolfgang schrieb:
> Eine Subtraktion wird der auslesende uC doch wohl hin kriegen ;-)

Hast recht. Wobei der irgendwann überläuft.

Georg schrieb:
> Der braucht keinen externen Zähler, der kann das gut selber.

Der externe Zähler hat den Vorteil dass der nie unterbrochen wird und 
von Vorgängen im uC nicht abhängig ist.

von SP90 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich hab jetzt mal die Software umgeschrieben und das Ergebnis schaut 
schon mal gut aus :)

Vorher hatte ich in der Interrupt-Methode ja nur einen Zähler 
hochgezählt. Die Stopwatch lief im Timer der GUI. Die hat eigentlich nur 
die Zeit der Timer-Ticks gestoppt, in denen die gezählten Interrupts 
ausgeweret wurden. Jetz konnte es aber sein, dass während eines Ticks 
genau 5 Interrupts gezählt wurden oder mann schon kurz vorm sechsten 
war. In beiden Fällen aber immer nur 5 Interrupts, aber mit 
unerschiedlichen Zeiten. Das war der Fehler. So hat man quasi bis fast 
einem Interrupt unterschied und das war genau das gezapple um die ca. 
200 U/min.

Jetzt läuft die Stopwatch in der Interrupt-Methode und wird mit jedem 
Interrupt neu gestartet. Also die Dauer seit dem letzten Interrupt wird 
gemessen und aufsummiert wie die Interrupts selbst. Das Ergebnis hab ich 
angefügt. Mit einem leichten Tiefpass schaut das schon mal gut aus, 
obwohl ich noch weitere Test machen muss. Bei den Interrupts scheint es 
manchmal ausreßende Spitzen zu geben, aber das muss von der Hardware 
kommen.

Sicherlich stimmt das was ihr über die Fähigkeiten der Hardware und des 
Betriebssystems schreibt, aber erstmal scheint die Messung genau genug.

Ich werd mich aber doch noch mit den anderen Filtern beschäftigen. Die 
sind durchaus interessant können auch nochmal nützlich sein...

LG

von Günni (Gast)


Lesenswert?

Ich musste oft stark streuende Sensordaten auswerten und die dahinter 
liegenden Zusammenhänge herausfinden. "Fertige" Filterlösungen haben den 
Nachteil, dass sie zwar universell anwendbar sind, aber selten zu der 
aktuellen Aufgabe passen. Als erster Ansatz hat sich bei mir folgende 
Vorgehensweise bewährt:
Ich habe die Messwerte in eine Excel-Tabelle geladen.
Dann habe ich den Mittelwert der Messwerte gebilet.
Weil aber schon ein stark verfälschter Messwert den Mittelwert 
verschiebt, habe ich dann die Streubreite der Messwerte berechnen 
lassen.
Dann habe ich alle die Messwerte, die mehr als die Streubreite vom 
Mittelwert entfernt waren, unberücksichtigt gelassen und den Mittelwert 
der restlichen Messwerte gebildet.
Mit dem Unterschied zwischen den beiden Mittelwerten und der 
Information, wie die Messwerte, die für den zweiten Mittelwert 
unberücksichtigt blieben, habe ich dann das weitere Vorgehen überlegt. 
Interessant ist beispielsweise, ob die unberücksichtigen Messwerte 
verstreut lagen, oder ob sie dicht beieinander lagen. Dann war es 
nämlich keine Messunsicherheit, sondern die Abweichung musste einen 
Grund haben, der irgendwann auftrat und danach wieder verschwunden ist.
Kein Tool kann eigenes Denken und Verständnis ersetzen.

von Georg (Gast)


Lesenswert?

SP90 schrieb:
> Bei den Interrupts scheint es
> manchmal ausreßende Spitzen zu geben

Klar, weil der Rasbpi bzw. sein Betriebssystem ja nicht echtzeitfähig 
ist. Da müsste man nicht einfach filtern, sondern intelligent 
klassifizieren, wenn wie zu vermuten die meistem Messungen eng 
beieinander liegen und einzelne weit davon weg, weil das System 
dazwischen spuckt. Da könnte z.B. eine 3Sigma-Filterung helfen, die weit 
abweichende Werte eliminiert.

Georg

von Günni (Gast)


Lesenswert?

Georg schrieb:
> Klar, weil der Rasbpi bzw. sein Betriebssystem ja nicht echtzeitfähig
> ist. Da müsste man nicht einfach filtern, sondern intelligent
> klassifizieren, wenn wie zu vermuten die meistem Messungen eng
> beieinander liegen und einzelne weit davon weg, weil das System
> dazwischen spuckt. Da könnte z.B. eine 3Sigma-Filterung helfen, die weit
> abweichende Werte eliminiert.

Genau so etwas habe ich ja vorgeschlagen, aber nicht einfach nur nach 3 
Sigma oder so gefiltert, sondern die Filterung angepasst und vorher 
einzelne "Ausreißer" herausgenommen, da diese die Filterungsergebnisse 
schlechter machen.
Die Streubreite ist übrigens ein "Gütekriterium". Wenn man an der 
Abtastung Änderungen vornimmt, kann man an der Streubreite deren 
Wirksamkeit beurteilen. Und durch Anpassung des Schwellenwertes 
(Abweichung der einzelnen Messwerte vom ersten groben Mittelwert) kann 
man die Vorsiebung schwächer oder stärker machen - je nach Bedarf.

von Rolf M. (rmagnus)


Lesenswert?

SP90 schrieb:
> Also die Dauer seit dem letzten Interrupt wird gemessen und aufsummiert
> wie die Interrupts selbst. Das Ergebnis hab ich angefügt. Mit einem
> leichten Tiefpass schaut das schon mal gut aus, obwohl ich noch weitere
> Test machen muss. Bei den Interrupts scheint es manchmal ausreßende
> Spitzen zu geben, aber das muss von der Hardware kommen.

Läuft da denn ein RT-PREEMPT-Kernel? Damit wird das wesentlich stabiler, 
und die Ausreißer sollten verschwinden. Sieh dir mal die Diagramme unter
https://elinux.org/images/d/d8/Rpi-rt-linux.pdf an.

Christian F. schrieb:
> Wolfgang schrieb:
>> Eine Subtraktion wird der auslesende uC doch wohl hin kriegen ;-)
>
> Hast recht. Wobei der irgendwann überläuft.

Das ändert am Ergebnis aber nichts. Es funktioniert trotzdem.

von Einer (Gast)


Lesenswert?

Rolf M. schrieb:
> Läuft da denn ein RT-PREEMPT-Kernel?

Das Prinzip, erstmal lesen was schon alles gesagt wurde, ist wohl aus 
der Mode, wie? Statt dessen einfach mal in der Gegend rumquaken...

von Gerald K. (geku)


Lesenswert?

Ich würde zunächst versuchen den Sensor und die Übertragung der Meßwerte 
zu verbessern.
Eine konstante Drehzahl sollte auch solche liefern.

Wie sieht der Sensor aus?

Ist dieser überhaupt geeignet?

Welche Maßnahmen wurden  gesetzt um Störungen zu unterdrücken?

Im nachhinein Signale zu verbessern ist schwieriger.

von Rolf M. (rmagnus)


Lesenswert?

Einer schrieb:
> Statt dessen einfach mal in der Gegend rumquaken...

Dann lass es doch einfach bleiben.
Warum sind hier in letzter Zeit eigentlich so viele Trolle unterwegs, 
die einfach nur andere beschimpfen, ohne selbst überhaupt irgendwas zur 
Diskussion beizutragen? Ist den Kids in der Ferienzeit so langweilig?

von Gerald K. (geku)


Lesenswert?

SP90 schrieb:
> ich messe mit einem Raspberry Pi eine Drehzahl indem ich Interrupts
> zähle

Wie viele Interrupts müssen pro Sekunde gezählt werden?

von A. S. (Gast)


Lesenswert?

Christian F. schrieb:
> Hast recht. Wobei der irgendwann überläuft.
>
> Georg schrieb:
>> Der braucht keinen externen Zähler, der kann das gut selber.
>
> Der externe Zähler hat den Vorteil dass der nie unterbrochen wird und
> von Vorgängen im uC nicht abhängig ist.

Das ist nicht böse gemeint: Ich nehme an, Du hast selber noch nie einen 
fortlaufenden Zähler verwendet. Das ist OK. Falls doch, solltest Du 
Deine Ansichten nochmal durchdenken, zur Not hier fragen.

von Einer (Gast)


Lesenswert?

SP90 schrieb:
> Mein Programm ist in C# programmiert und läuft als UWP auf Windows IoT
> am Raspberry.

Rolf M. schrieb:
> Warum sind hier in letzter Zeit eigentlich so viele Trolle unterwegs,
> die einfach nur andere beschimpfen, ohne selbst überhaupt irgendwas zur
> Diskussion beizutragen? Ist den Kids in der Ferienzeit so langweilig?

Am 11.8. hat "SP90" klargestellt, dass er Windows auf dem RPi verwendet.

Und Du kommst 4 Tage später mit dem Linux-Kernel an?

Preis-Frage: Was nützt das "SP90"

  --> Gar nichts!

Zweite Preis-Frage: Wer ist der Troll der neben seinen Stiefeln läuft?

  --> Du!

von Rolf M. (rmagnus)


Lesenswert?

Einer schrieb:
> SP90 schrieb:
>> Mein Programm ist in C# programmiert und läuft als UWP auf Windows IoT
>> am Raspberry.

Ja, das hat er irgendwo dazwischen mal erwähnt, und ich hab nicht mehr 
daran gedacht, da ich

> 4 Tage später

auch nicht mehr die vollständige Diskussion im Kopf habe. Warum du 
deshalb so aggressiv auftrittst und beleidigend wirst - wohlgemerkt ohne 
dabei auch nur im entferntesten irgendwas zum Thema beigetragen zu 
haben, hast du nur leider nicht erklärt.

von Einer (Gast)


Lesenswert?

Rolf M. schrieb:
> Warum du
> deshalb so aggressiv auftrittst und beleidigend wirst

Sorry. War ein hässlicher Zug von mir. Tut mir leid.

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.