Forum: Compiler & IDEs Sin/Cos aus 16Bit Wertebereich


von Holzi (Gast)


Lesenswert?

Hi,

ich habe einen Motor mit 16 Bit Auflösung (0-65536) für eine 
Umdrehenung.
Ich möchte jetzt daraus einen Cos und Sin machen, so dass wenn ich ihn 
drehe.
Hatte gedacht den Wertebereich (65536 - die Hälfte), damit ich einen 
Bereich von -32768 bis + 3232768 bekomme. Jedoch würde er bei jeder 
Umdrehung wieder von + nach - schlagartig ändern. Wie bekomme ich aus 
einem solchen Wertebereich eine Sinus Funktion?

LG

von Oliver (Gast)


Lesenswert?

Die üblichen sin()-Funktionen nehmen als Parameter den Winkel im 
Bogenmass, also für eine Umdrehung 0..2*Pi.

Dein Zähler läuft für eine Umdrehung von 0..65535

Der Rest ist ein einfacher Dreisatz.

Oliver

von Holzi (Gast)


Lesenswert?

dachte mir Sin/Cos Arrays zu schreiben.
Die Antwort von Oliver ist mir noch nicht so ganz eindeutig!
1
    int amount = 65536; 
2
    int cosinus_array[65536];
3
    int sinus_array[65536];
4
      
5
   // COSINUS - START 32768 
6
    for (i=0; i<(amount-1); i++)
7
        cosinus_array[i]=((amount/2)-1)*cos((double)i/amount*2*3.14);
8
        
9
    // SINUS - START 0
10
    for (i=0; i<(amount-1); i++)
11
        sinus_array[i]=((amount/2)-1)*sin((double)i/amount*2*3.14);

von DirkB (Gast)


Lesenswert?

Hast du dir mal Überlegt wie viel Speicher dabei drauf geht?

Es reicht wenn man nur einen Quadranten der Sinuskurve ablegt. Den Rest 
kann man durch Vorzeichenwechsel und/oder Spiegeln ermitteln.

von Detlev T. (detlevt)


Lesenswert?

Man könnte auch einmal nach CORDIC googlen. ;-)

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.