Forum: Mikrocontroller und Digitale Elektronik Probleme mit Reflexlichtschranke, Frage zu Filterfunktion


von Frank (Gast)


Angehängte Dateien:

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.

von Peter D. (peda)


Lesenswert?

Ich würde die Lichtschranke modulieren, d.h. ein Timer startet den ADC 
und der ADC-Interrupt toggled die LED.
Das Signal ist dann LED_an - LED_aus.
Damit sind die Meßwerte weitgehend unabhängig von Fremdlicht, 
Toleranzen, Temperatur und Drift.

: Bearbeitet durch User
von Joe F. (easylife)


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.

: Bearbeitet durch User
von Lurchi (Gast)


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.

von Frank (Gast)


Lesenswert?

Danke für eure Hinweise.

Ich probiere sie aus und lass' euch das Ergebnis wissen.

von Oldie (Gast)


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...

von easylife (Gast)


Lesenswert?

fuer ein sauberes signal brauchst du beides, einen HP um DC zu killen 
und einen TP gegen das rauschen. ich würde beides in hardware vor den 
ADC setzen.

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.