Forum: Mikrocontroller und Digitale Elektronik Analogsignal mit 40kHz messen


von Til H. (turakar)


Lesenswert?

Hi,
ich möchte mit dem Arduino Uno ein 20kHz Signal von einem Schallwandler 
messen. Dazu braucht der entsprechende Algorithmus (Goertzel) eine 40kHz 
Abtastrate. Die Signale müssten dann noch zu bytes zusammengesetzt 
werden, um dann von einer Steuerungselektronik (mit ACC, Gyro und evtl. 
Magnetometer) verwertet zu werden. In dem Arduino Forum findet man nun 
den Hinweis, das man wenn man den Prescale Faktor des ADCs runterdreht, 
akzeptable Ergebnisse bei einer Sampling Rate von 66kHz bekommt. Ich 
persönlich vermute, dass dann eine Steuerungslogik keinen Platz mehr 
findet. Dementsprechend ist meine Frage, ob man dort eher eine Art 
Zwei-Kern-System (einer liest die Signale und wandelt die in bytes um, 
die er dann dem Hauptkern schickt) oder einen externen ADC verwendet, 
der dann mit den gewünschten 40kHz (am besten mehr) abtastet?

von Pusher (Gast)


Lesenswert?

push

von Ulrich (Gast)


Lesenswert?

Der ADC im AVR arbeitet auch noch mit 40 oder 60 kHz. Allerdings kann 
man den ADC Takt nur in Potenzen von 2 einstellen - je nach Systempakt 
könnte es da Schwer werden die 40 kHz zu erreichen. Bei der hohen 
Geschwindigkeit nimmt allerdings die Genauigkeit ab. Um genau eine 
passende Abtastrate zu bekommen bräuchte man dann schon wenigstens einen 
Timer.

von Marius S. (lupin) Benutzerseite


Lesenswert?

Til Hoff schrieb:
> eine Art Zwei-Kern-System

Ich würde das so aufbauen, dass du für jede Rechenoperation einen AVR 
nimmst und die alle in Reihe schaltest. Müsste dann schon noch in einen 
19 Zoll Schrank mit Einsteckkarten passen.

Oder vielleicht einen Controller nehmen, der der Aufgabe gewachsen ist?

von Til H. (turakar)


Lesenswert?

Nunja, wir haben den Arduino ja hier rumliegen.
Die Abtastrate kann auch ruhig bei 100kHz liegen, so ist es nicht. Der 
Atmega auf dem Uno wird auch bei 16MHz betaktet, und der Prescale Faktor 
16 (sprich 1MHz ADC) wurde in dem Arduino Forum als "ok" beschrieben. 
Dazu müsste man mal einen Testaufbau mit nem Poti oder Festwiederstand 
machen.

von Karl H. (kbuchegg)


Lesenswert?

Til Hoff schrieb:

> persönlich vermute, dass dann eine Steuerungslogik keinen Platz mehr
> findet.

Mal rechnen.
16000000 / 66000 -> 240 Takte

Das ist schon recht gut. Da kann man schon etwas machen.

> Zwei-Kern-System (einer liest die Signale und wandelt die in bytes um,
> die er dann dem Hauptkern schickt

Bei getrennten 'Kernen' geht das ja noch, denn die können sich immerhin 
denselben Speicher teilen, so dass dich das 'schicken' nichts kostet.

>) oder einen externen ADC verwendet,
> der dann mit den gewünschten 40kHz (am besten mehr) abtastet?

Genau. Und die 40kHz überträgst du dann wie an den Arduino?
Du hast ANgst, dass dir ein einfaches Abholen eines popeligen ADC WErtes 
in regelmässigen Abständen den Arduino überfordert. Aber ausgewachsene 
Datenkommunikation mit derselben Rate samt dazu benötigten Overhead 
überfordert ihn nicht?

Die Hauptfrage, die ich mir stelle lautet:
Warum muss es der ADC samt Görtzel sein?
Wenn es nur darum geht, eine Frequenz auszumessen, das geht doch auch 
anders.

: Bearbeitet durch User
von Ulrich (Gast)


Lesenswert?

Sofern man den ADC und den Görtzelalgorithmus auf dem selben µC hat, 
reduziert sich die Datenrate dahinter schon deutlich. Einfach nur für 
den ADC macht ein 2. µC keinen großen Sinn - da ist wirklich die 
Kommunikation langwieriger als die Daten vom ADC auszulesen.
Wenn der ADC die 20 kHz abtasten soll, ist der ADC auch schon praktisch 
voll ausgelastet - nebenbei noch andere Kanäle wie Gyro auszulesen wird 
dann schwer. Von der Rechenleistung sind einfache Steuerungen oft eher 
nicht so anspruchsvoll. Da könnte es noch reichen. Ob mit dem Overhaed 
vom Arduino die Rechenleistung noch ausreitcht für den Görtzelagoritmus 
mit 66  kHz müsste man probieren - das könnte schon knapp werden.

Beim Arduino gäbe es ggf. noch die Option auf eine schnellere andere 
(ARM basierte) Version umzusteigen.

von Til H. (turakar)


Lesenswert?

Auf dem zweiten uC würde meine Implementierung eines Protokolls laufen, 
im genauen heißt das ein DSSS und FHSS. Ich nehme mal an, dass das nicht 
allzu viel ist. Auf der Steuereinheit müssten neben der 
Sensordmatenverwertung mehrere PID-Algorithmen und die Ansteuerung 
mehrerer Motoren laufen. Wie sieht das jetzt aus?

von Kein Name (Gast)


Lesenswert?

Wenn du es in C schreibst: Algorithmen, Prozesse und Hardwarelayer 
trennen.

Einfach mal auf der vorhandenen Hardware anfangen. Falls sich später 
herraus stellt, du brauchst mehr Leistung, kannst du immer noch auf 
mehrere Arduinos aufteilen oder auf ganz andere Hardware umstellen.

von Til H. (turakar)


Lesenswert?

Danke für den Tipp.

von max123 (Gast)


Lesenswert?

Du kannst auch Unterabtasten. Falls Du z.B. mit 30kHz abtastest, geht 
die Spektralanalyse bis 15 kHz. Solltest Du 16 kHz untersuchen, wirst Du 
14 kHz messen. (Du kannst nicht mehr unterscheiden ob Du 14kHz oder 
16kHz vorliegen hast.)
Gehst Du mit 20 kHz in den Algorithmus, wist Du 10 Khz messen. Denke das 
ganze heißt Spaceline shift.

von Til H. (turakar)


Lesenswert?

Dieses Untertasten scheint zu funktionieren (Simulation hat geklappt). 
Wenn also alle Stricke reißen, könnte ich auch das tun, jedohc habe ich 
ja dann doppelt so viele Störgeräusche. Ab morgen habe ich die Sachen 
dann auch zuhause, sodass ich mehr Tests machen kann.

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.