STM32 Sinussignal via DAC

OP #7752320
Lesenswert?

Moin zusammen,

heute wende ich mich mit einer Programmierfrage an euch, ich stehe offenbar total auf dem Schlauch.

Will eigentlich ein 0 bis 3,3V Sinussignal an meinem 12Bit-DAC erzeugen und nutze dafür die folgende Schleife:

1
#define PI 3.1415926
2

3
void calcsin(void){
4

5
  for (int i = 0; i<100; i++){
6

7
             sine_value[i] = (sin(i*2*PI/100)+1)*2048;
8

9
    }
10
}

Also eigentlich nichts Spannendes. Die Ausgabe klappt auch an sich (nutze Timer 6 + DMA) - leider wird mir das Signal oben und unten ein wenig abgeschnitten. Woran könnte das liegen? Ich nahm an, die Skalierung sei so in Ordnung.

Vielen Dank schon Mal!

#7752343
Lesenswert?

Ob S. schrieb:

Don K. schrieb:

1
         sine_value[i] = (sin(i*2*PI/100)+1)*2048;
1
                                               ^^^^

Das ist nur die halbe Miete, bei 0.0 Volt würde immer noch abgeschnitten, sin() darf auch nicht 0 werden. 6% weniger sind bei 3.3V ca. 0.2V weniger, das verspricht ST z.B. für den STM32F334 mit eingeschaltetem Buffer. Ohne Buffer wären es nur einstellige mV, aber der Ausgang ist dann so hochohmig (15k), dass man das kaum nutzen kann. Vielleicht so:

1
sine_value[i] = lround ((sin(i*2.0*PI/100.0)*0.94+1.0)*2048.0);
#7752345
Lesenswert?

Don K. schrieb:

leider wird mir das Signal oben und unten ein wenig abgeschnitten. Woran könnte das liegen? Ich nahm an, die Skalierung sei so in Ordnung.

Zusätzlich zu den Hinweisen bezüglich Skalierung noch Folgendes: Man kann für den STM DAC einen Buffer/Verstärker ein/ausschalten. Mit Buffer kann man zwar besser/stärker belasten, jedoch nicht die volle rechnerische Amplitude verwenden.

BB war schneller…

#7752358
Lesenswert?

Ob S. schrieb:

Er benutzt ja schon mehr als die "volle rechnerische Amplitude".

Deshalb schrieb ich ja:

Zusätzlich zu den Hinweisen bezüglich Skalierung…

Aber danke für's weglassen. ;-)

Außerdem schrieb der OP:

leider wird mir das Signal oben und unten ein wenig abgeschnitten.

Das ist nur mit Multiplikation 2048 überhaupt nicht zu bewerkstelligen, da würde ausschließlich oben eine einzelne Pixelhöhe abgeschnitten.

#7752378
Lesenswert?

Ob S. schrieb:

Norbert schrieb:

Das ist nur mit Multiplikation 2048 überhaupt nicht zu bewerkstelligen, da würde ausschließlich oben eine einzelne Pixelhöhe abgeschnitten.

Ähemm, welche Pixel?

Im Übrigen: -1 ist für den DAC ungefähr genauso sinnvoll wie +2048...

Du meine Güte, man kann sich auch künstlich dumm stellen.

Ein Sinus von -1 … +1 mit 248 multipliziert ergibt einen Bereich von -2048 … +2048. Da packt man einen +2048 Offset dazu und so geht die Kurve ›unten‹ genau bis 0 und oben schießt es um ein LSB (besser so?) über's Ziel hinaus. Also skaliert man mit 2047 und ist aus dem Schneider.

(Firma: 1984now) #7752389
Lesenswert?

Rainer W. schrieb:

Norbert schrieb:

Das stimmt, wenn man nicht mit Rechenoperationen arbeitet die Sättigung berücksichtigen.

Der TO könnte einfach ein Oszillogramm und die Wertetabelle mit den 100 Werten zeigen, die zum DAC geschickt werden.

Das kannst du von einem offensichtlichen Troll nicht wirklich verlangen. Da müsste er ja arbeiten.

Aber OK, manche Trolle sind zu einigem bereit, um den Thread am Laufen zu halten. Schau'n wir mal.

Ich denke aber mal: Er hält sich erstmal raus. Läuft doch noch gut genug ohne weiteres Futter.

Wenn, dann kommt das erst, wenn der Thread einzuschlafen droht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren