www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik DDS Sinus Tabelle wie berechnen ?


Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich versuche mich gerade an einem DDS via PWM mit einem Mega8.
Soweit ich DDS verstanden habe legt man eine Tabelle mit Sinus Werten
in den Speicher und variiert dann via Offset Frequenz und Amplitude.
Doch wie berechne ich diese Sinus Tabelle korrekt ?
Sie müßte ja von 0 über 1 zu 0 gehen, wobei 0 jeweils den Index 0 und
255 hätte, dann wäre 1 bei Index 127 zu finden.
Stimmt das ?
Wie berechne ich nun die Tabelle korrekt ?
Es gibt ja keine Gleitkomma-Zahlen, sondern ich muß den Wert auf einen
8bit Integer abbilden.
Ich suche keine fertige Tabelle, sondern eine Formel oder Erklärung wie
man eine solche Tabelle richtig berechnet !
Meine Tabelle soll mit 255 8bit Werten einen vollen Sinus abbilden, bei
8bit Fast PWM.
Danke,
Markus

Autor: Christoph Kessler (db1uq) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zum Beispiel mit einem Tabellenkalkulationsprogramm, Excel oder
OpenOffice-Calc. Damit geht sogar eine direkte Ausgabe als Hex-Zahl.

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schreib dir ein C Programm das die Werte berechnet:
for (i=0; i<255; i++)
wert[i]=128+127*sin((double)i/256*2*pi);

Da du den Wert ja als 8bit ausgibst, normierst du die Sinuskurve
einfach auch auf den 8bit Bereich: +1 -> +127, -1 -> -127, 0->0

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zitat Benedikt:
"Schreib dir ein C Programm das die Werte berechnet:
for (i=0; i<255; i++)
wert[i]=128+127*sin((double)i/256*2*pi);

Da du den Wert ja als 8bit ausgibst, normierst du die Sinuskurve
einfach auch auf den 8bit Bereich: +1 -> +127, -1 -> -127, 0->0"

Hmmmmm,
da fällt mir gerade auf das der Sinus ja in den negativen Bereich geht,
ich aber ja nur von 0V auf VCC gehen kann ?
Wie wird dann die negative Hälfte des Sinus dargestellt ?
Null-Linie bei VCC/2 ?
Und Dein Typecast ist wegen der sin-Funktion, stimmts ?
Danke für die Hilfe ;)
Bye,
Markus

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, -127 -> 0V, 0 -> Vcc/2, +127 -> Vcc
OK, nicht ganz, da eigentlich -128 0V entspricht, aber dieses 1 bit
bemerkt man sowiso nicht.

Der Typecast ist, damit die Division nicht als int durchgeführt und
somit der Kommateil abgeschnitten wird.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wie wird dann die negative Hälfte des Sinus dargestellt ?

Du bist aber sehr fanatasielos.

> Null-Linie bei VCC/2 ?
Zum Bleistift.

> Und Dein Typecast ist wegen der sin-Funktion, stimmts ?

Nein.
Traditionell heist eine Integer-Laufvariable in einer
Schleife 'i'. Wir können also davon ausgehen, dass i ein
int ist.
Was ist dann das Ergebnis von i/256

Hinweis: i ist ein int, 256 ist ein int. Also ist das Ergebnis
von i/256 ebenfalls ein int und die Division wird als ganze
Zahl ausgeführt.

Mit dem cast wird der Compiler gezwunden, die Division als
Gleitkommaoperation durchzuführen, da er dann einen double
durch einen int dividiert. Gleiches hätte man auch
erreichen können, indem man die 256 zu einem double macht:

    i / 256.0

Autor: hal (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit DDS ist es möglich nur (Sinus)Signale mit Frequenzen etwa = 1/8 der 
Stützstellen vernünftig darzustellen, max. jedoch bis 1/2 der 
Stützstellen. Also, wenn man pro Periode 256 Stützstellen hat, kann man 
mehr oder weniger sinus-ähnlich 256 Samples/Sek/8 = 32 Hz Signale 
ausgeben.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ hal (Gast)

Schon mal aufs Datum des letzten Postings geschaut?

MfG
Falk

Autor: Stefan M. (stefan_m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>
> Schon mal aufs Datum des letzten Postings geschaut?

Scheinbar nicht :D

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welches Datum?

Autor: Gebhard Raich (geb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier ein kleines C-Programm wo du Auflösung,Amplitude und Offset 
einstellen kannst.
Es liefert gleich einen Integer-Buffer, der mitcompiliert werden kann.
#include <ansi_c.h>

#define LEN  512
#define PI 3.141592654
#define MAX_AMP 1154
#define OFFSET  0x07FF

void main(void)
{
  int i,n;
  double sin_val;
  int cal_val;

  n=0;

  printf("\n");
  printf("#define TABLES_LEN %d\n", LEN);
  printf("const uint16_t TableS[] = {\n");

  while(n<LEN){
    for(i=0;i<8;i++){
      sin_val= sin(2.0*PI*n/LEN);
      cal_val= sin_val*MAX_AMP + OFFSET;
      printf("%d,",cal_val);
      n++;
    }
    printf("\n");          
  }          

  printf("}\n"); 
}

: Bearbeitet durch Moderator
Autor: Oliver K. (atomicjunkie)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab mal für einen Sinus Generator 2-PWM-Ausgänge benutzt.
Vorteil ist, man hat eine höhere Auflösung (0-1 entspricht 0-PWM_MAX), 
da nur eine Viertelperiode in der Tabelle gespeichert werden muss.
Dazu habe ich mir zu nutze gemacht, dass die Sinuskurve 2x gespiegelt 
werden kann (horizontal / vertikal)
Mit nachgeschaltetem Operationsverstärker kann man somit negative 
Sinuswerte erzeugen.

Das kurze kurze Testprogramm und ein Screenshot der Simulation befindet 
sich im Anhang.

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Was ist das für eine Simulationssoftware, die hier verwendet wurde?

Gruss,
Tom

Autor: HierBeliebigenNamenEinfügen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Würde ich auch gerne Wissen

Autor: Ingenieur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, ist das gfs "electronics workbench"?

Autor: Harald Wilhelms (wilhelms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus schrieb 2006:

Was ist das denn für ein seltsamer Thread? Wird der alle 1...2
Jahre einmal geweckt?

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Harald Wilhelms schrieb:
> Was ist das denn für ein seltsamer Thread? Wird der alle 1...2
> Jahre einmal geweckt?

Ist wie der Hoppeditz, der wird auch einmal im Jahr geweckt.

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.