Einsatz ESP32 für DSP

Hallo,

ja ich weiß, der ESP32 ist kein DSP, aber der reine Prozessortakt erlaubt ja schon einiges. Ich habe nämlich folgendes vor:
16Bit (besser wäre 18Bit) ADC über SPI an ESP32 anbinden. Projektbedingt brauche ich mindestens 300ksps (Messungen pro Sekunde), realtime.

Kann jemand sagen, ob das mit dem ESP grundsätzlich realisierbar wäre? Leider kann ich zudem nicht abschätzen ob man die Daten überhaupt realtime in den ESP bekäme.

Ja ich weiß:

  • bei 16Bit ADC ist der Analogteil mit "etwas" Aufwand verbunden
  • die digitale Signalverarbeitung wird zusätzlich bremsen

Gruß,
Dieter

Hallo,

Realtime ist meistens ein Buzzword. Definiere für dich Realtime. 16 oder 18Bit? Bekommste das Analogdesign Rauschfrei/Störungsfrei hin? Wenn du am Ende hunderte Softwarefilter drüberjagst nützt dir die Auflösung Eingangsseitig in Hardware auch nichts. Das fängt in der Regel schon mit einer sauberen Spannungsversorgung und Referenzspannung an. Zur Frage, grundsätzlich ist alles möglich.

Was soll es am Ende werden? Wofür benötigt man 300.000 Messungen pro Sekunde? Messen ist das Eine. Verarbeiten ohne zu bremsen das Andere. Sind die 300ksps schon die doppelte Abtastfrequenz?

Mein Signal hat ~130kHz, ist aber zum Glück niederohmig aber ob rauschfrei bzw. störungsfrei kann ich nicht mit Sicherheit sagen, aber laut Oszi würde ich sagen ja.
Die 16Bit Minimum brauche ich, weil das Signal sich eben nur um <50ppm ändert. Und wie gesagt, das die 16Bit gewisse Anforderungen stellen ist mir bekannt. Ob ich das auch realisieren kann, steht (leider) noch auf einem anderen Blatt

Digitale AM Demodulation eines 134kHz Trägers

Hallo,

aha. Ein ESP32 wird das sicherlich schaffen. Notfalls mit Hardwarenaher Programmierung? Das wäre beim ESP zusätzlich doppelt sportlich zur sportlichen Aufgabe. Ich möchte dir aber keine falschen Hoffnungen machen. Am Ende kannste nur probieren. Ein ESP32 kostet nicht die Welt. Zum testen kannste einen Arduino als Taktgenerator verwenden und mit Spannungsteiler anklemmen und schauen wie weit du kommst. Bevor du dir einen externen ADC gönnst. Ich gehe davon aus das du schon einen Arduino hast und damit schon programmiert hast.

Was soll nachdem einlesen mit den Daten passieren?

Eine Alternative wäre ein Teensy. Aber die Teile kenne ich nur vom Name.

ESP habe ich nur ESP8266 und eigentlich mach nur mit ATmega's rum. Das als Hinweis. :wink:

Hallo,
Den ESP32 habe ich da, ADC noch nicht. Testweise könnte ich dessen Analogeingang schon dafür verwenden, aber ich werde einen externen brauchen.
Den Teensy habe ich nicht, aber hast du Erfahrung wieviel kb/s es bei dessen 72Mhz über den SPI-Bus schaffen?

Bevor ich hardwarenahe Programmierung anfange, weiche ich eher auf einen schnelleren Prozessor aus, notfalls RaspPi :slight_smile: Da könnte ich dann auch ein RTOS einsetzen. Der Analogteil macht mir schon genügend Bedenken.

Edit: ich sehe gerade, auch der ESP32 kann oder könnte FreeRTOS. Aber das wäre auch völliges Neuland für mich.

dieterr:
Mein Signal hat ~130kHz

Die 16Bit Minimum brauche ich, weil das Signal sich eben nur um <50ppm ändert.

Digitale AM Demodulation eines 134kHz Trägers

Für die 50ppm würde ich schätzen, daß man mit 100 Abtastungen pro Periode hinkommen könnte, also 10Msps. Bei weniger Meßwerten wird die Interpolation auf die aktuelle Amplitude möglicherweise zu ungenau.

Die Rechnerei wird dann relativ einfach, da reicht die Suche nach einem Spitzenwert und dann die Interpolation der 3-5 umgebenden Meßwerte für die tatsächliche Amplitude. Dann darf aber kein Rauschen dazwischenkommen und falsche Maxima liefern.

Hallo,

der Gedanke war du kannst dich mit dem ESP eigenen ADC an die Aufgabe ohne Zusatzkosten rantasten.

Wegen deiner Frage "wieviel kb/s es bei dessen 72Mhz über den SPI-Bus schaffen?"
Dafür kannste ein wenig rechnen. 300ksps mit 16Bit macht 4,8 Millionen Bits pro Sekunde. Das ist bei einem SPI Takt von 10MHz in einer halben Sekunde erledigt. Die halbe Sekunde verteilt sich aber auf die eine Sekunde. Du hast also eine halbe Sekunde Zeit zum verarbeiten der Daten innerhalb der einen Sekunde.

DrDiettrich hat schon Ideen zur Datenminimierung, was zusätzlich Zeit verschafft.

Übrigens heißt das, dass theoretisch auch ein Atmega das einlesen schafft. Theoretisch deswegen, weil nicht klar ist ob er in der restlichen Zeit deine Wünsche der Datenverarbeitung bewältigen kann.

DrDiettrich:
Für die 50ppm würde ich schätzen, daß man mit 100 Abtastungen pro Periode hinkommen könnte, also 10Msps. Bei weniger Meßwerten wird die Interpolation auf die aktuelle Amplitude möglicherweise zu ungenau.

16Bit, 10Msps macht es ja nicht besser :smiley: Eher aussichtslos. Aber das Problem "Ungenauigkeit der Amplitude" hatte ich fast befürchtet. 100 Samples pro Periode halte ich aber für zu viel.

Korrektur: nach weiterer Überlegung muss ein richtiges RT nicht sein. Ich kann auch ~100ms oder 200ms einlesen, zB in einen Ringbuffer, und habe dann 100 bzw. 200ms Zeit zur Auswertung. Sprich Softwareproblematik diesbezüglich ist entschärft.

Die SPI clock speed des ESP32 ist wohl 40MHz. Also werde ich mein Glück mal versuchen und einen passenden AD suchen.

dieterr:
Den Teensy habe ich nicht, aber hast du Erfahrung wieviel kb/s es bei dessen 72Mhz über den SPI-Bus schaffen?

Ich habe einen Teensy 3.2, der normalerweise LEDs animiert, wie könnte ich die Geschwindigkeit testen?

dieterr:
... notfalls RaspPi :slight_smile:

Die neueren Teensys haben eine FPU, die 4.x mit 600 MHz Takt eine "FPU which supports both 64 bit double and 32 bit float" und "SPI with 16 word FIFO". Allerdings mußt Du überprüfen, ob das auch von Software unterstützt wird.

Inwieweit Dir das hilft, vermag ich aber nicht abzuschätzen.

Bei 10MHz und selbst noch bei 40MHz SPI clock wird es eng, das wären maximal 2,5Msps oder gerade mal 5-20 Samples pro Periode. Aber zum Üben sollte das reichen, danach kann man die tatsächlichen Anforderungen besser abschätzen.

Hallo,

die Rechnung kann ich gerade nicht nachvollziehen. Wie kommst du auf 2,5Msps? Laut meiner Meinung sind 300ksps schon die doppelte Abtastfrequenz von 134kHz Signal. Oder willst du noch höher abtasten?

40MHz durch 16 Bit gibt 2,5Msps.

Mit 300ksps kann man vielleicht die Frequenz des Signals feststellen, aber keinesfalls seine Amplitude auf 50ppm genau. Das Abtasttheorem gilt nur näherungsweise für ideale Meßwerte, ohne Störungen und ohne beschränkte Bitzahl.

Hallo,

aja, alles klar. Danke.

Danke für euer Feedback. Ein Blick von außen lässt manches klarer werden. Auch, dass es in meinem Fall die Idee wohl nicht klappen kann.

Ein Test mit Oszi zeigt, dass ich mindestens 10fach Oversampling brauche. Darunter wird wie schon befürchtet die Amplitudenauflösung zu schlecht. Wären dann 2Msps. Die würde ich eventuell noch über SPI bekommen.
Aber die Realisierung eines 16Bit/2Msps Systems ist (für mich) illusorisch.

Und die Datenmenge innerhalb von 50ms (reicht, muss nicht 100ms) hat dann 1,6Mbit, etwas viel für einen Ringbuffer im ESP32.

Ich werde das Konzept überdenken müssen.