Forum: Mikrocontroller und Digitale Elektronik ESP32 SPI Master zyklisch AS5047


von Klaus L. (keyel80)


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

von Harald K. (kirnbichler)


Lesenswert?

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.

von Klaus L. (keyel80)


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

von Harald K. (kirnbichler)


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#

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.