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.
Warum soll DMA keinen Sinn machen. Die Werte der verschiedenen Kanaele stehen hintereinander im DMA speicher und du musst halt die richtigen Werte aufaddieren.
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.
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.
Hmm kann ich ein mehr dimensionales Array dem DMA übergeben um die Summe einfacher auszurechnen? Oder denke ich zu kompliziert?
> 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
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?
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.
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.
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.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.