ESP32 SPI Master zyklisch AS5047

OP #7523689
Lesenswert?

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

OP #7523717
Lesenswert?

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

#7523866
Lesenswert?

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#

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren