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:
1 | for (i=0; i<32; i++) sinTable[i] = sin(2.0*PI*x/32)*2048 + 2048; |
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
Okay, gerade nochmal nachgedacht, die 2048 stehen für 11bit? Kann das sein? Und was bewirkt es das ganze dann auf 4096 zu ändern?
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ß,
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.