Forum: Mikrocontroller und Digitale Elektronik STM32 Cortex Problem mit AD-Wandler


von Klaus (Gast)


Lesenswert?

Hallo zusammen,

ich mache mit dem Keil Evaluations-Board mit dem STM32F103 gerade meine 
ersten Gehversuche.
Bisher klappt es eigentlich einigermaßen, allerdings habe ich noch ein 
Problem, wo ich keine Lösung finde.

Ich möchte den AD-Wandler so konfigurieren, dass er alle 16 Kanäle immer 
im 100ms Raster einliest.
Den Wandler habe ich dazu im Scan-Modus so konfiguriert, dass er alle 
Kanäle nacheinander wandelt. Das funktioniert. Nun möchte ich halt, dass 
er genau alle 100ms wandelt. Hierfür habe ich den TIM1 konfiguriert, 
dass er alle 100ms einen CC1 Interrupt auslöst. Das mit dem Interrupt 
alle 100ms klappt auch, wenn ich also in der CC1 ISR den Wandler von 
Hand starte, funktioniert es so wie gewünscht, aber laut Datenblatt 
sollte der Timer den Wandler auch direkt starten können.
Beim ADC habe ich daher das EXTTRIG bit gesetzt und EXTSEL auf 0 
(TIM1_CC1 event) gesetzt. Allerdings wird so der Wandler nicht 
gestartet.
Ich denke, ich habe noch eine Kleinigkeit vergessen, finde aber beim 
besten Willen nicht, was mir da noch fehlt.
Unabhängig funktioniert ja beides. Gibt es vielleicht noch einen 
Unterschied zwischen CC1 Interrupt und CC1 Event?

Vielleicht hat ja schon jemand Erfahrung mit den STM32-Mikrocontrollern.

Ansonsten macht es echt Spaß damit, die sind schon recht vielseitig.

Gruß
Klaus

von wolfhunters (Gast)


Lesenswert?

Hallo Klaus,

eine Antwort auf deine Frage habe ich leider nicht, aber ich habe auch 
einen STM32 Controller und versuche gerade den AD in Gang zu bringen. 
Vielleicht kannst du mir einen Tipp geben. Ich will mit Hilfe des ADC 
auf einem Kanal ein Signal (Audio) samplen. Nur leider habe ich momentan 
das Problem das nach dem STart des ADCs die ISR angesprungen wird und da 
dann nicht mehr rauskommt. Wie hast du deine Clocks und Samplerates 
eingestellt. Muss ich da noch etwas besonderes beachten? Vielleicht hast 
du ja nen Tipp für mich, wäre schön.

Gruß
Daniel

von Markus (Gast)


Lesenswert?

@wolfhunters: Eintipp: Wenn Du automatisch sampelst und nach jedem 
Sample einen Interrupt machst, dann macht der halt nur noch den 
Interrupt und sonst nichts mehr.
Besser: 100 mal samepeln und via DMA in das RAM kopieren lassen, zum 
Schluss einen im DMA Complete Interrupt diese 100 Sampels berechnen ...
... Demos gibts bei STM FW-LIB.

von Daniel W. (wolfhunters)


Lesenswert?

Ok, das klingt plausibel, aber ich habe folgendes Problem.
Ich möchte Daten über einen Kanal samplen. Anschließend packe ich die 
Daten in einen Ringbuffer um sie dann Blockweise (512Byte) auf eine 
SD-Karte zu schreiben. Das Problem was ich habe ist, das in der Zeit wo 
die Daten auf die SD geschrieben werden sollen, das Samplen weiter gehen 
soll ohne Unterbrechung, so dass ein kontinuierlicher Datenfluss da ist. 
Aber wie realisiere ich das?

von Markus (Gast)


Lesenswert?

Ganz einfach:
Sampel mit DMA in den RAM >>> Interrupt DMA Transfer fertig >> DMA in 
einen anderen RAM Bereich (2. Buffer) parametrieren >>> Sichern des 
ersten Buffers in die SD-Card ....
Wenn zwei Buffer nicht reichen, dann halt mehr verwenden.

Wichtig: Das Speichern in die SD-Card muss natürlich schneller gehen als 
das Sampeln eines Buffers, ansonsten wird es nie funktionieren.

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.