STM32f0 - ADC und DMA Verständnissfrage

Gast #2904122
Lesenswert?
• ▲
▼
Hallo,

ich habe eine Frage zum ADC in Verbindung mit dem DMA (es geht nicht um 
die Implementierung).

Ich Scanne mit dem ADC im continuous mode 4 Kanäle und lasse die Werte 
vom DMA in ein Array schreiben.
Es soll ein Interrupt ausgelöst werden, wenn der DMA alle Werte 
geschrieben hat.

Z.B. 4 Kanäle, je 4 Werte --> DMA schreibt 16 Werte in ein Array und 
löst dann einen Interrupt (Trandfer complete) aus.

In dieser ISR möchte ich die Mittelwerte berechnen.

Jetzt zu meinen Fragen:
- Während der ISR wandelt der ADC doch weiter, was macht der DMA?
- Überschreibt er die gespeicherten Werte im Array mit neuen Werten?
- Müsste ich den ADC während der ISR stoppen um das zu vermeiden?
- Ist es so möglich dass ich keinen gescannten Wert verliere?

Danke im voraus
Gast #2904140
Lesenswert?
• ▲
▼
Steel schrieb:
> in einer ISR verarbeitet man keine Daten.Den DMA kann man so einstellen dass er 
einmal fertig nichts mehr macht und du kannst ihn dann in der ISR neu aufsetzen.

mit der Datenverarbeitung in der ISR ist auch nur ein Beispiel um den 
Fall einfach zu halten.

Wenn der DMA stoppt nachdem er alle Werte geschrieben hat, kann ich ihn 
in der ISR wieder anstoßen, ok. Aber der ADC macht ja weiter und ich 
würde somit Werte verlieren. Was ist mit meiner Reihenfolge mit der die 
Werte in das Array geschrieben werden? Wenn ich den DMA wieder starte 
und der ADC gerade an einem Kanal ist der vorher im Element [2] 
gespeichert war, wird er jetzt im Element [0] gespeichert. Würde die 
Reihenfolge somit verloren gehen?
Gast #2933257
Lesenswert?
• ▲
▼
erstmal danke sehr :)

Bevor ich jetzt meinen Ansatz schreibe, noch eine Frage zum zyklisch 
laufen lassen.

Es sind 6 Kanäle, von denen ich jeweils 16 Werte in einen Puffer[96] 
schreiben lasse.

Irgendwann muss ich ja die Werte verarbeiten, um es einfach zu halten in 
der ISR. Jetzt muss ich also nur dafür sorgen, dass ich alle Werte 
verarbeitet habe, bevor der ADC den nächsten Wert liefert. Denn dann 
würde
der DMA den ersten Wert im Puffer überschreiben. Ist das also das 
einzige was beim zyklischen laufen lassen zu berücksichtigen ist? 
(Solange der DMA nicht langsamer läuft wie der ADC)

Ich habe jetzt folgenden Ansatz gewählt:
Ich lasse den ADC eine Sequenz wandeln (6 Kanäle nur 1x). In der ISR 
(EOSEQ)
zähle ich einen Zähler hoch und starte den ADC erneut. Erreicht der 
Zähler
den Wert 16 (dann habe ich den Puffer gefüllt 16*6=96) starte ich den 
ADC NICHT wieder.
Das geschieht erst in der DMA-ISR (transfer complete). Dort verarbeite 
ich meine Werte und starte den ADC anschließend.

Somit verliere ich keine Werte, allerdings glaube ich nicht dass dies 
der Optimale Ansatz ist (scheint mir etwas zu aufwendig).

Wenn ich mit einen 2. Puffer arbeiten würde, müsste ich in der DMA-ISR 
nur die Ziel Adresse ändern und hätte dann genug Zeit die Werte zu 
verarbeiten. Allerdings benötige ich dann den doppelten Speicher und ich 
muss sicher sein, dass der nächste ADC-Wert dann auch im 2. Puffer 
landet, also die Änderung der Adresse unmittelbar durchführen.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.