Brauche Hilfestellung bei log und avr-gcc

OP #2677213
Lesenswert?

Hallo Leute,
ich bin gerade dabei einen Höhensensor für Modellfugzeuge zu bauen. 
Dafür möchte ich den Bosch BMP085 als Drucksensor nehmen. Nun gehts mir 
natürlich nicht um die absolute Höhe, sondern um die Höhendifferenz in 
Metern zwischen Referenzluftdruck P0 (in Pascal) welcher beim Power-On 
gespeichert wird und einem Luftdruck P.

Habe aus den Artikeln zur Barometrischen Höhe usw. die Funktion genommen 
und nach H aufgeglöst, da bekomme ich folgende Formel:

Alternativ:

Nun knallt mir allerdings avr-gcc wegen der log Funktion entspannte 5kb 
in den Flash.

Nun 2 Fragen:

1.) Stimmen die Formeln da überhaupt?
2.) Weiß jemand eine Möglichkeit das ganze umzuschreiben, so dass keine 
Funktionen verwendet werden müssen welche den Code derart blähen. Bin 
leider nicht Mathe Profi genug um hier groß zu optimieren.

gruß cyblord
#2677233
Lesenswert?

Eine ganz defätistische Frage: brauchst du überhaupt einen Logarithmus?
Bei den Höhendifferenzen eines Modellflugzeugs kann man vielleicht auch 
linear rechnen?

Und noch eine: Geht es nicht auch mit Festkommezahlen und einer Tabelle 
zum Linearen Interpolieren?
Das wäre wesentlich kleiner und schneller.
Gast #2677236
Lesenswert?

Ich komme da nicht auf 5kb.

Der tescode:
1
int main(void)
2
{  
3
  volatile double p = 100.0;
4
  double p0 = 12.0;
5

6
   volatile double h = -7990.0 *log10(p/p0);
7
}

erzeugt 2,6kb - mit -OS, aber ohne Mathelib. Mit Mathelib (die man immer 
dazulinken sollte) sind es 1,4kB.

Oliver
Gast #2677282
Lesenswert?

Hm, du könntest dir eine LUT (Lookup table) machen. p0/p1 dürfte so im 
Bereich von 0.8 bis 1.2 liegen. Wenn du dann alle 0.01 einen Wert in 16 
bit Festkomma speicherst, belegt diese LUT 80 Bytes. Zur Not kann man 
dann noch zwischen den einzelenen Werten linear interpolieren. Die Frage 
ist halt, welche Genauigkeit du brauchst.
Moderator Persönliche Seite #2677368
Lesenswert?

cyblord ---- schrieb:
> Nun knallt mir allerdings avr-gcc wegen der log Funktion entspannte 5kb
> in den Flash.

Wolltest du dir was berechnen lassen, oder mit dem popeligsten ATtiny
daherkommen?  Letzteres spart dir vielleicht einen Euro oder zwei,
auf Kosten von endlosen Stunden, die du einen eigentlich simplen
Algorithmus auf irgendwas anderes umbauen darfst (Lookup-Tabellen,
irgendeine Approximation, was auch immer), um das anschließend zu
debuggen und in der Gültigkeit für deine Anwendung zu verifizieren.
Am Ende zeigt sich vielleicht beim Flug, dass trotzdem nur Mist
rauskommt, weil du irgendwas übersehen hast.

Der Vorteil des log10 aus der Mathebibliothek ist demgegenüber
einfach mal, dass es ein "known to be good"-Algorithmus ist, und
wenn deine Formel stimmt, du das einfach so einsetzen kannst und
für ein paar Kilobyte Flash diesen Tagesordnungspunkt abhaken kannst,
um zum nächsten überzugehen.

Musst du halt selbst wissen, was dir wichtig ist.  Selbstgebrautes
Bier mag gut schmecken, und sicher kann man (im Vergleich zu den
Kommerziellen) dabei auch viel improvisieren.  Wenn's mir aber nicht
auf den Spaß beim Brauen ankommt, sondern ich nur ein Bier trinken
will, dann kauf' ich mir 'ne Flasche.
OP #2677431
Lesenswert?

Vielen Dank für den vielen Input!!!
Ich benutze natürlich kein printf, aber danke der Nachfrage ;-)

> erzeugt 2,6kb - mit -OS, aber ohne Mathelib. Mit Mathelib (die man immer
> dazulinken sollte) sind es 1,4kB.

Ich werde mir das mit der Mathelib mal angucken. Habe bisher nichts 
extra dazugelinkt.


> Eine ganz defätistische Frage: brauchst du überhaupt einen Logarithmus?
> Bei den Höhendifferenzen eines Modellflugzeugs kann man vielleicht auch
> linear rechnen?

Das hab ich mir auch überlegt, irgendwo auf Wiki steht was von einer  > 
Höhendifferenz von 8,4m / hPa. Natürlich nur bei x Grad auf Meereshöhe 
und wenn Weihnachten auf Ostern fällt. Das könnte man ja linear rechnen. 
Aber ich will nicht mehr Ungeauigkeit als nötig ohne Not reinbringen.


> Wolltest du dir was berechnen lassen, oder mit dem popeligsten ATtiny
> daherkommen?

Eigentlich ist ein tiny45 angedacht, da ich davon einigen Stangen in 
SOIC Gehäuse habe und der Sensor ja klein werden muss. Natürlich kann 
ich auch einen tiny85 nehmen, aber das Ding muss ja auch noch andere 
Sachen machen als einen log berechenen.

Aber es stimmt schon, wegen ein paar kb mehr lohnt sich vielleicht ein 
großer Aufwand nicht.

Zur Genauigkeit: Der verwendete Sensor hat ein Rauschen von 0,25m. Eine 
Gesamtgenauigkeit im Bereich von +-2m hatte ich mir mal so als Ziel 
gesetzt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren