Forum: Digitale Signalverarbeitung / DSP / Machine Learning Zeitdauer Regelalgorithmus auf Hardware


von Michel Weis (Gast)


Lesenswert?

Liebe Kollegen,

eine Frage habe ich:

Ich habe einen adaptiven Regler in Simulink erstellt und möchte diesen 
direkt auf mein Arduino laden, direkt von Simulink aus.


Nun sehe ich aber, dass der Regler so komplex ist, dass meine Hardware 
hier keine Regelung in Echtzeit garantieren kann.

Meine Frage daher:

Gibt es Möglichkeiten, wie ich den erzeugten Code direkt, bevor ich den 
AUF DIE Hardware implementiere, prüfen kann, ob der die 
Zeitanforderungen schafft?

Oder anders ausgedrückt:

Kann ich abschätzen, wie lange mein Code an Zeit/Ressourcen benötigen 
wird vom Eingangssignal einlesen über den Sensor bis zur Ausgabe an den 
Aktuator?

von Achim M. (minifloat)


Lesenswert?

Du könntest die einzelnen benötigten Signalverarbeitenden Elemente 
ressourcensparend implementieren (z.B. erst mal Floatingpoint-Arithmetik 
durch fixkomma-Arithmetik ersetzen) und in jeweils einer C-mex 
S-Function gegen dein bestehendes Simulink-Modell benchmarken.

Die ressourcensparende(n) Implementierung(en) kannst du mit einer 
Laufzeitmessung on-target charakterisieren (Portpin an, Rechenschritt, 
Portpin aus) und dir dann zusammenrechnen, was die Rechenlast und die 
erreichbare Zykluszeit des ganzen Reglers ist.

Dabei fallen dir die Möglichkeiten der Optimierung gleich in die Hand:
a) Verarbeitungsschritte, die einmal pro Zyklus vorkommen, aber sehr 
viel Zeit fressen
b) Verarbeitungsschritte, die oft pro Zyklus vorkommen, einzeln relativ 
wenig Zeit fressen (z.B. 10µsec pro Instanz, aber 100x pro Zyklus, da 
sparst du pro Zyklus 100µsec, wenn du den nur je um 1µsec verkürzen 
kannst)

mfg mf

von Michel Weis (Gast)


Lesenswert?

Erst mal herzlichen Dank dafür.


Achim M. schrieb:
> Du könntest die einzelnen benötigten Signalverarbeitenden Elemente
> ressourcensparend implementieren (z.B. erst mal Floatingpoint-Arithmetik
> durch fixkomma-Arithmetik ersetzen) und in jeweils einer C-mex
> S-Function gegen dein bestehendes Simulink-Modell benchmarken.

Aber wie genau soll das funktionieren? Wir können auch als einfaches 
Beispiel ein einfachen PID-Regler nehmen.

Achim M. schrieb:
> Die ressourcensparende(n) Implementierung(en) kannst du mit einer
> Laufzeitmessung on-target charakterisieren (Portpin an, Rechenschritt,
> Portpin aus) und dir dann zusammenrechnen, was die Rechenlast und die
> erreichbare Zykluszeit des ganzen Reglers ist.

AUch hier frage ich mich, welche Blöcke ich dazu verwenden soll? Was 
genau meinst du mit PortPin?

Achim M. schrieb:
> Dabei fallen dir die Möglichkeiten der Optimierung gleich in die Hand:
> a) Verarbeitungsschritte, die einmal pro Zyklus vorkommen, aber sehr
> viel Zeit fressen
> b) Verarbeitungsschritte, die oft pro Zyklus vorkommen, einzeln relativ
> wenig Zeit fressen (z.B. 10µsec pro Instanz, aber 100x pro Zyklus, da
> sparst du pro Zyklus 100µsec, wenn du den nur je um 1µsec verkürzen
> kannst)

Guter Hinweis.

Aber sorry, ich bin nicht soooooo der Matlab-Experte, kannst du es ein 
bisschen verfeinern?

von N. M. (mani)


Lesenswert?

Michel Weis schrieb:
> Nun sehe ich aber, dass der Regler so komplex ist, dass meine Hardware
> hier keine Regelung in Echtzeit garantieren kann.

Definiere komplex und definiere Echtzeit.

Michel Weis schrieb:
> Gibt es Möglichkeiten, wie ich den erzeugten Code direkt, bevor ich den
> AUF DIE Hardware implementiere, prüfen kann, ob der die
> Zeitanforderungen schafft?

Na du hast in einer Regelung in irgendeiner Art eine Signal Erhebung 
(z.B. ADC) und eine Signal/Wert Generierung (z.B. DAC). Das würde ich 
nicht ganz vernachlässigen, braucht aber wahrscheinlich am wenigsten 
Zeit.

Dazwischen sind deine Berechnungen.
Wenn du den Code übersetzt, weißt du wieviel Befehle dafür benötigt 
werden. Damit kannst du dann eine Zweitabschätzung machen.

Achim M. schrieb:
> z.B. erst mal Floatingpoint-Arithmetik durch fixkomma-Arithmetik
> ersetzen

Halte ich für eine gewagte Aussage, da sie Hardwareabhängig ist. Viele 
Controller haben heute eine FPU an Bord. Dann kann Floating Point 
schneller sein als eine Fixed Bib.

von Sebastian S. (amateur)


Lesenswert?

@ Michel Weis
>und möchte diesen direkt auf mein Arduino laden
Nun, ich nutze ihn zwar ganz gerne, nur ist der Arduino nicht gerade als 
Sprinter bekannt.
Spätestens wenn Du ihn Fließkommaoperationen durchhecheln lässt wirst Du 
das auch selber feststellen. Es gibt zwar viele Bibliotheken, die das 
unterstützen, die brauchen aber prinzipiell viel Zeit.

Ob Du aber den Output eines Programmes wie den von Simulink, soweit 
beeinflussen kannst dass KEINE Fließkommaarithmetik verwendet wird weiß 
ich nicht. Überhaupt betrachte ich solche Programme als Komfort-Liegen.
Also hast du "unendlich" viel Power, so machen sie, was sie sollen. Bei 
Meister Schmalhans gehen diese aber nicht so gerne essen.

Wenn es also ein Arduino sein soll, so würde ich das Ganze mit Simulink 
simulieren und überprüfen. Dann aber in ganz normalem C 
nachprogrammieren und den ganzen Fließkommakram im Keller lassen.

Eventuell sind zeitkritische Routinen auch ein Grund, mal wieder die 
Assemblerkenntnisse herauszuholen. Oft geht es ja nur um ein oder zwei 
Kernfunktionen. Der restliche Kram, aus den Bibliotheken, sollte auch so 
schon "optimal" sein.

von Achim M. (minifloat)


Lesenswert?

N. M. schrieb:
> Halte ich für eine gewagte Aussage, da sie Hardwareabhängig ist. Viele
> Controller haben heute eine FPU an Bord. Dann kann Floating Point
> schneller sein als eine Fixed Bib.

Aha. Michel Weis schrieb aber im Beitrag #6408617:
> direkt auf mein Arduino

Soviel dazu...

Michel Weis schrieb:
> AUch hier frage ich mich, welche Blöcke ich dazu verwenden soll? Was
> genau meinst du mit PortPin?

Simulink ist eine blockorientierte Simulation. Daher die 
"signalverarbeitenden Blöcke".

Portpin ist einfach ein Pin am Mikrocontroller auf deinem Arduino-Board. 
Also "DigitalWrite 1", rechnen "DigitalWrite 0". Die Länge des 
resultierenden Pulses kannst du z.B. mit einem Oszilloskop messen.

Michel Weis schrieb:
> Aber wie genau soll das funktionieren? Wir können auch als einfaches
> Beispiel ein einfachen PID-Regler nehmen.

Dann implementiere den PID in "plain C" selber oder nimm ihn aus einer 
Quelloffenen Library, schmeiß das in eine C-Mex S-Function und lass 
deinen PID gegen den von Simulink antreten.
Und benutze bitte die Doku/Hilfe von Simulink. Die ist sehr ausführlich 
und klar formuliert.

Michel Weis schrieb:
> Achim M. schrieb:
>> Dabei fallen dir die Möglichkeiten der Optimierung gleich in die Hand:
>> ...
>
> Guter Hinweis.
>
> Aber sorry, ich bin nicht soooooo der Matlab-Experte, kannst du es ein
> bisschen verfeinern?
Das hat erstmal garnix mit Matlab zu tun...

Beispiel für a). Du brauchst irgendwo z.B. den Betrag eines Vektors mit 
2 Elementen. Erster Ansatz ist, Elemente des Vektors Quadrieren, 
summieren und darauf die Wurzelfunktion anwenden. Frisst viel Rechenzeit 
ohne FPU. Optimierung: Nutzung eines Vektorlängen-Schätzers, der genau 
genug ist.

Beispiel für b) Du hast überall quer durch den Code verstreut, 
reskalierung von Rechenergebnissen mit einem Parameter, der zwar 
einstellbar ist, aber dooferweise der Nenner eines Bruches ist. 
Vorschlag, das einmal zur Init-Zeit (lingua Arduini: setup-Funktion) in 
den Kehrwert umzurechnen, um zur Laufzeit dann nur noch multiplizieren 
zu müssen.

Oder noch was für b) Multiplikation oder Division mit/durch 
Zweierpotenzen durch Schiebeoperationen ersetzen.

mfg mf

von N. M. (mani)


Lesenswert?

Achim M. schrieb:
> Aha. Michel Weis schrieb aber im Beitrag #6408617:
>> direkt auf mein Arduino
>
> Soviel dazu...

Wenn sein Regler wirklich so komplex ist wird er da ja wahrscheinlich 
nicht die kleinste Möhre nehmen vermute ich.
Gibt es bei dem Arduino Zeug wirklich keinen einzigen mit einer FPU? 🙄

Achim M. schrieb:
> Dann implementiere den PID in "plain C"

Ja so wurde ich das auch machen. Den Regler in C schreiben. Auf dem PC 
mit Eingangsdaten füttern und schauen ob der Output stimmt.
Danach einmal für das Target übersetzen und man sieht ohne Hardware zu 
haben wieviel es kostet.

von Achim M. (minifloat)


Lesenswert?

N. M. schrieb:
> Gibt es bei dem Arduino Zeug wirklich keinen einzigen mit einer FPU? 🙄

Na halt keinen klassischen. Da sind bloß 8-bit Microchip (Atmel) AVR 
drauf. Aber in dem Format mit entsprechendem Pfostenverbinder-Layout für 
die Mezzanine-Aufsteckplatinchen gibt es schon was mit FPU.
mfg mf

von Michel Weis (Gast)


Lesenswert?

N. M. schrieb:
> Ja so wurde ich das auch machen. Den Regler in C schreiben. Auf dem PC
> mit Eingangsdaten füttern und schauen ob der Output stimmt.
> Danach einmal für das Target übersetzen und man sieht ohne Hardware zu
> haben wieviel es kostet.

WIe viel was genau kostet?

N. M. schrieb:
> Dazwischen sind deine Berechnungen.
> Wenn du den Code übersetzt, weißt du wieviel Befehle dafür benötigt
> werden. Damit kannst du dann eine Zweitabschätzung machen.

Gibt es ein Beispiel, wie man das macht?

Achim M. schrieb:
> Portpin ist einfach ein Pin am Mikrocontroller auf deinem Arduino-Board.
> Also "DigitalWrite 1", rechnen "DigitalWrite 0". Die Länge des
> resultierenden Pulses kannst du z.B. mit einem Oszilloskop messen.

ABer das ist ja genau mein Punkt. Ich will keine Hardware verwenden.

Herzlichen Dank für eure Mühe.

von Michel Weis (Gast)


Lesenswert?

Leute Hintergrund meiner Fragestellung ist, ob man dies auch mit 
Matlab-Simulink machen kann wie bei dem Hersteller hier:

https://www.youtube.com/watch?v=mD_CodP-2jE

Jmd. eine Idee?

von N. M. (mani)


Lesenswert?

Michel Weis schrieb:
> WIe viel was genau kostet?

Wenn du deinen Regler in, sagen wir Mal C schreibst, kannst du ihn auf 
dem PC validieren über Stimulie (z.B. Sprungantwort o.ä.). Wenn alles 
funktioniert übersetzt du denn gleichen Code für dein Zielsystem. Über 
den Output des Compilers (z.B. Object Files) weißt du wie viele Befehle 
dein Zielsystem braucht um den Algorithmus umzusetzen.
Damit kannst du dann mit dem uC Manual umrechnen auf Zeit.
Also wieviel der Code "kostet".

Michel Weis schrieb:
> Gibt es ein Beispiel, wie man das macht?

Ich hab jetzt keins zur Hand, aber hier im Forum findet man mit 
Sicherheit etwas.

von N. M. (mani)


Lesenswert?

Michel Weis schrieb:
> Leute Hintergrund meiner Fragestellung ist, ob man dies auch mit
> Matlab-Simulink machen kann wie bei dem Hersteller hier

Das kann ich dir nicht beantworten. Aber letzten Endes muss irgendwann 
der Matlab Code / Simulink Modell auf dein Zielsystem übersetzt werden. 
Also wird es auch ein/mehrere Object Files geben...

von Wolfgang (Gast)


Lesenswert?

Michel Weis schrieb:
> ABer das ist ja genau mein Punkt. Ich will keine Hardware verwenden.
Dann brauchst du dir auch keine weiteren Sorgen zu machen.

Wahrscheinlich reicht es dir sowieso nicht, auszuprobieren, ob es 
funktioniert.
Damit du garantieren kannst, das die Regelung in Echtzeit läuft, wirst 
du den generierten Code genau analysieren und auf maximale Laufzeit 
abklopfen müssen.

von Michel Weis (Gast)


Lesenswert?

Wolfgang schrieb:
> Damit du garantieren kannst, das die Regelung in Echtzeit läuft, wirst
> du den generierten Code genau analysieren und auf maximale Laufzeit
> abklopfen müssen.

Ja mir fehlt ja ein Beispiel, da ich mir sonst schwer tue, wie man ein 
Code auf Laufzeit analysieren kann.


Ich würde nämlich mit Simulink folgendes gerne machen:

https://www.youtube.com/watch?v=X98XQ_gv4sE&t=6s

Das muss doch auch möglich sein,oder?

von Michel Weis (Gast)


Lesenswert?

Michel Weis schrieb:
> Wolfgang schrieb:
>> Damit du garantieren kannst, das die Regelung in Echtzeit läuft, wirst
>> du den generierten Code genau analysieren und auf maximale Laufzeit
>> abklopfen müssen.
>
> Ja mir fehlt ja ein Beispiel, da ich mir sonst schwer tue, wie man ein
> Code auf Laufzeit analysieren kann.
>
> Ich würde nämlich mit Simulink folgendes gerne machen:
>
> Youtube-Video "Kürzere Entwicklungszyklen durch virtuelle Verifikation
> von Timing-Anforderungen"
>
> Das muss doch auch möglich sein,oder?

Kann hier keiner helfen?

von pittiplatsch (Gast)


Lesenswert?

Hersteller von "richtigen" Signalprozessoren bieten auch
Libraries fuer Funktionsbloecke an. Mit verifizierter Laufzeit.
Und fuer selbstgeschriebene Funktionen/Bloecke muss man
dann halt den Simulator bemuehen und sich die Befehlszyklen
mitzaehlen lassen. Dazu muss man natuerlich auch die
Eingangsparameter variieren um die Worst-Case-Faelle
zu erkennen.

Keiner braucht also: "... virtuelle Verifikation von
Timing-Anforderungen".

Allgemein gilt ohnehin, dass der Regler zwischen 2 Abtastungen
mit seiner Rechnerei fertig sein muss.
Ein Regler der bzgl. der Rechenzeit nicht deterministisch ist,
ist da ganz einfach unbrauchbar.

von Audiomann (Gast)


Lesenswert?

pittiplatsch schrieb:
> Keiner braucht also: "... virtuelle Verifikation von
> Timing-Anforderungen".

Das Abzählen im Simulator, das du vorschlägst, ist aber doch genau das?

von Sebastian S. (amateur)


Lesenswert?

Genaue Zeiten kann Dir sowieso niemand angeben!
Spätestens wenn sich irgendwo im Code eine bedingte Verzweigung in den 
Weg stellt, wird jedem Gleichheitszeichen der Gar ausgemacht.
Da es Regler im Allgemeinen genau wissen wollen, treten bedingte 
Verzweigungen gleich Rudelweise auf.

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.