mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Sinustabelle


Autor: anfänger (Gast)
Datum:

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

Autor: Wolfgang Niegsch (Gast)
Datum:

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

Autor: Christian Zietz (Gast)
Datum:

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

Autor: Niels Hüsken (monarch75)
Datum:

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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
t = n * Tab;

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

n = 0 ... 63;

Autor: Max (Gast)
Datum:

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

Autor: Niels Hüsken (monarch75)
Datum:

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

Autor: unbekannt (Gast)
Datum:

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

Autor: anfänger (Gast)
Datum:

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

Autor: MSE (Gast)
Datum:

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

Autor: MSE (Gast)
Datum:

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

Gruß, Michael

Autor: anfänger (Gast)
Datum:

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

Autor: anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uh falsche Version:
Die double Variablen sind im aktuellen Source FLOAT

Autor: Christian Zietz (Gast)
Datum:

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

Autor: anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...Das macht natürlich irgendwie Sinn!

Danke

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.