Forum: Mikrocontroller und Digitale Elektronik ADC in Continuous Conversion mit DMA


von Richard W. (richard00)


Angehängte Dateien:

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?

: Bearbeitet durch User
von Blindseher (Gast)


Lesenswert?

Richard W. schrieb:
> Moin ich nutze das STM32f0 Board

Na gut dass es nur eines gibt, dann wissen wir ja alle Bescheid.

von Blindseher (Gast)


Angehängte Dateien:

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.

von Peter D. (peda)


Lesenswert?

Wenn das Poti so schnell dreht, daß DMA nötig ist, würde ich mir eher 
Sorgen machen, daß mir die Fliehkräfte das Poti zerreißen und die Lager 
verglühen.

Ein Timerinterrupt alle 10-100ms sollte dicke reichen, um das Poti ganz 
nebenbei abzufragen.

von Richard W. (richard00)


Lesenswert?

Blindseher schrieb:
> Richard W. schrieb:
>> Moin ich nutze das STM32f0 Board
>
> Na gut dass es nur eines gibt, dann wissen wir ja alle Bescheid.

Es ist ein STM32f091

von Günni (Gast)


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.

von Peter D. (peda)


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".

von Uwe Bonnes (Gast)


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.
von Peter D. (peda)


Lesenswert?

Heiner schrieb im Beitrag #6390321:
> lg. Heiner

Ich freue mich immer wieder, wenn ich helfen kann, z.B. hier:
Rene Meier schrieb:
> @ Peter D. Danke!

Deine nicht zum Thema passenden Beiträge werden Dir diese Freude jedoch 
nie bereiten. Es ist nur schade um die Zeit, die man mit dem Lesen 
vergeudet hat.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Matthias S. schrieb:
> völlig ohne CPU
> Belastung.

Nö.
DMA schmeißt die Daten nur in dem RAM, das Auswerten muß trotzdem die 
CPU machen. Wenn es um das schnarchlahme Einlesen eines Potis geht, 
kannst Du also ganz profan den Wert direkt aus dem ADC-Register lesen.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Ich habe schon im anderen Thread betont, das der Einsatz der DMA vor 
allem für viele Kanäle sinnvoll ist.
Die Bitschubserei des TE würde ich mir aber sicher nicht antun.

von Ben S. (bensch123)


Lesenswert?

Nutze bitte keine Magic Numbers. In den eingefügten Headern sind 
Präprozessor Ausdrücke enthalten, nutze diese.

Matthias S. schrieb:
> Die Bitschubserei des TE würde ich mir aber sicher nicht antun.

Mit sprechenden Bezeichnern schon. Ich würde mir HAL nicht antun.

: Bearbeitet durch User
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.