Hallo zusammen, ein ESP32-S3 soll via SPI das das Datenregister eines AS5047 (Hall-Sensor) auslesen. Grundsätzlich ist das Vorgehen einfach: Im Full-Duplex sendet man ständig den entsprechenden Auslesebefehl als 16bit-Wort raus und erhält - beim Senden des nächsten Auslesebefehls - den aktuellen Messwert zurück. Alle Bibliotheken, die ich da gefunden habe, machen dieses Auslesen CPU-gesteuert. Gerade wenn ich das in hoher Geschwindigkeit und ohne zeitlichen Jitter brauche, ist das problematisch. Ich frage mich deshalb, ob man mit Hilfe der im ESP32-S3 verfügbaren Hardware-Ressourcen (GDMA+SPI) eine - unendliche zyklische - komplett hardware-basierte - jitter-freie - SPI-Master-Kommunikation aufbauen kann, die ständig den Auslesebefehl sendet und das Datenwort empfängt und passend im Speicher ablegt. Bevor ich mich da selbst ransetze und versuche, die Bedeutungen der Register im ESP-S3 zu ergründen: - Hat einer von Euch dieses vermutlich häufig vorkommende Problem bereits gelöst? - Oder kann mir jemand einen guten Ansatz geben? - Oder kann mir jemand sagen, dass dieses Vorhaben mit dem ESP32-S3 nicht funktionieren wird? Vielen Dank für die Unterstützung! Grüße, Klaus
Klaus L. schrieb: > Gerade wenn ich das in hoher > Geschwindigkeit und ohne zeitlichen Jitter brauche, ist das > problematisch. Wie ist der "Jitter" eines Timer-Interrupts? Hast Du das mal untersucht? Wie oft soll der Lesevorgang stattfinden? "Hohe Geschwindigkeit" ist eine sehr relative Aussage.
Nein, ich habe das nicht untersucht, aber im Falle der Espressif32-Architektur erscheint es mir "common sense", dass das exaktes Timing in Software schwierig ist. Hinsichtlich der Geschwindigkeit habe keine festen Anforderungen, aber in der Region 10000...50000 Auslesungen pro Sekunde möchte ich schon landen... Viele Grüße
Klaus L. schrieb: > aber im Falle der Espressif32-Architektur erscheint es mir > "common sense", dass das exaktes Timing in Software schwierig ist. Die bietet keine zuverlässigen Timerinterrupts? Mit einem Timerinterrupt wird das Timing nicht in Software, sondern mit Hardware erzeugt - eben einem Timer. Die Alternative, die mir einfällt, wäre kontinuierliches Auslesen. Dazu muss halt der SPI-Takt so gewählt werden, daß die gewünschte Datenrate resultiert, und der Kram mit dem DMA-Controller gesteuert werden. Ich kenne den Espressif-DMA-Controller nicht, aber ich würde untersuchen, ob es möglich ist, den in einer Endlosschleife immer den gleichen Wert zu schreiben (Auslesebefehl) und den gelesenen Wert im Speicher abzulegen und bescheid zu geben, daß ein (neuer) Wert vorliegt, damit Deine Software den verarbeiten kann. Das Ablegen im Speicher könnte auch iterativ in einem Array erfolgen, der DMA-Controller müsste dann nur nach Füllen des Arrays bescheid geben und idealerweise auf ein zweites Array umschalten, das er dann befüllt. "Bescheid geben" wäre ein Interrupt, den Deine Software natürlich auswerten muss. Im ersten Falle wäre das ein Interrupt pro Wert, d.h. eine Interruptrate von 10 .. 50 kHz, im zweiten Fall wäre die Interruptrate entsprechend deutlich geringer und abhängig von der Größe der verwendeten Puffer. Hast Du Dir das hier schon angesehen? https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/spi_master.html#
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.