-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 22

Thema: Funktionen: sin(); cos(); tan(); ... aus math.h

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    31
    Beiträge
    795

    Funktionen: sin(); cos(); tan(); ... aus math.h

    Anzeige

    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:

    Code:
    x = (double) tan( ( double ) 70 );
    
    USART_transmit( x );
    Wisst Ihr evtl. mehr darüber?

    tan70 sollte 2.47 sein. also müsste er 2 senden....
    Gruß,
    Franz

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Grad oder Bogenmaß ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    31
    Beiträge
    795
    Gradmaß, sorry hab ich nicht erwähnt....
    Gruß,
    Franz

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Viele dieser Funktionen hätten afaik gerne Bogenmaß als Input
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    31
    Beiträge
    795
    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

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    31
    Beiträge
    795
    Zitat Zitat von Kaiser-F
    Hast du schonmal mit diesen Funktionen gearbeitet?

    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

  7. #7
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Zitat Zitat von Kaiser-F
    ..War nicht böse gemeint...
    Ach was, ich bitte dich.
    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.

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.11.2003
    Beiträge
    991
    Zitat Zitat von Kaiser-F
    Will damit fragen ob die Funktionen überhaupt funktionieren mit den AVRs...
    Ja, tun sie. Und zwar sehr gut.

    Wie oben schonmal gesagt erwarten sie die Werte im Bogenmaß.

    Sowas steht zum Beispiel in dem Code für meinen Laufroboter:
    Code:
    /* 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
    MfG Kjion

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Nö, die Prototypen sind zB
    Zitat Zitat von math.h
    extern double sin(double __x) __ATTR_CONST__;
    Zitat Zitat von Kaiser-F
    um icht jeden einzelnen wert, von 0-360° abspeichern zu müssen, was ziemlich viel Flash kostet, will ich die werte berechnen lassen.
    Die 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 Zitat von Kaiser-F
    Code:
    x = (double) tan( ( double ) 70 );
    
    USART_transmit( x );
    Besser:
    Code:
    double x;
    x = tan (70.0);
    Du bist sicher, daß dein USART_transmit (double) das macht, was du denkst? Und daß du die richtige libm.a verwendest?
    Zitat Zitat von Kaiser-F
    tan70 sollte 2.47 sein. also müsste er 2 senden.
    tan(70.0) ist 1.2219....
    Disclaimer: none. Sue me.

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    31
    Beiträge
    795
    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

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •