Hallo ich benutze einen SHT71 Feuchte und Temperatursensor, von Sensirion zum Messen der Lufttemperatur und und Luftfeuchtigkeit. Beide Werte werden auf einem 2x16 Display ausgegeben. Als µC verwende ich einen ATmega88 mit 8kByte flash. Anhand der Werte lässt sich nun der Taupunkt berechnen. Sensirion beietet hier für ein Formel. Nur wenn ich die Formel dann in meinen µC übertrage, benötigt allein diese Berechnung mehr als 60% meines flash Speichers.Somit ist es mir unmöglich mein Programm zu erweitern. Hier der Sample Code von Sensirion für den SHT 71: float calc_dewpoint(unsigned int h , int t) { float H,dew_point; H = (log10(RH)-2.0)/0.4343+(17.62*t)/(243.12+t); td = 243.12*H/(17.62-H); return dew_point; } Hier meine Frage: Wieso Benötigt diese einfache Rechnung so viel Speicher? Kann man die Rechnung Vereinfachen? Und woran kann man sich dann orientieren?
Hallo D.R. , ich habe die Berechnung irgendwo aus dem Internet und funktioniert gut. double ausw_taupunkt(void) { double logEx; double taupunkt; double h; double t; t = temperatur; h = feucht_true; logEx = 0.66077+7.5*t / (237.3+t) + (log10(h)-2); taupunkt = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx); //------------ minus_tau = 0x00; if (taupunkt <= 0) // Minustemperatur { taupunkt = 0 - taupunkt; minus_tau = 0x01; } //------------ ausw_wandeln(taupunkt); return 0; } Gruß Jochen
Da stimmt etwas nicht. Wo wird denn dew_point berechnet? float calc_dewpoint(unsigned int h , int t) { float H,dew_point; H = (log10(RH)-2.0)/0.4343+(17.62*t)/(243.12+t); td = 243.12*H/(17.62-H); return dew_point; }
Ohh, hier noch mal ohne Tippfehler: float calc_dewpoint(unsigned int h , int t) { float H,dew_point; H = (log10(h)-2.0)/0.4343+(17.62*t)/(243.12+t); dew_point = 243.12*H/(17.62-H); return dew_point; }
D. R. schrieb: > Hier meine Frage: Wieso Benötigt diese einfache Rechnung so viel > Speicher? Flaoting Point Rechnerei ist für einen Mega88 nun mal heftig. Aber 60% ist dann schon ziemlich viel. Hast du die Optimierung eingeschaltet? > Kann man die Rechnung Vereinfachen? log10(RH) Geh ich recht in der Annahme, dass RH eine Konstante ist (irgendeine Materialkonstante)? Wenn ja, dann nimm deinen Taschenrechner, rechne den Wert aus und setz ihn mal direkt ein -> schon fällt die Logarithmusfunktion aus deinem Programm raus -> Programm wird kleiner. Auch das hier (log10(RH)-2.0)/0.4343 ist letztendes alles konstant und kann daher im Vorfeld berechnet werden. Der Rest sind dann ein paar Grundrechenarten. Nichts dramatisches mehr.
Ja die Optimierung ist eingeschaltet. am log10 liegt das Problem nicht, das mit dem ausklammern hab ich schon getestet. Probleme bereitet diese Zeile: H = (log10(h)-2.0)/0.4343+(17.62*t)/(243.12+t); Ich hab auch schon den ATmega88 gegen einen Atmega168(16kB flash) getauscht um mehr flash zu haben.Nur leider wird das Prorgramm sehr langsam. Leider kenn ich mich auch nicht mit den Timer und Takt Werten aus um den ATmega168 optimal anzupassen. Als Experimentierumgebenung benutze ich ein MiniMexle. RH ist eingentlich h (tippfehler) t is die gemssene Temperatur und h die gemessene Luftfecuhte
Dann wirst du wohl mit den 60% leben müssen. Das meiste davon werden Bibliotheksfunktionen sein, die nur ein einziges mal eingebunden werden und auch nur einmal richtig Platz benötigen, selbst wenn sie noch 20 mal aufgerufen werden. D.h. wenn du weiterentwickelst, wird dein Speicherverbrauch nicht weiter so dermassen krass anwachsen, sondern wieder moderat in die Höhe gehen. Selbst wenn da noch weitere Floating Point Berechnungen dazukommen. Und 60% Flash-Verbrauch ist noch nichts worüber du dir graue Haare wachsen lassen musst. Nervös brauchst du erst werden, wenn du die 95% erreichst.
Naja mit Temperatur und Luftfuchtigkeit Berechnung und dem dazugehörigen Main + Ausgabe am Display bin ich bei 91%. Die grauen Haare wachsen also schon....gibt es eventuell eine elegantere Lösung?
Du könntest den Log folgendermaßen loswerden: H = (log10(h)-2.0)/0.4343+(17.62*t)/(243.12+t); log10(h) = log2(h)/log2(10) Log2 ist wahrscheinlich leichter zu berechnene (bitpositionen)
Wie gesagt am log10 liegt es nicht, auch wenn ich den ändere komm ich auf maximal 10% ersparniss.
Du kannst natürlich alles auf Integer-Rechnung umstellen und für den Log eine statische Tabelle anlegen. Teste mal, was passiert, wenn Du alle Variablen als int deklarierst und den Log rausnimmst. Wieviel Flash hast Du dann belegt?
Hi >Die grauen Haare wachsen also schon....gibt es eventuell eine elegantere >Lösung? Nicht eleganter, aber einfacher: ATMega168 oder ATMega328 MfG Spess P.S. In Assembler brauche ich ca. 3k.
Hallo D.R. wie hast Du letztendlich das Probelm gelöst? Ich stehe gerade vor dem gleichen Problem. Gruß Ironman
guck mal hier: http://www.tuxgraphics.org/common/src2/article07091/eth_rem_dev_sensirion-3.3.tar.gz in der Datei ist f.d. Taupunktberechnung (dewpoint calculation) eine Routine enthalten, die nur Integerarithmetik benötigt. Allerdings ist die Genauigkeit dann nur (??) noch 5 %. Läuft bei mir bestens. Kutte
Hallo Leute, das Thema wird in den nächsten Tagen für mich auch interessant wenn die Sensoren endlich kommen - ich werd es mit einem Arduino Duemilanuove realisieren - hat nen ATM328 drauf. Aber haben nicht die SHT´s eh nur 5% Genaugkeit von Hause aus?? Was nehmt Ihr für Sensorleitungen? Sollten das Cat5 Kabel sein? Grüße, Kirschherz
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.