Forum: Mikrocontroller und Digitale Elektronik STM32 ADC interrupt vs DMA


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von dell (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

Oder denke ich zu kompliziert?

von Olaf (Gast)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.