Forum: Mikrocontroller und Digitale Elektronik STM32f0 - ADC und DMA Verständnissfrage


von Stm32f0_ (Gast)


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

von Steel (Gast)


Lesenswert?

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.

von Stm32f0_ (Gast)


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?

von Stm32f0_ (Gast)


Lesenswert?

jemand anders vielleicht :)?

von Chris D. (myfairtux) (Moderator) Benutzerseite


Lesenswert?

Du kannst die DMA auch zyklisch im Ringpuffer laufen lassen. Damit 
würdest Du keine Werte verlieren. Musst die DMA nur exakt so schnell 
laufen lassen wie den ADC.

Aber natürlich musst Du trotzdem dafür sorgen, dass Du die Werte 
schneller verarbeitest als der ADC liefert (klar) :-)

Chris D.

von Stm32f0_ (Gast)


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.

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.