Forum: Mikrocontroller und Digitale Elektronik Historie AD-Werte; Konzept


von Richard (Gast)


Lesenswert?

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

von Michael W. (wiebel42)


Lesenswert?

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

von Chrisi (Gast)


Lesenswert?

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?

von Richard (Gast)


Lesenswert?

> 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

von Otto (Gast)


Lesenswert?

Schau mal unter den Begriffen "IIR Filter", "FIR Filter". Dein Beispiel 
mit den 90% alter Wert, 10% neuer Wert ist eir IIR Filter erster 
Ordnung.

von Matthias L. (Gast)


Lesenswert?

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

von Chrisi (Gast)


Lesenswert?

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.

von Michael W. (wiebel42)


Lesenswert?

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

von schablonski (Gast)


Lesenswert?

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

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.