Probleme mit Reflexlichtschranke, Frage zu Filterfunktion

Gast #4249260
Lesenswert?

Hallo zusammen

Ich bin gerade dabei mir eine Ableseeinheit für meinen Gaszähler zu 
bauen.

Da der Gaszähler keine magnetische Abfrage unterstützt nutze ich die 
Abfrage mittels Reflexlichtschranke. Die Ziffer 6 in der letzen Stelle 
des Zählers besitzt eine kleine Spiegelfläche.

Das Messen geschieht mit einem ATTiny85, das klappt eigentlich auch 
soweit. Nachdem ich ein paar Messreihen aufgenommen habe, konnte ich mit 
Hilfe eines digitalen Tiefpasses auch die Werte für eine obere (100) und 
untere (50) Hysterese finden.

Im Normalfall funktioniert das so weit so gut. Aber, wenn der 
Zählerstand genau auf der Ziffer 6 stehen bleibt, dann schaukeln sich 
die Werte nach dem Tiefpass auf und ich erhalte falsche Daten.

Der Sensor wird alle 200ms abgefragt. Das Abfrageergebniss geht in diese 
Filterfunktion ein:
  out = in - last_in + coeff * last_out ; mit coeff = 1

Wenn der Zähler sich dreht sieht das so aus wie im Bild 
"Gaszähler-Normalfall.png". Es sind zwei Umdrehungen dargestellt.

Wenn der Zähler aber genau mit der Spiegelfläche bei Sensor stehen 
bleibt dann klappt das mit meiner Filterfunktion nicht mehr (Bild 
Gaszähler-Sonderfall.png). Der Ausgangswert wandert um den oberen 
Hysterese Wert herum.

Welche Art von Filterfunktion könnte ich verwenden damit auch der 
Sonderfall nicht zu fehlerhaften Werten führt?

Bin für jede Hilfe dankbar.
Angehängte Dateien:
#4249281
Lesenswert?

Deine "Filterfunktion" ist nicht wirklich gut.

Wenn du den Filter in der "low" Phase startest, eleminierst du 
einigermaßen gut den DC-Offset (im Grunde ziehst du im weiteren Verlauf 
immer den zuerst gemessenen Wert ab).
Funktioniert aber nicht, falls du den Algorithmus in einer High-Phase 
startest.

Was wäre denn, wenn du deine Reflexlichtschranke mit einem Tiefpass in 
Hardware + einer DC-Entkoppelung (Kondensator) anschließt?

Dann hast du das DC-Offset-Problem schon mal eliminiert, und musst dich 
in Software nur noch um das Erkennen einer positiven Flanke kümmern 
(Messwerte etwas mitteln (=weitere leichte TP Funktion) und dann 
differenzieren um Steigung zu erkennen).

Sinnvolle Werte für die Hysterese liegen auch eher um den Mittelwert von 
high und low.
In deinem Fall (nach der DC Korrektur) low=0, high=100 -> Mittel = 50.

Hysteresewerte von 60 und 40 wären daher eher sinnvoll.
Gast #4249350
Lesenswert?

Eine gute 50HZ/100 Hz Unterdrückung bekommt man durch mitteln über ein 
vielfaches von 20 ms. Also etwa den ADC mit 200 Hz (oder schneller) 
auslesen und dann 4 oder entsprechend mehr Werte mitteln.

Modulieren der LIchtschranke ist vermutlich die bessere Idee, denn das 
Spart auch Strom: Also etwa erst ohne LED Strom, den ADC auslesen, dann 
nach etwa 18 ms den Strom anschalten, nach 20 ms Auslsen und den Strom 
wieder aus. Durch die möglichst genau 20 ms Verzögerung werden 50/100Hz 
gut unterdrückt, da man jeweils die gleiche Phase hat.
Gast #4250123
Lesenswert?

Ich verstehe dein Problem nicht!

Deine Reflexlichtschranke zeigt doch sehr gut den Unterschied
zwischen
- Reflektor "sichtbar"   (in = ca. 400) und
- Reflektor "unsichtbar" (in = ca. 300)

Und wenn der Gaszähler bei Reflektor "sichtbar" stehen
bleibt - ja dann musst doch (in = ca. 400) herauskommen!
Passt doch!

Ein simples RC-Tiefpass-Filter simuliert man mit:

out_alt = out
out += (in - out_alt) * coeff

coeff muss < 1 sein! Es lässt sich berechnen und sollte beim
schnellstmöglichen Durchgang des Reflektors die Signal-Spitze
noch zu 95% durchlassen.
Aber du könntest schon mal mit ca. 0,95 anfangen.
Das geht auch in schneller Ganzzahlrechnung.

In deinem Fall wäre angebracht:

if out < 333
    unsichtbar = 1
if out > 366 && unsichtbar == 1
    unsichtbar = 0
    Gaszähler += 1

Später kann man sich noch Gedanken über eine schlaue
Strategie zur Temperatur- und Alterungskompensation
machen...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren