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