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


von Stimmy (Gast)


Angehängte Dateien:

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.

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.