STM32F103 ADCs mit externem Trigger langsamer?

Gast #5024184
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.
Angehängte Dateien:

Antwort schreiben

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.

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.