mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32F103 ADCs mit externem Trigger langsamer?


Autor: Stimmy (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

beim Entwickeln eines kleinen Speicheroszilloskops auf STM32F103-Basis 
bin ich auf ein Problem gestoßen, für welches ich in dem STM32F1 
Reference Manual keine Lösung gefunden habe.

Zur Erklärung: Ich möchte beide ADCs abwechselnd einen Eingang abtasten 
lassen. Für eine frei konfigurierbare Samplingrate (nützlich, wenn man 
eine FFT drüber laufen lassen möchte) sollen die ADCs über einen Timer 
getriggert werden.

Hierfür kommt nur der "Independent Mode" in Frage, wo man beide ADCs zu 
beliebigen Zeitpunkten triggern kann. Trigger-Quellen sind Channel 1 und 
2 von Timer 1.
Die Daten beider ADCs werden per DMA in einen Puffer geschoben, wenn der 
Puffer voll ist löst der DMA-Channel einen Interrupt aus und die Daten 
könnten weiterverarbeitet werden. So weit so gut.

Nun zum eigentlichen Problem:
Der ADC-Taktteiler ist auf 6 gestellt, und lt. Datenblatt kann der ADC 
alle 14 Taktzyklen eine Wandlung durchführen.
Somit sollte für maximale Abtastrate jeder ADC alle 14*6 = 84 CPU-Takte 
getriggert werden dürfen.

Das hat aber in dem DSO-Code nicht funktioniert; in dem angefügten, auf 
ein Minimum reduzierten Test-Code geht es auch nicht. Zwischen den 
Triggern müssen mindestens 93 statt 84 CPU-Zyklen liegen.

Der Test-Code macht nichts anderes, als den ADC wie beschrieben von 
Timer1 triggern zu lassen. Timer2 zählt mit, wie oft Timer1 überläuft 
(also die ADCs triggert) bis der DMA-Puffer voll ist. Das Ergebnis wird 
dann über den UART ausgegeben. Richtigerweise muss da 4096 rauskommen.

Wenn ich aber die ADCs öfter als alle 93 (aber nicht öfter als alle 84) 
CPU-Zyklen triggere, löst nicht jeder Trigger auch einen DMA-Request 
aus. Damit braucht es dann 6144, 8192 oder auch eine völlig krumme Zahl 
von ADC-Triggern, bis der Puffer voll ist.

Und das liegt definitiv am ADC: Stelle ich den Taktteiler auf 4 statt 6, 
so dass eine Wandlung nur noch 56 CPU-Zyklen dauert, kann er problemlos 
alle 84 Zyklen eine Wandlung durchführen. Versuche ich mit Taktteiler 4, 
ihn alle 60 Zyklen zu triggern gibt es aber wieder die beschreibenen 
Probleme.

Und im "Continous conversion mode", wo der ADC sich nach Abschluss einer 
Wandlung selbst neu triggert, liefert er ebenfalls die im Datenblatt 
beschriebene Sampling-Rate.

Es wirkt auf mich so, als bräuchte der ADC bei externer Triggerung 
zusätzliche Taktzyklen; im Datenblatt steht dazu aber nix. Vermutlich 
habe ich noch irgendwas falsch konfiguriert, ich finde es aber nicht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.