Forum: Mikrocontroller und Digitale Elektronik Winkel berechnen mit trigonometrischer Funktion asin


von Gerald F. (schwedenpils)


Lesenswert?

Hallo,

ich lese einen Beschleunigungssensor aus, der liefert mir die 
Erdbeschleunigung in mg. Ich habe folgendes Programm geschrieben, wenn 
ich die Beschleunigungswerte auf meinem Display ausgebe funktioniert 
alles, jetzt wo cih die trigonometrische Funktion drin habe, zeit mein 
Display aber immer nur +00000 an, stat mir einen Winkel als Integerwert 
zu liefern. Hier ist mein Code.

#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
#include <math.h>

#include "stringumwandlung.h"
#include "lcd.h"
#include "spi.h"


double asin(double);

int main(void)
{
  DDRC = 0xFF;  //LCD

  initialize_display();

  set_cursor(0, 0);
  write_string("Winkel: ");
  _delay_ms(1000);



  int Wert;
  char Ausgabe[7];
  double Zwischenwert;

  SPI_MasterInit();
  DDRD = 0xFF;
  while(1)
  {
    Wert = SCA3000_Read_16bit();
    _delay_us(20);

    Zwischenwert = Wert * 0.75;  //wegen Sensor Datenblatt S.17
    Zwischenwert = Zwischenwert/1000;   //arcsin Wert bilden
    Wert = asin(Zwischenwert);  //asin Wert in Winkel umwandeln

    my_itoa(Wert,&Ausgabe);

    set_cursor(0, 9);
    write_string(Ausgabe);
    _delay_ms(500);

  }

  return 0;
}

mfg
Gerald

von Karl H. (kbuchegg)


Lesenswert?

Hast du die Zahlen in Zwischenwert kontrolliert?

Du bist dir bewusst, dass du den Winkel in Radianten bekommst? Also 
nicht 0 bis 180 sondern 0 bis PI.

Den Prototyp für asin solltest du aus deinem Programm rausnehmen. Der 
muss über math.h reinkommen.

Die Mathe-Bibliothek libm.a hast du bei den Linkeroptionen eingetragen?

von Gerald F. (schwedenpils)


Lesenswert?

Äh nein die Linkeroption hab ich nicht eingetragen, kannst du mir evt. 
sagen wo man das im AVR-Studio macht?

In PI, das heisst dann das ich mein Ergebnis erst noch mit 3.14159 
multiplizieren muss?

Gruß Gerald

von Karl H. (kbuchegg)


Lesenswert?

Gerald F. schrieb:
> Äh nein die Linkeroption hab ich nicht eingetragen, kannst du mir evt.
> sagen wo man das im AVR-Studio macht?

so ähnlich wie hier.
Nur dass du lediglich libm.a brauchst und sonst nichts.

http://www.mikrocontroller.net/articles/FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_beim_WinAVR_mit_AVR-Studio

> In PI, das heisst dann das ich mein Ergebnis erst noch mit 3.14159
> multiplizieren muss?

Äh nein.
Dreisatz. PI Äpfel kosten 180 Euro. Wieviele Euro kosten 'Wert von asin' 
Äpfel?


   PI        ......  180°
   Wert      ......   x
  --------------------------

         180 * Wert
   x =  ------------
              PI

von Huch (Gast)


Lesenswert?

>In PI, das heisst dann das ich mein Ergebnis erst noch mit 3.14159
>multiplizieren muss?
Aber nein. Wenn Du PI als Winkel im Bogenmaß (das deutsche Wort für 
Radiant" nimmst, dann entspricht das 180°
Du musst also mit 180/PI multiplizieren.

von Gerald F. (schwedenpils)


Lesenswert?

Ja ok ich muss sagen ich schäm mich grad n bisschen....
Werd mal n stündchen pause machen vllt. gehen die gedanken dan wieder 
geradeaus

Gruß Gerald

von Huch (Gast)


Lesenswert?

Oops. Zu spät. Man sollte beim antworten nicht noch Tee kochen.

von Gerald F. (schwedenpils)


Lesenswert?

Bin jetzt grad am überlegen, meint ihr das in etwa so?

#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
#include <math.h>

#include "stringumwandlung.h"
#include "lcd.h"
#include "spi.h"


double asn(double);

int main(void)
{
  DDRC = 0xFF;  //LCD

  initialize_display();

  set_cursor(0, 0);
  write_string("Winkel: ");
  _delay_ms(1000);



  int Wert;
  char Ausgabe[7];
  double Zwischenwert;

  SPI_MasterInit();
  DDRD = 0xFF;
  while(1)
  {
    Wert = SCA3000_Read_16bit();
    _delay_us(20);

    Zwischenwert = Wert * 0.75;  //wegen Sensor Datenblatt S.17
    Zwischenwert = Zwischenwert/1000;   //arcsin Wert bilden
    Zwischenwert = asin(Zwischenwert);  //asin Wert in 0...PI umwandeln 
(0-180Grad)
    Wert = Zwischenwert * 180;

    my_itoa(Wert,&Ausgabe);

    set_cursor(0, 9);
    write_string(Ausgabe);
    _delay_ms(500);

  }

  return 0;
}

von Huch (Gast)


Lesenswert?

>Bin jetzt grad am überlegen, meint ihr das in etwa so?
Nun, was kommt denn raus?

von Huch (Gast)


Lesenswert?

Also ehrlich Karl Heinz, das:

>Dreisatz

>   PI        ......  180°
>   Wert      ......   x
>  --------------------------

>         180 * Wert
>   x =  ------------
>              PI

hättest Du aber wirklich deutlicher schreiben können. ;-)

Kleiner Scherz, nicht übelnehmen bitte.

von Karl H. (kbuchegg)


Lesenswert?

Huch schrieb:
> Also ehrlich Karl Heinz, das:
>
>>Dreisatz
>
>>   PI        ......  180°
>>   Wert      ......   x
>>  --------------------------
>
>>         180 * Wert
>>   x =  ------------
>>              PI
>
> hättest Du aber wirklich deutlicher schreiben können. ;-)

Ja, ich hätte meine Eselsbrücke (die nicht von mir stammt) auch noch mit 
angeben können.

"Zahl über x
 mal Stumpf durch Spitz"

> Kleiner Scherz, nicht übelnehmen bitte.

Kein Problem. Ich denke, ich hab dich schon verstanden, dass das kein 
Seitenhieb auf mich war :-)

Es ist im übrigen extrem angebracht, sicherzustellen, dass der Wert, den 
man dem asin vorwirft, auch tatsächlich im Bereich -1 ... +1 liegt. 
Nicht zuletzt deshalb kam ja auch der zusätzliche Vorschlag sich mal den 
Zwischenwert genauer anzusehen.

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
Noch kein Account? Hier anmelden.