STM32 ADC interrupt vs DMA

Gast #6572699
Lesenswert?

Guten Abend,
ich muss 7 Adc Kanäle auf einem Stm32 lesen.
Bis heute habe ich dazu immer den DMA genommen.
Nun ist es aber so das ich jeden der Kanäle mitteln muss.
Da macht meiner Meinung der DMA keinen Sinn. Oder sehe ich das falsch?
wenn ich nach jeder Wandlung einen Interrupt bekomme und da die 
Ergebnisse auf summiere und nach erreichen der gewünschten Menge 
dividiere scheint mir das besser. Oder sehe ich das falsch?
Was mir auf der schnelle nicht ganz klar ist bekomme ich einen Interrupt 
nach jeder einzelnen Messung des Kanals oder nach der Wandlung aller 
aktiven Kanäle?

Danke für die Licht ins Dunkel bringung.
#6572810
Lesenswert?

Kommt auf den Anwendungsfall an. Bei sehr hoher Datenrate ist die 
Rechenauslastung durch die Interrupts eventuell recht groß. In dem Fall 
kann der DMA deutlich besser sein.
Da du den Typ des STM32 nicht erwähnt hast möchte ich noch anmerken, 
dass z.B. die STM32G0 das Aufsummieren und Dividieren in Hardware 
können. Die Software muss sich dann nur noch mit dem Ergebnis 
beschäftigen.
Gast #6572816
Lesenswert?

Thomas W. schrieb:
> Da du den Typ des STM32 nicht erwähnt hast

Entschuldige es handelt sich um einen STM32F3 genauer Typ weiß ich grad 
nicht.

Uwe Bonnes schrieb:
> Die Werte der verschiedenen Kanaele
> stehen hintereinander im DMA Speicher und du musst halt die richtigen
> Werte aufaddieren.

Hatte bis jetzt das Array für die Daten so groß wie die Anzahl der 
Kanäle war an den DMA übergeben.
Das heißt wenn ich für die 7 ADC Kanäle ein Array von 700 anlege dann 
habe ich hundert Messungen pro Kanal im Array?
Oder habe ich das falsch verstanden?
Danke
für die Hilfe.
Gast #6572897
Lesenswert?

> Hmm kann ich ein mehr dimensionales Array dem DMA übergeben um
> die Summe einfacher auszurechnen?

C ist die Sprache fuer MaennerInnen. Also kannst du einem beliebigen 
Struct ueber Zeiger auf deine Daten abbilden wenn du magst.

Olaf
Gast #6572921
Lesenswert?

Torsten S. schrieb:
> Bin zwar nicht Olaf - aber er meint das man mit einem einzigen Zeiger
> (32Bit beim STM32 wer hätte das gedacht) beliebig große Daten übergeben
> kann.

Ich habe nur Schwierigkeiten wie ich für die 7 Kanäle am einfachsten zb 
127 werte addieren kann. Liegen ja hintereinander im Speicher.
ich muss ja immer jeden 7 Wert addieren.
Stehe da auf dem Schlauch.
#6572947
Lesenswert?

dell schrieb:
> STM32F3

Der G könnte soweit ich weiß direkt in Hardware Mittelwerte bilden.

dell schrieb:
> Ich habe nur Schwierigkeiten wie ich für die 7 Kanäle am einfachsten zb
> 127 werte addieren kann.

Du kannst doch einfach 7 getrennte DMA Kanäle nehmen mit 7 getrennten 
Speicherbereichen. Dann schaufelt jeder DMA die Daten seines ADC in 
seinen Speicherbereich.
Am Schluss gibt es einen ISR des letzten DMA full. Darin klemmst du die 
Speicherbereiche der DMAs auf neue Speicher um und startest sie wieder.
Jetzt hast du in der CPU Zeit alle 7 Mittelwerte zu berechnen.

Einzelne ADC Interrupts würde ich nicht nehmen. Bei 7 ADC kann da 
einiges an Overhead zusammenkommen.
Gast #6572949
Lesenswert?

> Wie meinst du das?

Du kannst dir einen gepackten Datentype erzeugen der halt den
Aufbau deiner Daten wiedergibt und dann einen Zeiger davon
auf deine DMA-Daten zeigen lassen.

Oder umgekehrt, du erzeugst einen Datentype wie du ihn gerne
haettest und uebergibt deinem DMA einen Zeiger darauf.

Eventuell etwas das Alignement im Auge behalten.

Olaf

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren