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


von Marco Schramm (Gast)


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.

von Rahul (Gast)


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).

von Rahul (Gast)


Lesenswert?

Fehler meinerseits:
x = 128*sin(t)

von Bernhard S. (bernhard)


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

von Marco Schramm (Gast)


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.

von Marco Schramm (Gast)


Lesenswert?

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

von Rahul (Gast)


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...

von Karl heinz B. (kbucheg)


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.

von Xenu (Gast)


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.

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.