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.
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
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
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.
Danke für eure Hinweise. Ich probiere sie aus und lass' euch das Ergebnis wissen.
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.