Forum: Mikrocontroller und Digitale Elektronik STM32F446 ADC schnellste Variante


von Simon R. (iporuss)


Lesenswert?

Hallo,

ich habe einen STM32F446RC. Im Rahmen meiner Anwendung möchte die 
Spannungswerte von 6 Sensoren mit Hilfe der ADCs wandeln.

Hierbei sollte die Wandlung möglichst schnell und genau erfolgen [was 
auch sonst ;)].

Der STM32F446 verfügt über 3 ADCs.

Ich würde behaupten die schnellste Möglichkeit ist alle 3 ADCs im 
ScanMode und DMA zu betreiben. Sehe ich das richtig?

Kann mir einer der erfahrener Programmierer helfen, wie ich die 
Performance meines µC optimiere. Auf welche Punkte sind zu achten?

von Jan H. (jan_h565)


Lesenswert?

Laut spec shaft der 467  :   12-bit ADCs reaching 2.4 MSPS or 7.2 MSPS 
in interleaved mode. Jetzt is die wichtige Frage : wass wollst du machen 
mit diese Datenmenge ? Rausspucken ueber USB / USART ? Mittelwerte 
bilden ? Meistens ist die Verarbeitung das Problem bei diesen hohe MSPS. 
Bei 184 MHZ hast du gerade 25,5 cycli für jedes Sample zu verarbeiten ! 
Meistens ist es nicht sinnfoll ein Sensor auszulesen mit 1.2 MSPS 
(7.4/6). Der Bandbreite von den Sensor ist selten zo gross. So, 
beschreibe erst ihre Problem etwas genauer, moglich bekommst du dan auch 
bessere Antworten.

von Simon R. (iporuss)


Lesenswert?

Wie bereits erwähnt sollen die Spannungswerte von 6 Sensoren gewandelt 
werden. Die Digitalwerte werden mittels eines Algorithmus (Laufzeit ca. 
10ms) in eine Positionskoordinate umgerechnet.
Nachfolgend wird diese Positionskoordinate mittels USART über eine 
RS232-Schnittstelle an einen Computer übertragen.

Heißt lieber eine einfache ADC-Wandlung, da diese sich nicht sonderlich 
auf die Latenzzeit auswirkt?

von Nico W. (nico_w)


Lesenswert?

Eine einfache ADC-Wandlung ist bei den STM nicht so schön umzusetzen. 
Viele andere µC haben für jeden ADC ein eigenes Register und man kann 
dort mittels Freerun die Werte einfach auslesen, wenn man sie braucht 
und der µC startet automatisch eine neue Konvertierung.

Ich würde definitiv auf DMA setzen. So wie ich es rauslese bei dir, 
möchtest du einfach schnell mit dem eigentlichen Programm fortfahren.

Bei mir lese ich pro ADC-Kanal X Werte aus über DMA. Sobald das fertig 
ist stoppe ich den ADC, sodass ich alle 10ms oder so, müsste ich jetzt 
nochmal genauer gucken, alle ADCs ausgelesen habe (das eigentliche 
Auslesen geht natürlich schneller). Sobald das durch ist, schmeiße ich 
meinen Filter drüber und spucke die Werte aus. Nach 10ms starte ich den 
ADC wieder und bekomme kurze Zeit später wieder meine Werte. Über nen 
DualDMA komme ich auch nicht in Schwierigkeiten sollte der neue ADC 
etwas früher starten.

von Thomas F. (igel)


Lesenswert?

Simon R. schrieb:
> Die Digitalwerte werden mittels eines Algorithmus (Laufzeit ca.
> 10ms) in eine Positionskoordinate umgerechnet.

Na dann reichen doch eigentlich 100 Samples/s pro Kanal und keine 
MegaSamples da du sowieso nicht mehr umgerechnet bekommst.

> Nachfolgend wird diese Positionskoordinate mittels USART über eine
> RS232-Schnittstelle an einen Computer übertragen.

Und wieviel Nutzdaten pro Sekunde und Kanal bekommst du so übertragen? 
Das wäre ein weiteres Auslegungskriterium für das ganze Vorhaben.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Nico W. schrieb:
> Ich würde definitiv auf DMA setzen.

Man hat m.W. gar keine andere Wahl. Jeder ADC hat nur ein Ergebnis 
Register, und es wird nicht zwischen den einzelnen ADC Mux Kanälen 
unterschieden. Der  DMA muss also zumindest 2 Kanäle pro ADC auf 2 
Speicherstellen verteilen.
Wenns auf Geschwindigkeit ankommt, also alle 3 ADC mit je zwei Kanälen 
im Interleaved Mode und DMA.

von Nico W. (nico_w)


Lesenswert?

Matthias S. schrieb:
> Man hat m.W. gar keine andere Wahl.

Man hat schon eine Wahl. Man kann auch die Konvertierung starten und 
kurze Zeit später gucken, ob der Kanal schon fertig ist. Den dann 
auslesen und zum nächsten Wechseln. Ob man das so wirklich will, ist 
eine andere Frage :)

Mein STM32F411RE hat sogar nur einen ADC. Aber mittels DMA geht das 
Prima. Man sollte aber auch den Hardwaredebugger nutzen. Ich habe es 
ganz am Anfang ohne versucht und mich immer gewundert warum es nicht 
funktioniert. Nach ein paar Wochen rumprobierens habe ich mich dann 
einmal genauer damit befasst. Ne Stunde später lief es. \o/

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.