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
Richard W. schrieb: > Moin ich nutze das STM32f0 Board Na gut dass es nur eines gibt, dann wissen wir ja alle Bescheid.
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.
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.
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
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.
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".
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.
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.
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.