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?
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.
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?
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.
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.
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.
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?
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.