Hallo zusammen ich tüftel gerade daran wie ich die AVR controller dazu überredet kriege mir eine 5,255 wurzel auszurechnen oder mir einen wert zu potenzieren mit 0.19029 komme da irgendwie nicht so ganz weider. bin dankbar für jede hilfe
Das Simpelste wird wohl eine Tabelle im Flash sein ...
Ich denke der Weg führt über Logarithmen. Frag mich aber jetzt nicht wie man in Assembler einen log macht. b ( ln a * ln b ) a = e Für ln bzw. e-Funktion sollte sich doch was finden lassen.
Das einfachste wird sein, den Ausdruck x^0.19029 in eine passende taylorreihe zu entwickeln. Wiesi
Eine entsprechende Logarithmentabelle im Flash ablegen, und dann alles über Logarithmus rechnen.
Alex müsste mal sagen, welchen wertebereich er hat bzw. wie genau das werden soll. Sonst kann mann da nicht allzu viele Aussagen darüber machen. (Außer - nimm eine mathe-lib) Wiesi
@ Alex Black Ich hab mal eine Implementierung in C gemacht (ohne Tabellen, Ergebnis stimmt auf so 4 bis 6 Nachkommastellen). Die Genauigkeit wirst du aber für den AVR runterschrauben mussen, sonst rechnet der recht lang (oder muss es eh nicht schnell sein?). Floating point wird aber noch immer vorausgesetzt. Falls du noch daran interessiert bist, könnt' ichs mal posten. Wiesi
Ich denke mal der Weg führt über eine Reihe Multiplikationen und Additionen, frag mich aber nicht, wie man das in einem AVR macht.
Zuerst muesste bekannt sein was fuer eine Genauigkeit auf welchem Wetebereich benoetigt wird. Dann kann man Speicherplatz gegen Geschwindigkeit ausspielen, indem man Tabellen und Operationen kombiniert. Eine kleine Untersuchung wird zeigen wievielten Grades ein Polynom sein muss um die Genauigkeit zu erreichen. Allenfalls ist eine Tabelle mit einigen Weten besser. Imterpolieren kann man auch wieder linear, oder mit Spline. holzi
Nun estmal danke für die rege beteiligung Ich will mich da mal präzisieren ich wil mir nen höhenwarner bauen (bin falschirmspringer)der bei einer gewissen höhe anfängt zu piepsen, damit ich bescheid weiß das ich mich mal langsam bereit machen sollte zu ziehen. das problem mit tabellen ist (habe ich schon angedacht) sie sind statisch und der druck kann sich wie bekannt wetterbedingt im tagesverlauf ändern. dh habe ziehe ich die direkte berechnung vor und in assembler da mir auf der berufsschule beigebracht wurde assembler ist schneller als hochsprachen. dh es kommt nicht auf nachkommastellen an sondern auf schnelligkeit. aus diesem grunde dachte ich mir das so: vor jedem sprung gerät einschalten es wird der aktuelle druck gemessen bei 4000m steige ich aus und ab da an muss der controller nun aus druckdifferenz die höhe ermitteln und bei 1500m dem piepser anwerfen so habe ich mir das gedacht
muss noch dazu sagen das ich nicht den höheren bildungsweg besritten habe ich kenne mich nicht mit logarithmen und e-funktionen aus. habe zwar von gehört aber bei nachfrage war immer der selbe satz zu hören von den Lehrern braucht ihr nicht ............ ich lese mich da mal ein mhh Danke
Es stimmt schon das Assembler schneller ist als Hochsprachen, aber ich denke bei 16MHz sollte es auch in C schnell genug sein. Es gibt in math.h die funktion:double exp (double __x) und double log (double __x) und dann einfach so wie Karl heinz es gemeint hatte. b ( ln a * ln b ) a = e P.S. was hast du für einen Höhensensor? und sollte nicht auch die Temperautr einen Einfluss haben?
Assemblercode ist nur dann schneller als C-Code, wenn man wirklich gut ASM kann. Meist optimieren die Compiler den Code (im Schnitt) genauso schnell wie ein durchschnittlicher ASM programmierer. (Ohne jetzt wieder die Diskussion ASM vs C lostreten zu wollen, aber am sinnvollsten ist immer eine Mischung, sofern man weiß, was man tut.) Die Mathemathikroutinen die der Compiler einbindet sind sowieso meist handoptimiert. Wiesi
> berufsschule beigebracht wurde assembler ist schneller als hochsprachen. Naja, wie in Berufsschulen so üblich, der vermittelte Stoff ist im Schnitt 20 Jahre veraltet. Diese Aussage stimmt nämlich nur noch sehr beschränkt. Heutige, moderne Compiler, besonders auf leistungsstarken Prozessoren, erzeugen in den allermeisten Fällen deutlich schnelleren Code als ein Mensch der direkt in Assembler programmiert. Für Deinen Fall wäre das beste, das einfach in C zu programmieren. Da kannst Du dann Deine Formel einfach im Source-Code reintippen und gut ist. http://www.nongnu.org/avr-libc/user-manual/group__avr__math.html
> assembler ist schneller als hochsprachen. > dh es kommt nicht auf nachkommastellen an sondern auf schnelligkeit. Aber nur dann wenn es einen Unterschied macht ob die Warnung eine Millisekunde früher oder später kommt. In Deinem Fall dürfte das überhaupt keinen Unterschied machen. So schnell kannst du sowieso nicht reagieren :-)
Wenn du das dann in C machst, dann heist die Funktion pow() Eine Wurzel ist dann: potenzieren mit dem Kehrwert. Eine Quadratwurzel (*) aus x wäre also: pow( x, 1.0 / 2.0 ) Die 5.244 Wurzel ist dann: pow( x, 1.0 / 5.244 ); (*) Der Vollständigkeit halber: Quadratwurzeln braucht man häufiger. Dafür gibt es eine eigene Funktion: sqrt()
Hallo Alex, für Deinen Anwendungsfall kannst Du die vereinfachte barometrische Höhenformel nehmen (e-Funktion). Die komplizierte ICAO Standard-Atmosphäre erfordert eine sehr genaue Wurzel-Berechnung um genau zu sein (zumindest 5 kommastellen). Gruß Mario
> vor jedem sprung gerät einschalten es wird der aktuelle druck > gemessen bei 4000m steige ich aus und ab da an muss der controller > nun aus druckdifferenz die höhe ermitteln und bei 1500m dem piepser > anwerfen so habe ich mir das gedacht Hmm, muss das dann überhaupt so kompliziert sein? Kannst Du nicht einfach die Faustformel 1 Hekto-Pascal = 8 Meter verwenden? Also: 1.) Am Boden Tastendruck abwarten und dann Druck speichern. 2.) Sobald der Druck um 200 hPa (1600m) seit Tastendruck angestiegen ist, schaltet sich das Gerät automatisch scharf. 3.) Sobald die Differenz zwischen aktuellem Druck und gespeichertem Druck kleiner als 188 hPa (1500m) wird, Piepser einschalten. Mehr brauchst Du doch nicht, oder?
Achja, der Druck sinkt natürlich beim steigen und wird wieder größer beim fallen. Aber sinngemäß sollte meine Idee klar sein. Wie konnte ich das nur verwechseln?
>Kannst Du nicht einfach die Faustformel 1 Hekto-Pascal = 8 Meter >verwenden? Mh das wäre ne möglichkeit, versuche ich die mal ist unkompliziert und auch klangschön. wenn sie annäherungsweise das gewünschte ergebniss ausspuckt bin ich zufrieden Zur frage mit welchem drucksensor ich arbeite, kann mich noch nicht entscheiden zwischen den barometermodulen von intersema (MS5540)und den motorola mpx4100. wobei ich mir erst mal das programm schreibe und dann den sensor aussuche weiß ist nicht unbedingt ein guter weg habe aber momentan nicht die mittel um mir exemplahre zu kaufen und meinen cheff sehe ich erst nächstes jahr wieder dann kann ich ihn fragen ob er diese als sampels bestellen kann ( bin knauserich geworden )
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.