Forum: Analoge Elektronik und Schaltungstechnik Probleme mit DAC


von DB (Gast)


Lesenswert?

Hallo Forum,

habe ein (vermutlich Verständnis) Problem mit einem DAC von TI. (DAC7578 
http://www.ti.com/product/dac7578 ).

Mir ist klar dass ich um ein Analoges Signal am Ausgang erzeugen zu 
wollen, diverse Werte in die dafür vorgesehenen Register schreiben muss. 
Die Kommunikation per I2C ist auch kein Problem und funktioniert, bzw. 
darum geht es mir nicht. Ich kann aus dem Datenblatt nicht ersehn welche 
Werte ich  in die dafür vorgesehenen 12bit Register schreiben muss. Nach 
einer Google Recherche habe ich herausgefunden dass man mit Hilfe eines 
externen Programms sich die Werte erzeugen lassen kann. Ich habe auch 
schon einige dieser Programme, bzw. fertige Werte gesehen, jedoch sind 
die meistens im float Format, und ich nehme an ich brauche integer 
Werte.
Aus dem Tutorial von "diller-technologie" habe ich z.b. an Hand des 
internen DAC des STM32 folgende Werte:

sinTable[32] = {
  2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056,
  3939, 3750, 3495, 3185, 2831, 2447, 2047, 1647, 1263, 909,
  599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 1263, 1647};



Also jetzt hier mal meine konkrete Frage. Wie berechne ich mir die Werte 
für meine DAC, sodass integer Werte rauskommen? (wie oben) Und verstehe 
ich es richtig, dass ich die Werte dann nach und nach in mein 
DAC-Register laden muss, wobei die Frequenz mit der ich die Daten 
"nachlade" gleichzeitig meine Ausgangsfreuquenz bestimmt? Ich habe mir 
das also so vorgestellt, ich lege meine Tabelle dann statisch im 
Programmcode an, und lade mithilfe eines Timers, oder Interrupt dann 
nach und nach die komplette Tabelle in die DAC-Register?
Ich hoffe die Frage ist nicht all zu dumm gestellt. Bin für jeden Tipp 
dankbar, raufe mir hier schon seit zwei Tagen die Haare vom Kopf.


Gruß,

Dominik

von Thomas (Gast)


Lesenswert?

DB schrieb:
> Wie berechne ich mir die Werte für meine DAC, sodass integer Werte
> rauskommen?

Indem du sie mit einer Normierungskonstanten multiplizierst und das 
Ergebnis auf eine Ganze Zahl rundest.

von DB (Gast)


Lesenswert?

Thomas schrieb:
> Indem du sie mit einer Normierungskonstanten multiplizierst und das
> Ergebnis auf eine Ganze Zahl rundest.

Und wo bekomme ich diese Konstante her? Sorry, aber ich versteh das mit 
den Werten wirklich noch nicht. Trotz Suche und Recherche.

Danke

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

DB schrieb:
> Wie berechne ich mir die Werte für meine DAC, sodass integer Werte
> rauskommen?
Mit einer Sinusfunktion?
Für die oben angegebene Tabelle so etwa:
1
 for (i=0; i<32; i++)  sinTable[i] = sin(2.0*PI*x/32)*2048 + 2048;

von DB (Gast)


Lesenswert?

Lothar Miller schrieb:
> for (i=0; i<32; i++)  sinTable[i] = sin(2.0*PI*x/32)*2048 + 2048;

das x soll eigentlich ein i sein, oder?
Gut, mit dem Programm komme ich auf die gleichen Werte wie oben, 
trotzdem verstehe ich noch nicht, woher diese 2048 kommen, bzw was 
bewirken sie?
Sorry für die Fragen, aber ich will wirklich verstehn was es damit 
aufsich hat.

Danke

von DB (Gast)


Lesenswert?

Okay, gerade nochmal nachgedacht, die 2048 stehen für 11bit? Kann das 
sein? Und was bewirkt es das ganze dann auf 4096 zu ändern?

von mr. mo (Gast)


Angehängte Dateien:

Lesenswert?

DB schrieb:
> trotzdem verstehe ich noch nicht, woher diese 2048 kommen, bzw was
> bewirken sie?

Weil du in der Regel an einem DAC keine negative Spannung ausgeben 
kannst. Daher musst du deinem Sinus einen Offset verpassen, damit du 
nach oben und unten gleich viel "Luft" hast. Man sollte daher den Offset 
auf die hälfte der maximalen Amplitude legen. Das wäre bei dir 4096/2 = 
2048.

Weil du nun deinem Sinus einen Offset verpasst hast kannst du natürlich 
nur noch die halbe Amplitude ausnutzen und das sind wieder 2048.

DB schrieb:
sin(2.0*PI*x/32)*2048    +    2048;

              Amplitude      Offset

Im Anhang habe ich mal einen Matlab Plot angehängt welcher genau das 
zeigt. Die Frequenz wäre aber eine andere, soll hier nur zum 
verdeutlichen sein.

von DB (Gast)


Lesenswert?

Ah, jetzt wird einiges klarer. So kann ich dann z.B auch die Amplitude 
meiner Ausgangspannung verändern, indem ich den Multiplikand verändere 
(z.b. auf die Hälfte)?
Und die Frequenz stelle ich über die "Nachladezeit" des Controllers ein?

Macht es Sinn die Tabelle direkt auf dem  Controller ( STM32) zu 
errechnen, oder fest zu definieren. Ziel des kompletten Aufbaus ist es 
per UART die Frequenz und Amplitude des DAC zu verändern. (Teil des 
Aufbaus).

Ihr habt mir schonmal sehr geholfen, Danke dafür.

von mr. mo (Gast)


Lesenswert?

DB schrieb:
> Ah, jetzt wird einiges klarer. So kann ich dann z.B auch die Amplitude
> meiner Ausgangspannung verändern, indem ich den Multiplikand verändere
> (z.b. auf die Hälfte)?
> Und die Frequenz stelle ich über die "Nachladezeit" des Controllers ein?

Damit der Sinus gleichmäßig wird brauchst du einen Timer der dir mit 
jedem Interrupt den aktuellen Sinuswert zum DAC schickt. Die Frequenz 
ist dann abhängig von der Anzahl deiner Stützstellen des Sinus und der 
Auslösezeit des Timer Interrupts.

Heisst auch gleichzeitig, dass deine maximale Frequenz unter anderem von 
dem Timer abhängt, wobei dir hierbei i2c eher die Frequenz beeinflusst.

> Macht es Sinn die Tabelle direkt auf dem  Controller ( STM32) zu
> errechnen, oder fest zu definieren. Ziel des kompletten Aufbaus ist es
> per UART die Frequenz und Amplitude des DAC zu verändern. (Teil des
> Aufbaus).

Ich habe sowas mal für nen STM32F4 programmiert, daher stammt auch noch 
mein Matlab Script für die Lookup Table. Wenn es nicht für ein Projekt 
gewesen wäre, dann hätt ich dir den Code gegeben :/ Konnte genau die 
beiden Parameter per UART ändern.

Welchen STM32 hast du denn da? Der F4 hat z.B. zwei 12Bit DAC schon 
eingebaut.

von DB (Gast)


Lesenswert?

STM32F103C8
Danke für dein Angebot, aber ich will(muss :) ) es schon selber 
schreiben; Ist für ein größeres Projekt, wo wir mehrere Kanäle brauchen 
(Summe circa 10). Ist aber nur Probeweiße jetzt so, damit wir eben 
testen können ob der I2C oder UART da mitkommen.
Vielen Dank nochmal, fürs Licht ins Dunkle bringen.
Sofern ich noch Probleme habe, schreibe ich nochmal :)

Gruß,

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.