Vorneweg: Es handelt sich um ein Hobbyprojekt und ich habe keine Erfahrung mit FPGAs. Wie groß ist die Datenrate die ein handelsüblicher, leistungsstarker Mikrocontroller wie z.B. der STM32F4 kontinuerlich verarbeiten kann? Ich möchte ein Signal mit einem 18Bit ADC mit parallelem Interface abtasten. Die Ergebnisse sollen eingelesen werden und dann Minimum, Maximum und ein kontinuierlicher Mittelwert berechnet werden. Eventuell wäre noch interessant, die Anzahl der Messwerte in einem bestimmten Wertebereich abzuspeichern. Die Rohdaten vom ADC müssen aber nicht abgespeichert werden. Der Mikrocontroller muss wärend der Messung keine weiteren Aufgaben übernehmen. Wie schnell könnte ich den ADC also takten?
Die Frage ist zu grob formuliert. Welcher konkrete ADC wird verwendet und wie sieht das Programm aus (in Assembler)? Du musst die Ausführzeiten der einzelnen Befehle zusammen rechnen.
Mal anders herum gefragt: Welche Datenrate brauchst Du mindestens?
Ist wie gesagt ein Bastelprojekt zum experimentieren und neue Erkentnisse gewinnen, also ist "so schnell wie möglich" eine erlaubte Spezifikation. Der ADC schafft 1MSPS, wenn eine höhere Verarbeitungsrate möglich ist, wechsle ich auf einen 10MSPS 16Bit ADC.
Martin schrieb: > Wie groß ist die Datenrate die ein handelsüblicher, leistungsstarker > Mikrocontroller wie z.B. der STM32F4 kontinuerlich verarbeiten kann? > Ich möchte ein Signal mit einem 18Bit ADC mit parallelem Interface > abtasten. Die Ergebnisse sollen eingelesen werden und dann Minimum, > Maximum und ein kontinuierlicher Mittelwert berechnet werden. Martin schrieb: > Der ADC schafft 1MSPS, wenn eine höhere Verarbeitungsrate > möglich ist, wechsle ich auf einen 10MSPS 16Bit ADC. 1MHz problemlos und auch per Interrupt auswertbar; bei 10MHz ist die Frage, was mit den Daten passieren soll und wieviel Zeit dafür benötigt wird.
naja 18Befehle reichen wohl nicht ganz aus um Min/Max und Mittelwert zu bestimmen. Gibt es einen schnelleren Controller der aber noch per Hand lötbar ist?
>Gibt es einen schnelleren Controller der aber noch per Hand >lötbar ist? Alles außer BGA ist von Hand lötbar! Zu deinem eigentlichen Problem: 18Bit ist in dem Fall suboptimal, es braucht 2 Lesezyklen um einen Abtastwert einzulesen.16 Bit wären da vorzuziehen. Wenn du da noch großartig was verarbeiten willst, sieht's mit "normalen" MC's duster aus. Das geht dann wohl Richtung DSP (Blackfin,...) Grüsse
Der Flexible memory controller (FMC) beim STM32 hat 8-,16-, 32-bit data bus width. Bis auf die "Speicherverschwendung" dürfte es also keinen Unterschied machen ob 16 oder 18Bit parallel eingelesen werden. Die Verarbeitung ist eh 32Bit.
Wenn du eh nur Min Max und Mittelwert bilden willst, dann ist die Wahrscheinlichkeit ziemlich hoch, daß du auch eine geringere Abtastrate fahren kannst. Ist irgendwie mal wieder ne Frage nach: "Ich weiss nicht wofür, aber ich will alles dicker, schneller, größer."
Einen Mittelwert rechnet man eh nicht ueber N-Werte, sondern exponentiell. Dann eght er naemlich viel schneller. Einen Min-Max macht man auch nicht ueber N Werte, sondern auch exponentiell. Dann geht der auch schneller. Mir scheint das Ganze auch ein ueberzogener Furz zu sein.
мальеикий тролл schrieb: > Einen Mittelwert rechnet man eh nicht ueber N-Werte, sondern > exponentiell. Dann eght er naemlich viel schneller. Einen Min-Max macht > man auch nicht ueber N Werte, sondern auch exponentiell. Was meinst Du mit 'exponentiell'
>Der Flexible memory controller (FMC) beim STM32 hat 8-,16-, 32-bit data >bus width. Ich weiss jetzt nicht welchen STM32 du verwendest, aber meiner hat nur 8 oder 16 Bit Busbreite. Grüsse
> Was meinst Du mit 'exponentiell'
Stell Dir einen Integrierer mit R/C Tiefpass vor:
1 | Eingang o---[===]----+----o Ausgang |
2 | | |
3 | === |
4 | | |
5 | GND |
Der Kondensator wird auf den Mittelwert (genauer gesagt: Effektiv-Wert) der Eingangsspannung geladen. Wenn die Eingangsspannung z.B. zwischen 1V und 3V hin und her springt, dann glättet der Kondensator diese Schwankungen auf 2 Volt. Das kann man mathematisch umsetzen und dazu braucht man nicht die n Samples zu speichern, sondern erhöht oder verringert den gespeicherten Wert beim Einlesen jedes Samples. Im einfachsten Fall so: uint_32_t mittelwert=0; while (1) { uint32_t diff=ADC-mittelwert; mittelwert+=diff/10; } Angenommen, du misst ganz hintereinander oft den Wert 100, dann hat die Variable "mittelwert" auch den Wert 100. Jetzt kommt einmal ein Ausrutscher mit dem Wert 200. Dann ist mittelwert=120. Wenn danach wieder immer nur 100 gemessen wird, geht "mittelwert" schrittweise wieder runter auf 100 (120, 118, 117, 116, 115, 114 ... 101, 100). Anstatt die Differenz durch 10 zu dividieren, kann man auch andere Teiler verwenden oder das Ganze logarithmisch machen, falls das für den Anwendungsfall von Vorteil ist. Dann würden sich starke Abweichungen überproportional auf das Messergebnis auswirken.
Ich denke was мальеикий тролл meinte ist der exponentielle oder auch gleitende Mittelwert. sucht danach mal bei wikipedia.
Alles klar. Gleitender Mittelwert kenne ich. 'exponentiell' war ein neuer Begriff für mich.
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.