Hallo liebe Mikrocontroller-Community,
ich habe ein Problem und würde mich freuen wenn mir einer helfen kann.
Ich benutze den STM32F407 um ein Sinus-Signal mit einer Mittenspannung
von 1,65 Volt zu erzeugen.
Grundlage ist eine Konstante innerhalb welcher eine Periode als Werte
abgespeichert sind:
2048 stellt als Startwert die Mittenspannung 1,65 Volt dar.
Ich verwende weiterhin einen DMA um die Werte der Konstante in den DAC
zu schreiben. Der DMA ist als Ringpuffer konfiguriert und durchläuft
diesen auf Basis eines Timers.
Das funktioniert alles wunderbar, mit einer einzigen Ausnahme: der DAC
startet nicht bei 2048 den Durchlauf sondern bei einem Wert, welcher 0,8
Volt entspricht. Siehe das angehängte Bild.
Ich habe keine Ahnung woran das liegen kann, fällt euch was ein?
Hier ein Teil des Initialisierungscodes:
Im DAC Channel 2 output buffer stehen die 0,8 Volt als Startwert bereits
nach der Initialisierung DAC_Cmd(); drin.
Vielen Dank schonmal im Voraus für eure Mühen!
Mach mal
DMA_InitStructure.DMA_BufferSize = 1;
und schaue was für eine Spannung ausgegeben wird, müsste ja konstant
1,65Volt sein, berichte dann hier.
Gruß Jonas
was ist das denn für ein array das du nutzt?
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Sinus12bitWeighted;
dachte du brauchst das const uint16_t Sinus12bit ?
Hallo,
es könnte sein, dass die ersten Werte der Wertetabelle nicht dem Sinus
von 0 Grad entsprechen, sondern zum Beispiel bei -45 ° beginnen.
Wie sieht es aus, wenn die ersten 25 Werte von Sinus12bit[100] am
Ende stehen?
Dann müsste die Kurve auf einen höheren Spannungswerte beginnen.
Der genaue Index für 0 Grad müsste nochmal genau berechnet werden.
Gruß Lutz
Verwende ich Sinus12Bit anstatt dem neu berechnetten Vektor habe ich das
gleiche problem wie vorher.
@ Lutz:
Verschiebe ich die Werte kommt es in der tat dazu, dass irgendwann Start
und Endwert stimmen.
Das löst zwar die Problematik, aber nicht das Verständnis, woher diese
"Phasenverschiebung" kommt und der Ringpuffer irgendwo anfängt und nicht
am Anfang des Arrays.
Tobias P. schrieb:> Das löst zwar die Problematik, aber nicht das Verständnis, woher diese> "Phasenverschiebung" kommt und der Ringpuffer irgendwo anfängt und nicht> am Anfang des Arrays.
Der Ringpuffer wurde von irgendjemanden berechnet,
und da sind Wertepaare hinterlegt.
Der index 0 entspricht dem Sinus eines bestimmten Winkels , und so
weiter.
Logik ist da keine . An jedem beliebigen Index kann so jeder beliebige
Spannungswert ausgegeben werden.
Der Hintergrund ist, dass die Sinusberechnung ziemlich aufwendig ist,
und deshalb oft Wertetabellen genutzt werden, bei denen die Berechnung
lange vordem Nutzen der Werte erfolgt.
lutz h. schrieb:> Tobias P. schrieb:>> Das löst zwar die Problematik, aber nicht das Verständnis, woher diese>> "Phasenverschiebung" kommt und der Ringpuffer irgendwo anfängt und nicht>> am Anfang des Arrays.>> Der Ringpuffer wurde von irgendjemanden berechnet,> und da sind Wertepaare hinterlegt.> Der index 0 entspricht dem Sinus eines bestimmten Winkels , und so> weiter.> Logik ist da keine . An jedem beliebigen Index kann so jeder beliebige> Spannungswert ausgegeben werden.>> Der Hintergrund ist, dass die Sinusberechnung ziemlich aufwendig ist,> und deshalb oft Wertetabellen genutzt werden, bei denen die Berechnung> lange vordem Nutzen der Werte erfolgt.
Das dürfte Tobias klar sein und die ersten Werte der Tabelle sehen ok
aus - das dürfte sin(2048*x)+2048 sein. Die Referenzspannungen sind
offensichtlich auch da, sonst wäre das Oszillogramm nicht so, wie es
ist.
Was fehlt ist ein: DAC_DeInit();
Aber das dürfte eigentlich nicht das Problem lösen.
>IntermediateValue-2047
Nur nebenbei: Wie kommst du auf 2047 überall in den Berechnungen?
>Das löst zwar die Problematik, aber nicht das Verständnis, woher diese>"Phasenverschiebung" kommt und der Ringpuffer irgendwo anfängt und nicht>am Anfang des Arrays.>@ Jonas:>In der tat führt Buffersize=1 dazu, dass konstant 1,65 Volt am Ausgang>stehen.
Erhöhe mal langsam den Wert für Buffersize und schaue was passiert.
Ich vermute ein Pointer | Überlauf | falscher cast etc Problem, bzw.
kann es sein dass der dac noch nicht ready ist und daher die ausgabe
mitten im ringbuffer beginnt? nur ein gedanke...
Gruß Jonas
Weil 2047 "meine " gewählte Mittenspannung ist. Ob 2048 oder 2047 ist ja
eigentlich egal. Basis sind die 12 bit vom ADC.
Wenn ich die Buffersize erhöhe sieht das ganze richtig zerwirscht aus.
DAC bricht nach den 100 Werten zusammen. Vermutlich weil Buffer
natzürlich leer. Natürlich periodisch.
Pointer würde ich gerne mal finden für den Ringpuffer ...
Zwischen Initialisierung und betrieb des DACs vergehen mindestens 2 ms,
sollte reichen.
LG
Ich habe jetzt erstmal die Phasenverschiebung angepasst. Ich warte
einfach mal drauf das sich das ganze auf Grund weiterer
Programmierarbeiten verschiebt, dann könnte ich die Ursache eingrenzen.
>Ich habe jetzt erstmal die Phasenverschiebung angepasst. Ich warte>einfach mal drauf das sich das ganze auf Grund weiterer>Programmierarbeiten verschiebt, dann könnte ich die Ursache eingrenzen.
Möp. Schlechteste was du tun kannst. Ich würde dem auf den Grund gehen,
oder den Code rausnehmen und mich um andere Dinge kümmern, aber auf den
aktuellen Code willst du nicht weiter aufbauen...Nur ein Tip.
Gruß Jonas
>Pointer würde ich gerne mal finden für den Ringpuffer ...
Ehm ?
>DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Sinus12bitWeighted;
Das Array ist eine Datenstruktur, auf das erste Element des Arrays
zeigst du hier und das ist eine Adresse = Pointer :)
Oha, jetzt gibt's bestimmt haue von den Mods weil ich was falsch erklärt
hab...
Gruß Jonas
@Jonas: Auf dem Code wird nicht weiter aufgebaut, keine Sorge. Fehler
ist nicht gefunden.
Deine Pointer-Theorie stimmt hier nicht, sonst würde das problematische
Verhalten ja nicht auftreten. Der Ringpuffer startet eben woanders als
der Pointer des Arrays anzeigt.
Es führt zu 1,65 Volt weil das der einzige Wert ist der vom DMA in den
Puffer geladen wird und in den DAC geschrieben.
@benwilliam: Ist egal.
@technikus: Leider nein.
>Deine Pointer-Theorie stimmt hier nicht, sonst würde das problematische>Verhalten ja nicht auftreten.>>@ Jonas:>>In der tat führt Buffersize=1 dazu, dass konstant 1,65 Volt am Ausgang>>stehen.
Mit Buffersize=1 hast du doch überprüft das es sich um kein
Pointer-Problem handelt, der richtige Wert wird von der richtigen
Adresse (Start des Arrays = Ringsbuffers) in den DAC geschrieben, sogar
wie gewollt 2 bytes in der richtigen Bytereihenfolge. Jetzt kann
eigentlich nur noch was an der Konfiguration des DMA's nicht passen. Und
da musst du ansetzen.
Gruß Jonas
Bei einem Wert im Puffer gibts ja auch nur einen möglich Startwert.
Ich konnte dem Problem immernoch nicht auf die Spur kommen.
Die Phasenverschiebung ändert sich mit unterschiedlichem Zeitpunkt der
Initialisierung. Wenn ich alles während der Programmausführung neu
initialisiere habe ich eine andere Phasenverschiebung.