-         

Ergebnis 1 bis 5 von 5

Thema: Umstieg ATXMEGA - STM32F4 DMA-SPI-Optimeirung zum Auslesen eines ADCs

  1. #1
    Erfahrener Benutzer Roboter-Spezialist Avatar von erik_wolfram
    Registriert seit
    02.12.2009
    Ort
    Berlin
    Beiträge
    405

    Umstieg ATXMEGA - STM32F4 DMA-SPI-Optimeirung zum Auslesen eines ADCs

    Anzeige

    Hallo,
    seid geraumer Zeit bin ich nun auf einen STM32 umgestiegen, nachdem ich einen ATXMEGA maximal ausgereizt habe.
    Mit dem ATXMEGA (32 MHz) habe ich zwei 16-Bit ADCs mit 200 kHz erfolgreich ausgelesen. Damit war ich an der absoluten Obergrenze.

    Nun möchte ich das gleiche (angepasste) Programm auf den STM übertragen. Timer, SPI und DMA bekomme ich zum laufen, aber durch die erhöhten Anforderungen (meinerseits) komme ich schon wieder an Grenzen.
    Nun möchte ich die gleichen zwei ADC's (Daisy-Chain) mit 400 kHz auslesen können!

    Zum Ablauf:
    Ein PWM-Signal erzeugt mit das Start-Signal CONVST für eine einzelne ADC-Wandlung. 1,4 µs später kann der ADC mittels SPI (4 Dummy-Bytes = 2 x 16 Bit) angesprochen werden und gibt seine Daten simultan aus. (Die MOSI-Leitung wird nicht verwendet - die Ausgabe dient lediglich dem Erzeugen des SCK-Taktes). Ein weiterer DMA-Kanal speichert mit die empfangenen Daten.

    Auf dem ATXMEGA konnte ich denvollständigen Ausleseprozess mittels DMA, Event-Manager und SPI ohne zusätzliche Rechenleitsung umsetzten.
    Leider fehlt mir bei der Umsetzung auf den STM32 das Event-System und ich Suche nach Alternativen.

    Mein bisheriger Ansatz für den STM:
    Ein Timer generiert mir einen 2,5 µs-Takt der per Interrupt den DMA auslöst. Dieser DMA "füttert" mir den SPI mit 4 Bytes mit voller Geschwindigkeit (keine Verzögerung zwischen den einzelnen Bytes). Nach der Beendigung der Übertragung Deaktiviert mir das DMA-Interrupt den entsprechenden DMA. Beim nächsten Takt des Timers wird der DMA wieder aktiviert und überträgt wieder 4 Bytes.
    Mit dem Auslesen des SPIs habe ich mich noch nicht näher beschäftigt, hier vermute ich aber keine Probleme.
    Leider hat diese Lösung aber ein Problem: das Interrupt des Timers hat eine Latenz von ca. 480 ns mit denen ich nicht leben kann (woher sie kommen ist mir klar).
    Nun möchte ich das umgehen. Ich habe versuch mit "Gewalt" das Enable-Flag mit einem weiteren DMA zu setzten um das Timer-Interrupt zu umgehen - leider zeigt das keine Wirkung! Gibt es auf dem STM etwas vergleichbares wie das Event-System von Atmel? Ich bin leider nicht fündig geworden...

    Ich möchte hier nicht explizit auf den Code eingehen sondern einen Ansatz finden. Daher poste ich hier auch nicht den bisherigen Code.
    Das Problem sollte (?!) auch ohne Code disskutierbar sein.

    Ich danke für die Hilfe!

    Gruß Erik
    Meine Projekte auf Youtube

  2. #2
    Erfahrener Benutzer Begeisterter Techniker Avatar von schorsch_76
    Registriert seit
    25.03.2012
    Ort
    Kurz vor Neuschwanstein
    Alter
    41
    Beiträge
    398
    Etwas offtopic, aber um ein Bild zu bekommen ...

    Ich kann dir sagen, dass aktuelle High Performance Rechner mit Echtzeitkernel eine Latenz von 10-80 µs haben [5]. Die beiden Videos auf Youtube lohnen sich


    [1] http://www.lug-erding.de/vortrag/Lin...infuehrung.pdf
    [2] https://www.linutronix.de/index.php?page=echtzeit
    [3] https://www.youtube.com/watch?v=n9ucTGWrON8 (Inside the RT Patch)
    [4] http://events.linuxfoundation.org/si...cyclictest.pdf
    [5] https://youtu.be/f_u4r6ehZKY?t=21m57s
    Geändert von schorsch_76 (08.08.2015 um 09:22 Uhr)

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554
    Zitat Zitat von schorsch_76 Beitrag anzeigen
    ... dass aktuelle High Performance Rechner mit Echtzeitkernel eine Latenz von 10-80 µs haben [5] ...
    Nu sind einerseits selbst 10 µs wirklich eine s..kurze Zeit - da fällt ein losgelassener Stein auf der Erdoberfläche grad mal 500 pm (Pikometer) das sind 0,5 nm (Nanometer). Allerdings machen meine popeligen Achtbitter mit den bei mir üblichen 20 MHz in dieser Zeit schon mal 200 Maschinenzyklen - genug Zeit, um nach dem Interrupt Daten und Adressen auf den Stack zu bringen und bereits in der ISR rumzuwerkeln - oder, bestenfalls - den RETI schon hinter sich zu haben.
    Ciao sagt der JoeamBerg

  4. #4
    Erfahrener Benutzer Begeisterter Techniker Avatar von schorsch_76
    Registriert seit
    25.03.2012
    Ort
    Kurz vor Neuschwanstein
    Alter
    41
    Beiträge
    398
    Na das Problem ist nicht das die CPU genug Zyklen macht, sondern häufig Cache Misses (instruction and data cache), Memory ist mittlerweile der Flaschenhals. Das Eventsystem des Atxmega, das dann die Dinge ohne Programmaufwand macht, läst das alles eben in Hardware.

    Die Frage ist um auf das Hauptthema zurück zu kommen, kann man das Sampeln jenseits der 400 kHz auf einem FPGA machen und die Daten per DMA in den Speicher schreiben wo sie dann ein Prozessor abholt?

  5. #5
    Erfahrener Benutzer Roboter-Spezialist Avatar von erik_wolfram
    Registriert seit
    02.12.2009
    Ort
    Berlin
    Beiträge
    405
    Hallo,
    ich denke /hoffe, dass ich die Aufgabe mit dem STM32 bewältigen kann. Einen FPGA oder andere zusätzliche externe Hardware möchte ich umgehen. Lieber schraube ich da an der Abtastrate.

    Momentan gucke ich mir die Latenzen für das Interrupt an und merke, dass da noch Potential durch die Fehler (und meine Unwissenheit) vorhanden ist. Viel lieber möchte ich die Interrupts für das wesentliche umgehen!
    Für den ATXMEGA habe ich eine weile gebraucht um mir eine Strategie auszudenken, um alles über die Harware (DMA, Event-System) zu lösen. Ich hoffe der geistige Blitz für den STM kommt mir auch noch.
    Ich habe mittlerweile schon vergebens versucht mit eim DMA das Enable-Flag eines anderen DMAs zu setzen. Leider hat sich da nichts getan...
    Meine Projekte auf Youtube

Ähnliche Themen

  1. LCD Libary für STM32F4
    Von Stones im Forum Software, Algorithmen und KI
    Antworten: 3
    Letzter Beitrag: 13.07.2012, 13:55
  2. M32: ADCs als I/Os verwenden
    Von RobotMichi im Forum Robby RP6
    Antworten: 8
    Letzter Beitrag: 29.05.2010, 13:07
  3. neue I/Os und ADCs
    Von blenderkid im Forum Robby RP6
    Antworten: 8
    Letzter Beitrag: 19.12.2007, 13:12
  4. Auslesen eines Sensor
    Von BlackBroom im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 28.04.2007, 10:56
  5. Programm eines Eproms auslesen
    Von cdschredder im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 15.10.2005, 00:22

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •