mikrocontroller.net

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


Autor: Gerald F. (schwedenpils)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Gerald F. (schwedenpils)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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#Aktivi...

> 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

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gerald F. (schwedenpils)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Huch (Gast)
Datum:

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

Autor: Gerald F. (schwedenpils)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Huch (Gast)
Datum:

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

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.