Forum: Mikrocontroller und Digitale Elektronik STM32F1x Externer ADC mit DMA Einlesen


von Holger K. (holgerkraehe)


Lesenswert?

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
von Uwe Bonnes (Gast)


Lesenswert?

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.

von KI-Besitzer (Gast)


Lesenswert?

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.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

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
von KI-Besitzer (Gast)


Lesenswert?

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.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

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
Noch kein Account? Hier anmelden.