Hallo,
1.) ich möchte mein uC-Thermometer mit einer "Gradientenfunktion"
ausstattten, d.h. der uC soll erkennen, wenn die Temperatur _z.B._ in
den letzten 10min um 5°C gefallen ist. Die 10min und die 5°C sollen in
(weiten) Grenzen parametrierbar sein.
Derzeit mache ich alle 5s eine Messung. Die Ergebnisse werden gefiltert.
Das Problem dabei ist, dass ich für das 10min-Beispiel nicht einfach
alle (in dem Fall 120) Messwerte im Speicher halten kann, um den
Vergleich zwischen aktueller Temperatur und Temperatur vor 10min
durchzuführen.
Frage: Wie löst man sowas?
2.) Ähnliche Geschichte: Es sollen Min- und Maxwerte gespeichert werden
- jeweils separat für:
- die letzten 24h
- die letzte Woche
Frage: Wie erkenne ich, wann der "aktuelle" Maxwert "ausläuft"? Ich will
ja kein Allzeitmaxwert speichern...
Ringbuffer!? Aber dann musst du natürlich schon möglichst alle Werte für
den Betreffenden Zeitraum Speichern. Was tust du wenn du nichtmal 240
Bytes mehr frei hast für deine temperaturmesswerte.? -Wiebel
Ich fürchte, wenn wir jetzt Dein Beispiel für 10min. lösen, verrätst Du
uns anschließend, dass der Parameter "Zeit" auch auf 24 Stunden gesetzt
werden kann... :-)
Nun mal Butter bei die Fische. Du sprichst ja selber schon von filtern.
Insofern würde ich je nach Triggerzeit die Zahl der Messwerte soweit
reduzieren, dass Sie in den Speicher passen. Du hast Dir die Suppe
selber eingebrockt: Du mißt einfach zu oft. Glaubst Du, dass innerhalb
von 5 Sekunden viel passiert? Das muss ein Windstoss sein und den willst
Du eigentlich nicht mitmessen.
Also: Du gönnst Dir einen Speicher von konstant 50 Meßwerten (oder
wieviel Platz Du auch immer hast). Anschließend werden Temperaturen
solange akkumuliert und gemittelt, bis wieder 1/50 Deiner Zeit vergangen
sind. Dann darf ein Wert gespeichert werden.
Und nun die obligatorische Frage: Welchen Controller benutzt Du denn,
der keine 120 Werte speichern kann?
> Ich fürchte, wenn wir jetzt Dein Beispiel für 10min. lösen, verrätst Du> uns anschließend, dass der Parameter "Zeit" auch auf 24 Stunden gesetzt> werden kann... :-)
ja, so hatte ich mir das vorgestellt. Nicht umsonst habe ich "in
weiten Grenzen" geschrieben. ;-)
> Glaubst Du, dass innerhalb von 5 Sekunden viel passiert? Das muss ein> Windstoss sein und den willst Du eigentlich nicht mitmessen.
Das soll nicht das Thema sein, ich dachte eher an eine universelle
Herangehensweise - nicht unbedingt ausschliesslich konkret an
Temperaturmessung.
> Also: Du gönnst Dir einen Speicher von konstant 50 Meßwerten (oder> wieviel Platz Du auch immer hast). Anschließend werden Temperaturen> solange akkumuliert und gemittelt, bis wieder 1/50 Deiner Zeit vergangen> sind. Dann darf ein Wert gespeichert werden.
das und das Stichwort "Ringpuffer" von Michael lassen mich zum Schluss
kommen, dass es dafür kein Patentrezept gibt... Schade.
Aber weil du oben auf das Filtern eingegangen bist, muss ich nochmal
kurz die Motivation meiner Frage(n) erläutern.
Ich hatte mich zuvor schon gefragt, wie man z.B. über x Werte
mittelt/filtert, ohne alle x Werte im Speicher vorhalten zu müssen.
Ergebnis war dann, dass ausser dem aktuellen Messwert nur noch ein
gefilterter Wert vorliegen muss. Der aktuelle Wert geht nur mit geringem
Anteil in den neuen gefilterten Wert ein (z.B. Gewichtung: 10% neuer
Wert zu 90% alter gefilterter Wert). So schlagen Ausreisser/Messfehler
nicht so stark durch.
Damit spare ich mir schonmal einiges an Speicher gegenüber z.B.
Mittelwertbildung über 20Messwerte... Und genau sowas erhoffte ich mir
auch für die Gradientengeschichte und/oder die MinMax-Speicherung. Aber
offensichtlich muss ich wirklich alle Messwerte vorhalten.
> Und nun die obligatorische Frage: Welchen Controller benutzt Du denn,> der keine 120 Werte speichern kann?
Das Konzept soll natürlich controllerunabhängig sein. Ich möchte nämlich
nicht diskutieren, an welchen anderen Stellen ich noch RAM einsparen
kann, sondern genau an dieser Stelle!
Ausserdem wollte ich nicht mit Riesenzahlen (z.B. Gradient über 24h;
Messung alle 10ms) "provozieren". :-)
Vielleicht hat ja doch noch jemand eine platzsparende oder sonstwie
geniale Idee oder kann berichten wie er das schon erfolgreich umgesetzt
hat.
Danke, Richard
>Dein Beispiel>mit den 90% alter Wert, 10% neuer Wert ist eir IIR Filter erster>Ordnung.
Genau. Das nennt sich PT1. Ist ein Tiefpass erster Ordnung. Für
Mittelungen wird der oft angewendet. Weil es nur einen Speicherplatz
benötigt.
Eine einfache Möglichkeit zu mitteln ist natürlich einfach die Summe zu
bilden (für eine Periode dann der einzige Wert, der gespeichert werden
muss) und am Ende einer Messperiode durch die Anzahl der Messwerte zu
teilen. Somit gehen dann ALLE Werte einer Messperiode in den Messwert
mit ein.
Übrigens reduzieren FIR/IIR-Filter NICHT die Zahl der Messwerte!
Weiterhin gehen in einen Meßwert nur die Zahl von Werten ein, die der
Ordnung entspricht... irgenwo müssen also Meßwerte zusammengefaßt oder
ausgelassen werden.
Chrisi wrote:
> Eine einfache Möglichkeit zu mitteln ist natürlich einfach die Summe zu> bilden (für eine Periode dann der einzige Wert, der gespeichert werden> muss) und am Ende einer Messperiode durch die Anzahl der Messwerte zu> teilen. Somit gehen dann ALLE Werte einer Messperiode in den Messwert> mit ein.
Es gibt ja auch etlich Codeschnipsel die genau das mit 256 Werten
machne, einfach 256 mal die Werte aufaddieren und dann die oberen 8 bit
nehmen, fertig. Ein Ringbuffer ist natürlich netter, weil du ab
entsprechend ab dem 256ten Wert laufen einen neuen Mittelwert bekommst
und nicht erst wieder nach erneuten 256 Messungen, dafür kann an sich
schon überlegen den Speicher auszugeben. Mit der IIR Filterung sollte
das natürlich auch gehen. IIR Filter (Infinite Impulse Response) können
sich allerdings natürlich auch zu träge zeigen, da der eigentlich Wert
nie ganz erreicht wird. Wenn du also bei 0 anfängst und ab dann immer
255 hast wird der Wert erst sehr spät bei 255 ankommen, wenn überhaupt.
Naja Nichtendliche Impulsantwort eben. Ein Ausreiser (Impuls) hat eine
unendliche lange Folge. Meist kann man das natürlich vernachlässigen,
aber dir ging es ja um die Theorien.
Beim Ringbuffer hast du nach n gleichen Werten (n..Buffergrösse)
natürlich auch genau diesen als Mittelwert. Von daher müsste ein
entsprechender Ringbuffer eigentlich ein FIR Filter sein, das vermute
ich jetzt aber nur. -wiebel
wie wärs denn mit einem I2C bus eeprom ( 93C24 oder ähnliches ) und du
speicherst datum uhrzeit und den wert. dann kannst du auch ohne
versorgungs spannung , also mehrere wochen , die werte speicher etc..