40khz mit ESP32 erfassen

#7899053
Lesenswert?

Hi, welches Modul/Wandler benötige ich, um 40khz zu erfassen. Ich will die Wellen auslesen und weiter bearbeiten. Ich brauch 2 Kanäle.

Was ich bisher versucht habe: Ich habe ein MCP3008 verwendet, mit der Hoffnung die 40khz auszulesen. 200ksps dachte ich, sollte ausreichen. Ich nutze den adafruit_mcp3008 library. https://github.com/adafruit/Adafruit_MCP3008 Dann habe ich bemerkt, dass 2 Kanäle sehr lange Zeit benötigt. Ich habe bei einem 1khz nur 6 mal ein Hohen Pegel lesen können, bei einem Rechteck Signal. Also habe ich nur ein Kanal ausgelesen, dann wurden 12 Werte gelesen. Das war für mich immer noch zu langsam. Also habe ich in der library nachgeschaut und gesehen, dass es auf 1Mhz SPI Frequenz läuft. Ich habe es Manuell geändert auf 3.6Mhz. Denn der Wandler läuft mit 5V. Nun habe ich 24 Hohe Werte in 1khz. Aber wenn ich die 40 khz auslesen möchte, dann ist das doch viel zu wenig.

Arduino Code:

1
#include <Adafruit_MCP3008.h>
2

3
Adafruit_MCP3008 adc;
4

5
int bufferL[10000];
6
int bufferR[10000];
7

8
int count = 0;
9

10
void setup() {
11
  Serial.begin(500000);
12
  while (!Serial);
13
  adc.begin();
14
  
15
}
16

17
void loop() {
18
  if(count==10000){
19
    for (int i=0; i<10000; i++) {
20
      Serial.println(bufferL[i]);
21
    }
22
    count=0;
23
  }else{
24
    bufferL[count] = adc.readADC(0);
25
    //bufferR[count] = adc.readADC(1);
26
    count++;
27
  }
28
}
Gast #7899099
Lesenswert?

Björn W. schrieb:

Er will offenbar ein Analogsignal bis 40kHz abtasten. Dazu braucht er wenn es ordentlich werden soll ein Wandler mit 10 MSps.

Wieso braucht er eine 25-fache Abtastfrequenz? OK, ich gehe jetzt mal von einem irgend wie gearteten Audio-Signal aus? Aber vielleicht verrät uns der TO, was für ein Signal er denn genau auswerten will. Nicht dass er in Wirklichkeit ein Digitalsignal erfassen möchte. ;-)

ciao

Marci

#7899100
Lesenswert?

Ja, es ist ein analoges Signal. Das wird von ein Ultraschallwandler erfasst. Also um nicht zu übertreiben, würde denn auch 1msps ausreichen? welches Modul, oder ADC wandler würdet ihr mir empfehlen? Ich möchte das mit ein esp32 benutzen. Wenn möglich, mit ein library für arduino.

#7899102
Lesenswert?

Unabhängig von der optimalen Abtastrate kommt es mir komisch gor, dass er unter 1000 Abtastungen nur 12 oder 24 mal einen HIGH Pegel erhält.

Ich würde erstmal messen, ob das Signal direkt am Eingang des ADC wirklich ein 40 kHz Rechteck Signal ist.

Und ich würde den ADC mit einem Poti als Signalquelle testen, ob er wenigstens bei DC plausible Werte ausgibt.

#7899104
Lesenswert?

Erik H. schrieb:

Ich habe bei einem 1khz nur 6 mal ein Hohen Pegel lesen können, bei einem Rechteck Signal. Also habe ich nur ein Kanal ausgelesen, dann wurden 12 Werte gelesen. Das war für mich immer noch zu langsam. Also habe ich in der library nachgeschaut und gesehen, dass es auf 1Mhz SPI Frequenz läuft. Ich habe es Manuell geändert auf 3.6Mhz. Denn der Wandler läuft mit 5V. Nun habe ich 24 Hohe Werte in 1khz. Aber wenn ich die 40 khz auslesen möchte, dann ist das doch viel zu wenig.

Wenn Du nur Spitzenwerte messen willst, dann gibt es einfachere Methoden die dann Dein MCP3008 auch besser umsetzen kann. Schau Dir die Schaltung "Einfacher Diodendetektor" an.

https://de.wikipedia.org/wiki/H%C3%BCllkurvendemodulator mfg Klaus

#7899115
Lesenswert?

Danke Klaus, das gibt mir Hoffnung in eine andere Richtung die ich auch ausprobieren werde. Evtl sogar die bessere Option.

Ich war erst im Gedanken die Frequenzen auszulesen mit Amplitude und da eine Logik einzubauen. Aber umso höher die Geschwindigkeit vom ADC, umso teurer und komplizierter werden die Dinger.

#7899125
Lesenswert?

Erik H. schrieb:

Aber umso höher die Geschwindigkeit vom ADC, umso teurer und komplizierter werden die Dinger.

Je später der Freitag, um so skurriler werden die Ideen.

Die Leute mit den Scheuklappen (die einem daran hindern über den Tellerrand hinauszusehen) eilen herbei und lassen den Thread laufen, egal was der TO dazu oder nicht dazu beiträgt.

Vernünftige und konkrete Ideen kommen jedenfalls nicht.

#7899148
Lesenswert?

Ich häng mich mal an den Thread ran, mit einer fast identischen Fragestellung: Fledermausklassifizierer. Ultraschallwandler, Nutzsignale im Bereich 20 bis 70 kHz, AD mit ca. 200ksps und mindestens 10bit Auflösung. Mono reicht. Geht das mit einem ESP32? Welcher ADC?

#7899243
Lesenswert?

Uwe schrieb:

Ich häng mich mal an den Thread ran, mit einer fast identischen Fragestellung: Fledermausklassifizierer. Ultraschallwandler, Nutzsignale im Bereich 20 bis 70 kHz, AD mit ca. 200ksps und mindestens 10bit Auflösung. Mono reicht. Geht das mit einem ESP32? Welcher ADC?

Wenn es um Fledermäuse geht, dann ist das schon der richtige Ansatz. Ich hatte mir vor Wochen auf meinem Handy die App Spectroid installiert. Oben sieht man die Amplituden des Frequenzbandes und unten sieht man den zeitlichen Verlauf wie ein Teppich. Zunächst sieht man so gut wie rein gar nichts. Dann fing ein Vogel anzutrellern. Und siehe da, man sah in der Tat deutlich einen Verlauf der Melodie. Das hatte ich gar nicht so erwartet, ist aber nur schlüssig.

Ich denke der TO will so etwas entwickeln. mfg Klaus

#7899339
Lesenswert?

Wastl schrieb:

Dergute W. schrieb:

wenn man wuesste was man tut

Das ist eine der entscheidenden Fragen, von der der TO ebenso wenig Ahnung hat wie von vielen anderen. Bester Hinweis dafür ist, dass er auf viele Nachfragen keine Antworten weiss. Denn wenn Antworten kämen würde man merken wie wenig Ahnung er hat.

Er ist ja schon seit anderthalb Jahren am Thema: Beitrag "Mosfet und Ultraschallsensor"

Da wird er wohl ein wenig Ahnung haben.

#7899483
Lesenswert?

Wastl schrieb:

Bester Hinweis dafür ist, dass er auf viele Nachfragen keine Antworten weiss. Denn wenn Antworten kämen würde man merken wie wenig Ahnung er hat.

Ich würde sagen, am Anfang waren wir alle unwissend. Das ist ja keine Schande. Es dauert eben Jahre um Handwerker zu werden und noch etwas länger um Ingenieur zu werden. Im Laufe meiner Ausbildungen habe ich immer gute Lehrer geschätzt. Die bringen einen auch wirklich weiter.

Wir haben doch gesehen das sich der TO bemüht. Das ist doch die Hauptsache dabei. Immerhin hat er zumindest ein Oszi. Das hatte ich in meiner Lehre noch nicht.

Also bitte seit etwas toleranter. mfg Klaus

Moderator (Firma: Titel) Persönliche Seite #7899594
Lesenswert?

Erik H. schrieb:

Das wird von ein Ultraschallwandler erfasst.

Welche Information soll aus dem Signal ausgelesen werden? Nicht, dass es hier um das simple Vorhandensein, also die Hüllkurve des Signals geht (Abstandsmesseng per US).

Für alle am einfachsten ist es, wenn du beschreibst, was da von welchem Wandler erfasst wird und wozu das gut sein soll. Und wenn du zudem noch einen Schaltplan oder wenigstens eine Übersichtsskizze deines Systems mit anhängst.

Richie schrieb:

Da wird er wohl ein wenig Ahnung haben.

Ist da nicht ein Wort zu viel im Satz?

Uwe schrieb:

Ich häng mich mal an den Thread ran

Mach für eine völlig neue Frage einen neuen Thread auf.

#7899695
Lesenswert?

Erstmal sehr interessant wie ihr Meinungen über mich macht, nur weil ich nicht sofort antworten konnte.

Ich kann auch nicht so sagen, wie ich es geschafft habe Verwirrungen zu sorgen und weis grad nicht so genau wie ich als kleiner Hobby Elektroniker das besser beschreiben kann. Mein Vorhaben wollte ich erst nicht schreiben, weil ich einfach selber etwas probieren wollte. Ich wollte halt nur wissen, was man da so an ADC wandler verwendet. Oder evtl schon mein mit Code etwas falsch mache.

Ich hätte eher Sinuswelle sagen sollen. Naja, diese Kurven die am Oszilloskop angezeigt werden. Diese Höhen und Tiefen wollte ich auslesen/erfassen. Wieviel Volt eine Welle ausgibt usw, die von ein Ultraschallsensor(Ein reiner Wandler, der mit Operationsverstärker verstärkt wird) gelesen wird. Denn wenn eine weitere Welle ein Objekt trifft, die etwas hinter dem ersten Objekt steht, dann ist sie meistens noch hinter der ersten abgeprallten Welle. Diese Wellen wollte ich auslesen, ob es auch 8 sind, die ich gesendet habe. Dann wollte ich eine 35 khz Welle hinterher schicken, und die dann erkennen und weiteres versuchen.

Da dachte ich, 200ksps würde für 40khz ausreichen. Zwar sehr Grob, aber immerhin erkennbar. Das das Teil jetzt in dem Fall so langsam abfragt, hat mir gezeigt, auch durch eure Kommentare, dass 200ksps viel zu wenig ist. Denn anscheint habe ich bisher mit mein Code noch nix verkehrt gemacht. 200ksps sind doch nix anderes wie 200khz, oder? Also, um eine 40khz Welle zu erkennen, bedarf es doch mehr Abtastungen, um auch mal paar mal ins Tiefe zu messen und in den hohen Bereich. Sagen wir mal, 4 Tiefe Messungen und 4 Hohe Messungen, damit man sicher gehen kann, dass es 40khz sind. Wenn ich nur 40ksps habe, dann wäre das nach mein Denken sehr unlogisch ein vernünftigen Wert zu bekommen.

Klaus hat mir super ein anderen Weg gezeigt, den ich ausprobieren werde, aber nicht gleich heißt, dass ich das hier so wollte, da einige deswegen nochmal nachgefragt haben, was ich nun möchte.

Im anderen Thread habe ich ein Verstärker gebaut mit Filter usw. Den habe ich so hoch aufgedreht, dass ich Rechteck Signale bekomme. Die habe ich mit dem esp32 ausgelesen durch normale digital Eingänge, ohne ADC. Das hat aber zu vielen Fehler geführt, da mein Verstärker einfach zu hoch aufgedreht war und nicht die richtigen Operationsverstärker waren. Hat nur bedingt geklappt. Aber so konnte ich durch die Schnelle Abfrage des esp32 über 10 Hoch und über 10 Tief messen. Somit konnte ich die Frequenz sehr gut erkennen, also die Wellenlänge und Anzahl usw. Beim ADC habe ich nun mitbekommen, dass alles langsamer läuft.

#7899731
Lesenswert?

Alexander schrieb:

Du hattest es irgendwo geschrieben (Spannung zu hoch?) aber warum nutzt Du nicht einen der 12-Bit ADC Kanäle des ESP32 direkt? Mit analogReadFast() kommst Du auf 40kHz.

ich probiere das nochmal. Ich weiß nicht mehr warum ich daran gescheitert bin. Ist leider schon sehr lange her. Ich glaub analogreadfast war nicht ausreichend. und dann wollte ich auch 2 Sensoren lesen, was ich jetzt vergessen habe zu erwähnen. Aber ich probiere das nochmal. Meine alten Codes müsste ich ja noch haben.

#7899764
Lesenswert?

Für den MCP3008 habe ich diese Library verwendet: https://github.com/adafruit/Adafruit_MCP3008 Ich musste die etwas umschreiben, weil der nur für 3.3V ausgelegt war, aber ich verwende den als 5V. Also habe ich das hier geändert #define MCP3008_SPI_FREQ 3600000 . Dadurch habe ich den ADC schneller auslesen können. Aber für 1khz Rechteck Signal Bereich mit nur knapp 12 Messungen für High ist das zu wenig, finde ich. Also mit 2 Kanäle. wenn ich nur ein Kanal abfrage, dann 24. Dann habe ich mir gedacht, dass der DigitalWrite zu langsam ist. Also habe ich den geändert.

Das habe ich hinzugefügt in der cpp:

1
#define IO_REG_TYPE uint32_t
2

3
 //static inline __attribute__((always_inline))
4
void directWriteLow(IO_REG_TYPE pin)
5
{
6
    if (pin < 32)
7
        GPIO.out_w1tc = ((uint32_t)1 << pin);
8
    else if (pin < 34)
9
        GPIO.out1_w1tc.val = ((uint32_t)1 << (pin - 32));
10
}
11

12
//static inline __attribute__((always_inline))
13
void directWriteHigh(IO_REG_TYPE pin)
14
{
15
    if (pin < 32)
16
        GPIO.out_w1ts = ((uint32_t)1 << pin);
17
    else if (pin < 34)
18
        GPIO.out1_w1ts.val = ((uint32_t)1 << (pin - 32));
19
}

Und das habe ich geändert in der cpp:

1
// SPI transfer for ADC read
2
int Adafruit_MCP3008::SPIxADC(uint8_t channel, bool differential) {
3
  // see datasheet sec 6.1
4
  buffer[0] = 0x01;
5
  buffer[1] = ((differential ? 0 : 1) << 7) | (channel << 4);
6
  spi_dev->beginTransaction();
7
  //digitalWrite(_cs, LOW);
8
  directWriteLow(_cs);
9
  spi_dev->transfer(buffer, 3);
10
  //digitalWrite(_cs, HIGH);
11
  directWriteHigh(_cs);
12
  spi_dev->endTransaction();
13
  return (((uint16_t)(buffer[1] & 0x07)) << 8) | buffer[2];
14
}

Aber diese Änderung hat in diesem Fall nix bewirkt. Mit dem Code kann ich den ESP32 schneller digitalWrite und Read verwenden. Daher habe ich den probiert.

https://github.com/RobTillaart/MCP_ADC habe ich auch probiert, aber da kam nur Null zustande. Habe mich damit auch nicht mehr weiter beschäftigt.

https://github.com/bakercp/MCP3XXX Habe ich das selbe wie mit adafruit geändert und es kommt das selbe Ergebnis.

#7899814
Lesenswert?

Um genau zu verstehen, was da passiert, wäre meine Empfehlung einen günstigen Logic-Analyzer (Saleae-Clone für ~15 Euro) an die SPI zu hängen, oder ein Zweikanal-Oszi an den Chipselect und Clock. Weil die 200k Samples pro Sekunde sind das Maximum des Bausteins, aber die liefert er nicht automatisch aus, sondern der Code holt jedes Sample einzeln ab. Durch Messen kann man feststellen, wieviel Zeit vergeht zwischen den Abholungen. Je nachdem wie schnell der Controller ist und was er sonst noch zu tun hat, dauert das länger oder kürzer. Für 200ksps müsste er alle 5 Mikrosekunden einen Transfer machen. Mir ist nicht klar, ob der ESP das erreicht allein durch zyklisches Abfragen in Software, oder ob man so Späße wie DMA dazu braucht, die den Transfer in Hardware erledigt und nur alle n Samples dann die Software einen Puffer auswertet.

#7899840
Lesenswert?

Uwe schrieb:

Durch Messen kann man feststellen, wieviel Zeit vergeht zwischen den Abholungen. Je nachdem wie schnell der Controller ist und was er sonst noch zu tun hat, dauert das länger oder kürzer. Für 200ksps müsste er alle 5 Mikrosekunden einen Transfer machen.

Werde ich mal in Angriff nehmen. Danke.

Alexander schrieb:

Ich meinte für analogReadFast() da gibt's mehrere.

https://github.com/stg/ESP32-S3-FastAnalogRead

https://github.com/homeodor/FastAnalogRead

OK, dann werden beide mal getestet, Danke.

#7899923
Lesenswert?

Uwe schrieb:

oder ein Zweikanal-Oszi an den Chipselect und Clock.

Ich habe ein Bild dazu gemacht. 12 Microsekunden ist der High Pegel. Und der läuft so durch wie das Bild zusehen ist bis zum Ende der Schleife. Ohne dass da Lücken zu bemerken sind.

Alexander schrieb:

Ich meinte für analogReadFast() da gibt's mehrere.

https://github.com/stg/ESP32-S3-FastAnalogRead

https://github.com/homeodor/FastAnalogRead

Ich habe den ESP32-S3 bestellt und werde es mal ausprobieren. Der ESP32 Dev Kit v4 hat sowieso viel zu viele einschränkungen, daher lohnt sich mal der Kauf.

der andere FastAnalogRead ist glaube ich, nur für Arduinos. Ich habe jedenfalls kein ESP32 lesen können.

Angehängte Dateien:
#7900675
Lesenswert?

Erik H. schrieb:

ich probiere das nochmal. Ich weiß nicht mehr warum ich daran gescheitert bin. Ist leider schon sehr lange her. Ich glaub analogreadfast war nicht ausreichend. und dann wollte ich auch 2 Sensoren lesen, was ich jetzt vergessen habe zu erwähnen. Aber ich probiere das nochmal. Meine alten Codes müsste ich ja noch haben.

Die KI sagt :

Der ESP32 verfügt über zwei 12-Bit-Analog-Digital-Wandler (ADCs), die über 18 Kanäle verfügen und DMA-fähig sind. DMA (Direct Memory Access) ermöglicht eine effiziente Datenübertragung von den ADCs in den Speicher, ohne dass die CPU ständig Datenübertragungen überwachen muss. Dies ist besonders nützlich für kontinuierliche Abtastungen mit hoher Geschwindigkeit. Hauptmerkmale:

1
Zwei ADCs:
2
Der ESP32 hat zwei ADC-Einheiten (ADC1 und ADC2), die jeweils mehrere Kanäle unterstützen.
3
12-Bit-Auflösung:
4
Beide ADCs bieten eine Auflösung von 12 Bit, was 4096 diskrete Werte ermöglicht.
5
18 Kanäle:
6
Insgesamt stehen 18 analoge Eingangskanäle zur Verfügung, die auf verschiedene GPIO-Pins verteilt sind.
7
DMA-Unterstützung:
8
Der ESP32 ADC kann im DMA-Modus betrieben werden, um eine effiziente Datenübertragung zu ermöglichen.
#7900695
Lesenswert?

Alexander schrieb:

Dazu muss man programmieren können.

In der Tat! Vor allem muss man zeitlich äquidistant abtasten, sonst kommt nur Murks und Mist heraus. Das scheint hier im Thread aber niemanden zu stören. Ist ja auch nicht wichtig:

Wastl schrieb:

GAF (grösster anzunehmender Fehler) ist dass die Abtastung nicht zeitlich äquidistant, also im festen Raster, erfolgt.

Wahrscheinlich gehen solche unwichtigen "Nebenbemerkungen" im allgemeinen Wust von Gelabere unter.

Alexander schrieb:

Der TE fragt aber nach einer Arduino Lib.

Und die (welche auch immer) kann das garantiert nicht, das getaktete Samplen.

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