STM32 ADC Aktionen während der ADC Konvertierung

Gast #2562696
Hallo,
wenn ich mit dem STM32F10x einen ADC-Wert konvertieren möchte muss ich 
doch warten bis die Konvertierung abgeschlossen ist:

while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);

kann man in dieser Zeit eigentlich andere Aktionen ausführen. Sprich 
entweder garkein While nutzen und nach einer Zeit die einem angemessen 
erscheint einfach mit dem ADC Wert arbeiten oder es in der Form 
schreiben:

while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET)
{
    Aktion A
    Aktion B
    ......
    ......
}

Oder sollte man den Controller während dieser Zeit in "Ruhe" lasssen? 
Ich frage weil mich die Wartezeit von ca. 8 µs stört.
Gast #2562729
Sorry, wieso jetzt interrupts? Ist die ADC Konvertierung als 
Interruptaufruf zu verstehen oder gehst du davon aus dass ich meine 
Konvertierung in der ISR aufrufe? Ich hatte das mehr als eine Polling 
Abfrage verstanden die eine Art Bearbeitungszeit nach der Anfrage 
braucht und genauso hatte ich das auch aufgebaut. Ich weiß halt nicht ob 
die Konvertierung Parallel zum Programm verläuft oder ob der normale 
Ablauf unterbrochen werden muss. Ich würde sagen man muss nichts 
unterbrechen, sonst wäre die extra While Abfrage wohl nicht nötig. Bin 
mir aber nicht sicher.

[c]

ADC_SoftwareStartConvCmd(ADC1, ENABLE); //Start ADC Konvertierung
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
//Warte bis Konvertierung abgeschlossen

[c/]

Oder möchtest du mir damit jetzt sagen dass es im RM0008 im Kapitel 
Interrupts Hinweise darauf gibt?
Gast #2562732
Sorry, wieso jetzt interrupts? Ist die ADC Konvertierung als
Interruptaufruf zu verstehen oder gehst du davon aus dass ich meine
Konvertierung in der ISR aufrufe? Ich hatte das mehr als eine Polling
Abfrage verstanden die eine Art Bearbeitungszeit nach der Anfrage
braucht und genauso hatte ich das auch aufgebaut. Ich weiß halt nicht ob
die Konvertierung Parallel zum Programm verläuft oder ob der normale
Ablauf unterbrochen werden muss. Ich würde sagen man muss nichts
unterbrechen, sonst wäre die extra While Abfrage wohl nicht nötig. Bin
mir aber nicht sicher.
1
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //Start ADC Konvertierung
2
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); //Warte bis Konvertierung abgeschlossen

Oder möchtest du mir damit jetzt sagen dass es im RM0008 im Kapitel
Interrupts Hinweise darauf gibt?
#2562739
Wenn du Start und Abfrage vertauschst in der Reihenfolge kannst du auch 
was anderes tun. Du must halt immer nur vorrausschauend den ADC vorher 
starten wenn es geht.

while(1) // Grosse schleife
{
   if (ADC_fertig())
   {
      GetADCValue();
      // tu was damit
      StartADC();   // naechste Wandlung starten
   }

   // ansonsten alles andere tun
}
Gast #2562754
Normalerweise würde man einen ADC so konfigurieren, das er automatisch 
regelmäßig AD-Wandlungen macht und wenn er fertig ist, dann einen 
Interrupt auslöst.

In der Interruptroutine würde man das Ergebnis abholen, eventuell noch 
filtern, Mittelwerte bilden und ein Flag setzen, das dem Hauptprogramm 
mitteilt, das ein neuer ADC-Wert zur Verfügung steht.

Eventuell kann man auch per DMA automatisch die Werte ins RAM kopieren 
lassen und der DMA löst dann den Interrupt aus.
Gast #2562791
Super, danke.
Ich habe das so gewählt, weil ich die Messungen zu ganz bestimmten 
Zeitpunkten benötige. Die Genauigkeit ist dabei nicht so wichtig, da ich 
mit dem ADC nur Flankenmessungen kontrolliere und mir dann die Tendenz 
reicht. Mittelwertbildungen könnte ich mir wenn dann wohl nur mit dem 
.... wie hieß das noch gleich..... Oversampling... erreichen, da die 
Messzeit die mir bleibt bei ca. 20 µs liegt.

Mit dem Wissen nebenher noch etwas tun zu können kann ich jetzt aber 
schonmal andere Aktionen dazwischen Quetschen ;-)
#2562799
Marcus schrieb:
> Ich habe das so gewählt, weil ich die Messungen zu ganz bestimmten
> Zeitpunkten benötige.

In dem Fall wuerde ich den ADC vom Timer starten lassen und bei 
"Wandlung fertig" einen Interrupt generieren lassen (oder DMA triggern).
Damit hast du den geringsten Overhead in deinem Programm.
Gast #2562816
Die Zeitpunkte werden von externen Flanken vorgegeben Es handelt sich 
dabei um Protokolle mit 3 Stufigen Pegeln. Allerdings verwende ich keine 
Interrupts, da der Rest des Programms ohnehin schnell genug sein muss um 
die Pegel sofort auszuwerten und weiter zu verarbeiten. Die Zeitwerte 
werden via DMA aufgenommen. Würde ein Teil des Programms zu langsam 
laufen käme alles in Verzug. Daher verzichte ich auf weitere Interrupts. 
Die Neue Zeitlücke bei der Konvertierung nutze ich nun unter anderem um 
meine DMA Reloads durchzuführen.
Gast #2562879
ja, ich möchte aber einen Kleinen Verzug haben um eventuelles Prellen 
oder Fehlimpulse auszuschließen. Obwohl mir fällt gerade ein dass es 
einen Filter für die ADCs gibt der das ganze auch Verzögern sollte. 
Eigentlich eine gute Idee...
Ich glaube das versuche ich nachher auch mal.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.