Grad oder Bogenmaß ?
Hallo Leute!
Ich gerade voll am proggen, und bin auf ein "Nebenproblem" gestoßen.
Ich will eine Drehzahlangabe graphisch als Zeiger darstellen. ( Auf nem LCD versteht sich ).
um icht jeden einzelnen wert, von 0-360° abspeichern zu müssen,
was ziemlich viel Flash kostet, will ich die werte berechnen lassen.
Habe dazu viele Infos in meinen C-Buch ( C von A bit Z ) gefunden.
In der Headertadei math.h sollen sich diese mathematischen Funktionen befinden:
double sin( double zahl );
double cos( double zahl );
double tan( double zahl );
double asin( double zahl );
double acos( double zahl );
double atan( double zahl );
double sinh( double zahl );
double cosh( double zahl );
double tanh( double zahl );
double log( double zahl );
double log10( double zahl );
usw...
Die frage ist nun, ob das bei den AVRs auch funktionert?
Die Header math.h ist vorhanden, und der Compiler nimmt das Ganze auch an.
Nur rauskommen tut nur 0:
Wisst Ihr evtl. mehr darüber?Code:x = (double) tan( ( double ) 70 ); USART_transmit( x );
tan70 sollte 2.47 sein. also müsste er 2 senden....
Gruß,
Franz
Grad oder Bogenmaß ?
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Gradmaß, sorry hab ich nicht erwähnt....
Gruß,
Franz
Viele dieser Funktionen hätten afaik gerne Bogenmaß als Input
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
hmmm,
aber
x = (double) tan( ( double ) 1.0 );
gibt er auch 0 aus....
und bei 70 nüsste halt dann mit Bogenmaß 1.22 rauskommen, da 70 ja ca. 22mal p(3.14) ist.
Hast du schonmal mit diesen Funktionen gearbeitet?
Gruß,
Franz
Zitat von Kaiser-F
War nicht böse gemeint... Will damit fragen ob die Funktionen überhaupt funktionieren mit den AVRs... Ansonsten muss ich selbst eine Funktion Programmieren um den Sinus zu berechnen....
FÜRCHT!
Gruß,
Franz
Ach was, ich bitte dich.Zitat von Kaiser-F
Ich verwend' sowas schon im Mengen, allerdings auf dem PC, da mir der AVR etwas leid tut.
Man müßt jetzt mal nachlesen, was es zu lesen gibt.
Bist du sicher, daß er nicht die ADDRESSE von dem double will ?
double funktion (double* value)
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Ja, tun sie. Und zwar sehr gut.Zitat von Kaiser-F
Wie oben schonmal gesagt erwarten sie die Werte im Bogenmaß.
Sowas steht zum Beispiel in dem Code für meinen Laufroboter:
MfG KjionCode:/* Berechnung des Winkels um den das Bein angehoben wird */ a = sqrt( z * z + b * b ); // 250 µS hebeWinkel = asin( ( FUSSLAENGE * sin(dtemp2) ) / a ) / M_PI * 180; // 840 µS dtemp = 180 - asin( b / a ) / M_PI * 180 - hebeWinkel; // 310 µS if ( z < 0) dtemp = (-1) * dtemp - 2 * hebeWinkel; // 15 µS dtemp = (dtemp / 180 ) * 255; // 55 µS
Nö, die Prototypen sind zB
Zitat von math.hDie trigonometrischen Routinen und allgemein float-Arithmetik braichen auch nicht gerade wenig Flash -- und zudem auch Rechenzeit und auch RAM. Übrigens implementiert die avr-libm nur den SFmode (also float). Die Prototypen sind allerdings wie oben, so daß hin- und hergewandelt wird. Die Genauigkeit von double hat man nicht.Zitat von Kaiser-F
Besser:Zitat von Kaiser-FDu bist sicher, daß dein USART_transmit (double) das macht, was du denkst? Und daß du die richtige libm.a verwendest?Code:double x; x = tan (70.0);
tan(70.0) ist 1.2219....Zitat von Kaiser-F
Disclaimer: none. Sue me.
Vielen vielen Dank für eure Hilfe!
Schätze mal dass es daran lag, dass ich tan(70); geschrieben habe, und nicht tan(70.0);
der Vektor wurde mir nicht ausgegeben...
Wär aber fast ein Fehler von mir gewesen.
Nochmals danke!
@Sprinter;
tan(70) ist tatsächlich 1,221959918
Gruß,
Franz
Lesezeichen