Forum: Mikrocontroller und Digitale Elektronik Signalverarbeitung mit STM32G431: Verbesserungen


von Randy B. (rbrecker)


Lesenswert?

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.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

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
von Randy B. (rbrecker)


Lesenswert?

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
von Andreas M. (amesser)


Lesenswert?

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.

von Randy B. (rbrecker)


Lesenswert?

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?

von Andreas M. (amesser)


Lesenswert?

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?

von Randy B. (rbrecker)


Lesenswert?

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 ;-)

von Ingo L. (corrtexx)


Lesenswert?

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.

von Andreas M. (amesser)


Lesenswert?

Randy B. schrieb:
> Reis? Schmeckt sicher ganz gut, aber Du meintest bestimmst Reißbrett ;-)

Ah, ein Klugscheißer. Na dann noch viel Erfolg.

von Christoph M. (mchris)


Lesenswert?

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?

von Randy B. (rbrecker)


Lesenswert?

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