mikrocontroller.net

Forum: Compiler & IDEs Taupunktberechnung von Sensirion (SHT71)


Autor: D. R. (ace07)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Siegfried (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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;
}

Autor: D. R. (ace07)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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;
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: D. R. (ace07)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: D. R. (ace07)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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)

Autor: D. R. (ace07)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie gesagt am log10 liegt es nicht, auch wenn ich den ändere komm ich 
auf maximal 10% ersparniss.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: D. R. (ace07)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Passt! Programm läuft!

Autor: Ironman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo D.R.

wie hast Du letztendlich das Probelm gelöst? Ich stehe gerade vor dem 
gleichen Problem.

Gruß Ironman

Autor: kutte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
guck mal hier:
http://www.tuxgraphics.org/common/src2/article0709...
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

Autor: Kirschherz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.