Hallo Ich würde gerne den folgenden ADC mittels DMA einlesen: http://www.farnell.com/datasheets/1599664.pdf?_ga=2.257161288.295391380.1538634416-1096078185.1512028579 Die Frage die ich mir hierbei stelle ist, wie schnell kann ich mit dem STM32F105 mittels DMA den ADC einlesen? Ich stelle mir das etwa so vor: Timer -> CLK ADC |-> DMA Trigger DMA Source: PORTA DMA Target: Array, auto increment Nach z.B. 103 Messungen wird beendet. Dies deshalb, da der ADC ein Delay cvon zwei Clocks hat, bis ein gültiges Resultat anliegt. Welche Abstastrate ist in solch einem Aufbau realistisch? Ziel ist es, ein 500kHz Sinussignal Abzutasten und zu verarbeiten. Danke
:
Bearbeitet durch User
Hallo, hier liest ein F303 zwei LCT2326 über SPI und DMA aus. Aus den Datenblöcken wird die Summe der Quadrate und das Quadrat der Summer gebildet, um den RMS Wert zu errechnen. Datenrate eines LTC2326 ist 200 kHz bei 16 bit. Der F303 kennt SIMD Befehle, damit kann die Schleife jeweils zwei Werte pro Operation errechnen. Zur Zeitmessung schaltet ein GPIO, am Scope werden dafür wenige 100 us bei 5 MS Bloecken gebraucht. Um Ausreißer zu erfassen habe ich eine weitere Schleife die jeden Werte auf eine Minimal und Maximalwert überwacht. Auch dann ist die Schleife nur etwas über eine Millisekunde lang. Der F10x wird nicht viel langsamer sein.
Fausregel: Die maximale Leserate der DMA für den Cortex-M3 ist CPUTakt/14 Also wenn Du die CPU mit 72 MHz betreibst, dann kannst Du maximal ca. 5 MSamples über einen Port in den RAM einlesen, ohne Samples zu verlieren. Die Info findet man nicht bei STM. Das ergibt sich aus den Buszugriffszeiten, wenn DMA und Cortex gemeinsam auf Resourcen zugreifen, also bei ARM nachlesen.
Dein LTC1420 ist nen ADC mit paralelem Ausgang und ich sehe was von 10MHz CLk. Das kann schon zu viel sein. Bei meinem Projekt (Videowall LED Panels ansteuern) ist der STM32F407 auf 168MHz schon zu langsam. Mithilfe des DMA wollte ich mit 20MHz ein Array vom SRAM auf 16 Portpins ausgeben. Gab sofort FIFO Errors, bei 10MHz läufts, aber gibt Fehler wenn auch die CPU ins SRAM schreibt zum updaten. Der DMA kommt dann wohl nicht mehr shcnell genug über die Busmatrix in den RAM. Dabei hab ich schon den SRAM2 genutzt, damit der CPU Stack nicht "rumnervt". Also ich sagmal: 5MHz sollten gehen. Zudem gibs ne Appnote von ST dazu: https://www.st.com/resource/en/application_note/dm00169730.pdf @KI-Besitzer Wie siehts denn beim M4 oder M7 aus? Bei meinem Beispiel nutz ich 10MHz und es fliegt mir um die Ohren. Dabei sind ja 168MHz/14 = 12Mhz und ich blase mit 10MHz raus.
:
Bearbeitet durch User
Daten ausgeben ist ein anderes Problem. 1. Wer gibt bei dir den Takt zur Ausgabe der Daten vor? 2. Kann die CPU überhaupt ohne DMA den RAM so schnell umschaufeln. Da seh ich einen Flaschenhals in der Stärke eines Kapillarröhrchens. Man könnte da einige Tricks anwenden. z.B. Das werden vermutlich WORD-Arrays sein, da Du einen Port damit versorgst (ich hoffe doch alle Pins liegen auf dem selben Port ;) ), also könnte man den Memeory-Memory-Transfer mit DWORD machen, dann muss man nur halb soviele RAM-Zugriffe machen. Zusätzlich kann man mehere Transfers in der Schleife machen, das sorgt für weniger Schleifendurchgänge. Oder gleich eine zweite DMA einsetzen. Die Appnote kannte ich noch nicht. Danke für den Link.
Also ich will jetz eigentlich den Fred hier nicht kapern, aber: Den Takt zur Ausgabe gibt ein Timer vor, der auch per 50/50DC PWM den CLK für die LED Panel Schieberegister angibt. Pro Timerüberlauf wird dann der DMA getriggert zur Ausgabe auf die Portpins. Der Takttimer wird aktiviert durch einen weiteren Timer, der zählt quasi die Ausgegebenen Clocks. Sonst wäre nicht genau nach dem letzten CLK fürn Schieberegister Schluss, sondern wenn der DMA fertig IRQ kommt. Der IRQ würde zu spät kommen. Da es sich um einen Framebuffer handelt muss die CPU nichts live umschaufeln. Wenn keine neuen Daten da sind, dann werden eben die Alten ausgegeben. Das funktioniert ja auch! Nur sobald die CPU dann auch in den SRAM2 schreibt verschiebt sich die DMA Ausgabe um 1 bis 2 Takte oder bricht ganz ab. Es sind uint16_t Arrays um genau zu sein, die werden auf einen zusammenhängenden Port Ausgegeben. Der DMA kann ja auch uint32_t einlesen und draus 2x uint16_t zaubern. Aber irgendwie gabs nach der Aktivierung dieses Flags nurnoch Datensalat. Also das Bild auf den LED Üanels war nicht Endianessgedreht, sondern komplett undefiniert.
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.