Forum: Mikrocontroller und Digitale Elektronik Sinustabelle


von anfänger (Gast)


Lesenswert?

Hallo!

Hoffentlich kann mir einer helfen. Ich versuche gerade die
Spannungswerte für eine Sinustabelle zu ermitteln. Irgendwie drehe ich
mich bei der Berechnung im Kries. Die Formel ist doch y(t) =
A*sin(w*t)
mit A der Amplitude und w = 2  pi  F . Angenommen ich habe 2.5 V
Amplitude und eine Frequenz von 120 HZ dann folgt doch y(t) = 2.5 *
sin(2* pi  120  t). Ich möchte jetzt zum Beispiel 64 Werte
gleichmäßig verteilt über eine Periode aufnehmen. Bisher mach ich
irgendetwas falsch ... kann mir jemand auf die Sprünge helfen wie es
weitergeht.

Danke

von Wolfgang Niegsch (Gast)


Lesenswert?

Hallo,
die 64 Werte bekommst Du, wenn Du t von 0 bis T in Schritten von T/64
gehst. Wobei T = 1/f ist. Also T=1/120Hz=0,008333s
 mfg

von Christian Zietz (Gast)


Lesenswert?

Also: Eine Periode dauert bei 120Hz 1/120s. Wenn Du 64 Werte pro Periode
haben möchtest, musst Du alle 1/(120*64)s einen Wert berechnen. =>

y(i) = 2.5 * sin(2  pi  i/64) für i=0,1,2,...,63

Wie Du siehst, kürzt sich die Frequenz heraus. Das ist ja auch logisch,
da eine Sinusschwingung unabhängig von der Frequenz immer die selbe Form
hat. Welche Frequenz Du erhälst, bestimmst Du allein durch die Rate, mit
der Du die Werte später "abspielst".

von Niels H. (monarch75)


Lesenswert?

Das ist ja wohl Grundschulmathematik, oder?

Eine Periode ist 2*pi. Der 120igste Teil von 2*pi ist 2*pi/120. In
basic würde man das ungefär so ausdrücken:

for i = 0 to 2*pi step 2*pi/120
   y=sin(i)*a
next i

von Alex (Gast)


Lesenswert?

t = n * Tab;

Tab = 1 / Fab = 1 / (120Hz*64);

n = 0 ... 63;

von Max (Gast)


Lesenswert?

Hallo

ich weiß nicht ob dir das hilft oder ob du das meintest aber die 64
Werte erhälst du indem du 64 Werte für deine Zeit t einsetzt. Zum
Beispiel t1=0 sec;t2=1 sec; usw. Daraus ergibt sich dann eine
Sinuskurve. Willst du die Werte gleichmäßig über eine Periode verteilen
dann musst du die eine Periode halt berechnen: w=2*pi*f=1/T wobei T die
Periodendauer ist wenn du die durch 64 teilst bekommst du T/64 *1 = t1;
T/64 *2 = t2; ....

Hoffe ich konnte dir helfen

Max

von Niels H. (monarch75)


Lesenswert?

sorry, hab 120hz<->64 teilschritte verwechselt.
Bitte tausch einfach die 120 mit der 64.

Übrigens, da du nur 64 Teilschritte einer Periode haben möchtest, ist
die Frequenz egal...

von unbekannt (Gast)


Lesenswert?

Hat jetzt nicht noch einer einen Assemblercode dafür? :-D

Ich würde sagen, warte erst einmal, bis du das in der Schule hast.

von anfänger (Gast)


Lesenswert?

Alles klar! Wie ich sehe seid ihr deutlich schlauer als ich! Vor allem
der unbekannte. Aber warum tut es dann dieser C Code nicht ???

for(i=0;i<64;i++)
    {
    bogen = (((2*3.14)/64)*i)*(3.14/180);
    res = sin(bogen);
    printf("%.2f \n",res);
    fprintf(stream,"%.2f,\n",res);
    }

von MSE (Gast)


Lesenswert?

"Aber warum tut es dann dieser C Code nicht ???"

Wahrscheinlich weil irgendwelcher Quatsch mit Typumwandlungen
passiert.

Dein Programmausschnitt ist völlig nichtssagend, denn Du hast die
wichtigsten Informationen ausgelassen:

Die Deklaration der einzelnen Variablen. Welche Typen haben i, bogen
und res? Darauf kommt es an und da wird der Fehler liegen.
(Der Algorithmus als solcher ist richtig.)

Gruß, Michael

von MSE (Gast)


Lesenswert?

Nee, der Algorithmus ist leider auch falsch! Was soll der Term
'*(3.14/180)' ?

Gruß, Michael

von anfänger (Gast)


Lesenswert?

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(int argc, char *argv[])
{
int i;
double res;
double bogen;
FILE *stream;

if((stream = fopen("sin_array.csv","w")) == NULL){
           printf("\n\nERROR OPENING FILE - maybe file is in use by
other program\n\n");
           system("PAUSE");
           exit(1);}

    for(i=0;i<64;i++)
    {
    bogen = (((2*3.14)/64)*i)*(3.14/180);
    res = sin(bogen);
    printf("%.2f \n",res);
    fprintf(stream,"%.2f,\n",res);
    }

  fclose(stream);
  system("PAUSE");
  return 0;
}

Die Funktion sin() aus der math Bibliothek erwartet doch einen Winkel
im Bogenmaß ... daher der zusätzliche Faktor.

von anfänger (Gast)


Lesenswert?

uh falsche Version:
Die double Variablen sind im aktuellen Source FLOAT

von Christian Zietz (Gast)


Lesenswert?

Und was meinst Du, was 2*pi*(i/64) ist? Das ist doch schon Bogenmaß,
sonst würdest Du schließlich 360*(i/64) schreiben.

von anfänger (Gast)


Lesenswert?

...Das macht natürlich irgendwie Sinn!

Danke

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.