ADC in Continuous Conversion mit DMA

OP #6390055
Lesenswert?

Moin ich nutze das STM32f0 Board und möchte gerne meine ADC-Werte 
mittels DMA auslesen. Genauer gesagt, habe ich ein Poti und möchte damit 
die LED's am Board leuchten lassen, wenn mein ADC einen bestimmt Wert 
überschreitet.
Nur funktioniert das nicht so, wie ich es mir vorgestellt habe. Meine 
LED's leuchten schon auf, obwohl ich den Poti nicht aufgedreht habe bzw. 
es fliesst kein Signal in mein ADC. Hab aber schon ein ADC-Value von 
9300????

Ich sende mal mein Code mit und wäre für jede Hilfe dankbar. Ich weiß 
nicht wo der Fehler ist in meinem Code. Hab die Konfiguration wie es im 
Datenblatt angegeben wurde meiner Meinung nach abgearbeitet.

In meiner While-Schleife in der Zeile 53 Starte ich die ADC-Conversion. 
Ist das soweit richtig, oder muss hier DMA gestartet werden?
Angehängte Dateien:
Gast #6390068
Lesenswert?

Richard W. schrieb:
> Ich sende mal mein Code mit

Code als Bildchen? Na super, das ist wirklich die beste Möglichkeit
Information zu übermitteln.

Bei der Gelegenheit sei auch gleich auf die Regeln hingewiesen die
jeder Anfänger beim Posten glatt nicht wahrhaben will. Aber die
zur Höflichkeit gegenüber den Hilfestellenden dazugehört.
Angehängte Dateien:
Gast #6390133
Lesenswert?

DMA nutzt man um große Datenblöcke (z.B. von einem Laufwerk) direkt ins 
RAM zu übertragen. Regelmäßiges Einlesen weniger Bytes macht man per 
Timer-Interrupt (wie Peter D.) richtig geschrieben hat. Wenn die Daten 
in genau gleichen Zeitabständen eingelesen werden müssen (z.B. für 
Frequenzmessungen oder -analysen), muss ein nicht-maskierbarer Interrupt 
genutzt werden, damit der Interrupt sofort ohne Verzögerung durch andere 
gleichzeitig auftretende Interrupts bedient wird.
#6390218
Lesenswert?

Günni schrieb:
> Wenn die Daten
> in genau gleichen Zeitabständen eingelesen werden müssen (z.B. für
> Frequenzmessungen oder -analysen), muss ein nicht-maskierbarer Interrupt
> genutzt werden, damit der Interrupt sofort ohne Verzögerung durch andere
> gleichzeitig auftretende Interrupts bedient wird.

Nicht nötig, viele MCs können den ADC vom Timer direkt triggern. Beim 
AVR nennt sich das "ADC Auto Trigger".
Gast #6390282
Lesenswert?

Du solltest zuerst den DMA initialisieren und dann erst den ADC starten. 
Ausserdem fehlt m.e.a. die ADC Kalibrierung. Und die vielen Magic 
Numbers machen den Code auch nicht besser verstaendlich.
Beitrag #6390321 wurde von einem Moderator gelöscht.
(Firma: matzetronics) #6392087
Lesenswert?

Günni schrieb:
> Regelmäßiges Einlesen weniger Bytes macht man per
> Timer-Interrupt (wie Peter D.) richtig geschrieben hat.

Das Schöne am DMA Betrieb bei den STM32 ist das 'Fire and Forget' 
Verhalten. Du zeigst der DMA einmal den Bereich deiner ADC Resultate 
(ich nehme da eine struct), konfigurierst den ADC und lässt dann die 
ganze Nummer im Hintergrund laufen mit bis zu 8 Kanälen. Da brauchts 
keine ISR und das ganze läuft vollautomatisch - völlig ohne CPU 
Belastung. Dabei kannst du bei jedem Kanal die Samplingrate getrennt 
einstellen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren