Winkel berechnen mit trigonometrischer Funktion asin

OP #1999064
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
#1999072
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?
#1999105
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
Gast #1999107
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.
OP #1999275
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;
}
Gast #1999284
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.
#1999292
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.

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