www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 8Bit -DAC Für 2 sinusförmige Frequenzen Tabelle berechnen


Autor: Marco Schramm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

nachdem sich herausgestellt hat, das mit einem 8Bit-DAC-Baustein mit
nachgeschaltetem OP ich meine beiden benötigten sinusförmigen
Frequenzen (1200Hz und 1800Hz) einfach erzeugen kann, geht es an die
Details.

Ich muß ja nun 2 Tabellen entwerfen, in denen ich jeweils die Bytes für
die Ansteuerung des DAC ablege.

Ich zerlege also meinen Sinus in  kleine "delta" t. Für jedes
"delta" t ist nun der zugehörige y Wert auszurechnen, wobei Zeiger
senkrecht nach oben =1 (volle Ausgangsspannung Vmax). Zeiger waagerecht
nach unten =0 (Ausgangspannung =0V).

Auf die Bytes übertragen bedeutet =1, dann 11111111b und =0 dann
00000000b . Das war ja einfach. Jetzt muß ich die Zwischenwerte
berechnene.
Annahme: Bei t = 0,04ms beträgt der y-Wert vom Sinus 0,36

Bei einem 8Bit-DAC betragen die normierten Stufen 1/256 =0,0039.

Habe ich mir in Excel eine Tabelle berechnet, so kann ich nachschauen,
welche Stufe meinem Y-Wert(Annahme 0,36) am nächsten liegt.

Dies wäre 0,36 durch 0,0039 = 92,3.. Also die 92 Stufe

92dez entspricht 5Chex

Das bedeutet: Bei t = 0,04ms muß der Mikrocontroller den 8-Bit-DAC mit
dem Hexwert 5C ansteuern.

Wäre nett, wenn das mal jemand überfliegen könnte und auf Richtigkeit
prüft.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du brauchst nur eine Tabelle, in der sich die Werte für eine
Viertelschwingung befindet. (Die Musst du entweder mit der höheren oder
der niedrigeren Frequenz insgesamt vier mal ausgeben (vorwärts,
rückwärts, 128-vorwärts, 128-rückwärts).

Die Werte kannst du ziemlich einfach durch 127*sin(t) berechnen
(lassen).

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fehler meinerseits:
x = 128*sin(t)

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da gebe ich Rahul Recht, eine Tabelle würde genügen,

http://www.mikrocontroller.net/forum/read-4-360801.html

seit dem es gibt Timing-Probleme, da die beiden Frequenzen elativ dicht
beieinander liegen.

Bernhard

Autor: Marco Schramm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Rahul,

den y-Wert berechne ich mit y = sin(2*pi*f*t).

Um den zu sendenden binären Wert zu berechnen, muß ich
dieses Ergebnis durch 256 teilen.

Also ergibt sich:  bitwert = 256 * sin(2*pi*f*t)

Für einen Sinus benötige ich positive und negative Werte, sprich ich
muß die 256 möglichen Werte in 2 Hälften unterteilen. Ergibt je 128
Werte.

Damit ergibt sich: bitwert = 128 * sin(2*pi*f*t) . Kann es sein, daß du
die 2*pi*f unterschlagen hast?

Was jetzt noch zu prüfen wäre, wie ist das mit einer exakten Nullinie.
Wie ist das mit dem nachgeschalteten OP (der wahrscheinlich sogar auf
Nulllinie abgeglichen werden muß?

Jaetzt ist ja Wochenende und zeit darüber nachzudenken.

Autor: Marco Schramm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um Mißverständnissen vorzubeuegen:
Ich muß durch 1/256 teilen. Mit der guten alten Bruchrechnung steht 256
damit wieder oben.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe t im Bogenmaß angegeben...
Wenn du einen Blick auf die Sinus-Kurve wirfst, wird dir auffallen,
dass man sie an einer senkrechten Gerade, die durch pi/2 geht spiegeln
kann.
Durch eine Punktspiegelung bei an der Stelle pi auf Höhe der 0-Linie,
ergibt sich wieder ein Kopie. Dass das letzte Kurvensegment auch noch
eine Kopie/Spiegelung der ersten ist, brauche ich wohl nicht zu
erwähnen.
Mna könnte die Tabelle so auslegen, dass sie für 600Hz einen schönen
sinusförmigen Verlauf hat. Dann könnte man sie mit doppelter bzw.
dreifacher Frequenz ausgeben...

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> bitwert = 128 * sin(2*pi*f*t)

fast

bitwert = 127 * sin(2*pi*f*t) + 127

ich denke nämlich nicht, dass dein DAC mit
2-er Komplementwerten so richtig glücklich ist.

Autor: Xenu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Statt einer Tabelle kann man übrigens auch eine andere Methode benutzen:
einen rekursiven (Digital-)Resonator.

Hört sich schlimm an, ist aber recht einfach, siehe AppNote von Maxim
für ihren MAXQ-Controller (auf Seite 3):

http://pdfserv.maxim-ic.com/en/an/AN3386.pdf

Du musst für einen Sinus nur einen Wert vorausberechnen, und der
Controller braucht dann pro zu berechnenden aktuellen Wert nur eine
Multiplikation und eine Subtraktion ausführen. Dein Controller sollte
deshalb vorzugsweise einen Hardwaremultiplizierer haben.

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.