Hallo zusammen, ich suche nach strukturellen Verbesserungen für eine Signalvrarbeitung, die ich derzeit auf einem G431 erledige, hinsichtlich dem Einsatz weitere HW-Komponenten. Die Signalverarbeitung sieht konzeptionell folgendermaßen aus: 1) CPU-Takt fcpu = 170MHz 2) SysTick fs = 48KHz 3) mit fs läuft dann: 3a) simultanes Sampling zweier Analogeingänge via ADC1/2 (Master / Slave) 3b) insgesamt 4 FIR-Filter 3c) weitere (einfache) Signalverarbeitungsschritte zur Bildung zweier Bitfolgen 3d) Zustandsmaschinen für die Bitfolgen zur Protokollauswertung, die dann bei erfolgreicher Auswertung von N Bits ein Ausgabe (4) parametriert. 4) Ausgabe ist derzeit CPU unabhängig mit Timern Wie man vllt erkennen kann, läuft das ganze ohne Interrupts und DMA. Meine Frage ist eigentlich die nach dem Einsatz von DMA bzw. des FMAC. Da die gesamte Verarbeitung mit fs läuft, gibt es m.E. keine Notwendigkeit zur Verwendung von Interrupts bzw. das würde nur kontraproduktiv sein. Aber auch für DMA oder leider auch den FMAC finde ich keine sinnvollen Einsatzgebiete. Von den 20,8µs eines Zyklus sind derzeit 1,5µs für die AD-Wandlung und 13,1µs für (3)+(4) verbraucht. Es ist also noch genügend Luft, trotzdem würde ich mich über Anregungen freuen.
Wie genau triggerst du das ADC-Sampling? Manuell im SysTick-Interrupt oder mit Delay? Das würde einen kleinen Jitter produzieren. Besser wäre mit den Hardware-Timern direkt den ADC triggern, um eine exakte Sampling-Frequenz für die Signalverarbeitung zu erhalten. Du kannst mittels DMA eine Reihe Samples vom ADC in ein Array schreiben und das "am Stück" im Filter verarbeiten. Das würde den Overhead reduzieren und CPU-Last einsparen. Allerdings hast du dadurch auch mehr Latenz.
:
Bearbeitet durch User
Niklas G. schrieb: > Wie genau triggerst du das ADC-Sampling? Manuell im SysTick-Interrupt > oder mit Delay? Es gibt keinen SysTick-Interrupt! Das Status-Register des SysTick wird abgefragt, und dann der ADC getriggert. > Das würde einen kleinen Jitter produzieren. Gemessen habe ich 0,1µs, und das spielt für die Auswertung keine Rolle. > Besser wäre > mit den Hardware-Timern direkt den ADC triggern, um eine exakte > Sampling-Frequenz für die Signalverarbeitung zu erhalten. Sicher. Dann würde der gesamte Schritt (3) vom Polling des ADC_ISR_ADRDY abhängen. Das wird sicher im Bereich von <0,1µs was bringen und den Jitter eliminieren. Beides gut aber nicht wirklich bedeutend. > Du kannst mittels DMA eine Reihe Samples vom ADC in ein Array schreiben > und das "am Stück" im Filter verarbeiten. Das würde den Overhead > reduzieren und CPU-Last einsparen. Allerdings hast du dadurch auch mehr > Latenz. Die Latenz wird dann schon zu einem Problem. Und die tatsächliche Einsparung wäre das N-fache Lesen des ADC-Datenregisters.
:
Bearbeitet durch User
Wieso Pollen? Wenn das sowieso das einzige ist was die Firmware tut, dann kommt an den ADC ne ISR die dann direkt die ganze Verarbeitung macht. In der MainLoop legt sich das Teil schlafen.
Andreas M. schrieb: > Wieso Pollen? Wenn das sowieso das einzige ist was die Firmware tut, > dann kommt an den ADC ne ISR die dann direkt die ganze Verarbeitung > macht. In der MainLoop legt sich das Teil schlafen. Und was soll das genau bringen?
Randy B. schrieb: > Und was soll das genau bringen? Weniger Stromverbrauch? Weil du dann die 1.5µs statt mit dem Warten auf den ADC als Rechenzeit zur Verfügung hättest? Weils schlechter Stil ist? Du schaffst es eine 170MHz CPU mit lächerlichen 4 FIR Filtern zu gut 60% auszulasten. Vielleicht nochmal zurück ans Reisbrett?
Andreas M. schrieb: > Randy B. schrieb: >> Und was soll das genau bringen? > > Weniger Stromverbrauch? Interessiert nicht. > Weil du dann die 1.5µs statt mit dem Warten auf > den ADC als Rechenzeit zur Verfügung hättest? Die Zeit gewinne ich, wenn ich den ADC mit einem Timer triggere, nicht wenn ich die ganze Verarbeitung in eine ISR verlagere. > Weils schlechter Stil ist? Argumente? > Du schaffst es eine 170MHz CPU mit lächerlichen 4 FIR Filtern zu gut 60% > auszulasten. Die FIR nehmen 40% ein. Und ja, die FIR sind einfach als Faltung mit Ringbuffer realisiert. > Vielleicht nochmal zurück ans Reisbrett? Reis? Schmeckt sicher ganz gut, aber Du meintest bestimmst Reißbrett ;-)
Ich würde es folgendermaßen machen: 1. Timer die ADCs triggern lassen 2. Nach der Wandlung die Messwerte mit DMA in einen Ring-Buffer 3. Nach erfolgreichem DMA Transfer einen Interrupt auslösen lassen 4. Im Interrupt die Daten bearbeiten 5. -> 1.
Randy B. schrieb: > Reis? Schmeckt sicher ganz gut, aber Du meintest bestimmst Reißbrett ;-) Ah, ein Klugscheißer. Na dann noch viel Erfolg.
Randy B. (rbrecker) >ich suche nach strukturellen Verbesserungen für eine Signalvrarbeitung, >die ich derzeit auf einem G431 erledige, hinsichtlich dem Einsatz >weitere HW-Komponenten. Warum suchst du nach einer Verbesserung? Ist diese wirklich notwendig?
Christoph M. schrieb: > Randy B. (rbrecker) >>ich suche nach strukturellen Verbesserungen für eine Signalvrarbeitung, >>die ich derzeit auf einem G431 erledige, hinsichtlich dem Einsatz >>weitere HW-Komponenten. > > Warum suchst du nach einer Verbesserung? Ist diese wirklich notwendig? Nein, notwendig ist sie nicht (s.o.) (die Angabe bzgl. der FIR waren falsch, es sind nur 29%). Ich werde noch die ADC-Triggerung auf Timer6 umstellen. Ich hätte gerne den FMAC eingesetzt, da ich aber 4 Filter habe, sehe ich auch keinen Weg, wie ich da etwas gewinnen könnte. Oder doch?
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.