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
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.
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
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:
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
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.
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.
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.
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ß,