Forum: Mikrocontroller und Digitale Elektronik STM32 ADC interrupt vs DMA


von dell (Gast)


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.

von Uwe Bonnes (Gast)


Lesenswert?

Warum soll DMA keinen Sinn machen. Die Werte der verschiedenen Kanaele 
stehen hintereinander im DMA speicher und du musst halt die richtigen 
Werte aufaddieren.

von Thomas W. (ratos)


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.

von dell (Gast)


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.

von dell (Gast)


Lesenswert?

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

Oder denke ich zu kompliziert?

von Olaf (Gast)


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

von dell (Gast)


Lesenswert?

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

Wie meinst du das?

von Torsten S. (tse)


Lesenswert?

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.

von dell (Gast)


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.

von N. M. (mani)


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.

von Olaf (Gast)


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

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.