Forum: Mikrocontroller und Digitale Elektronik Kleines Simulink-Modell auf µC flashen


von Patrick (Gast)


Lesenswert?

Hallo leute,

ich habe im Rahmen einer Projektarbeit ein Versuchsstand aufgebaut, mit 
der eine Kugel im Magnetfeld schwebt, ähnlich wie hier:

http://www.bis0uhr.de/index.htm?http://www.bis0uhr.de/projekte/schwebekugel/index.html%99http://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCEQFjAA&url=http%3A%2F%2Fwww.bis0uhr.de%2Fprojekte%2Fschwebekugel%2Findex.html&ei=ohMHVYK8HYL5ygOZ_4HgBg&usg=AFQjCNHHvmC3aky-ANSuJpwUvpDlH538wg&bvm=bv.88198703,d.bGQ


Das ganze muss gereglt betrieben werden, da sonst das System instabil 
ist.

Den Regler entwerfe ich in Simulink, als Board nehme ich einen einfachen 
Arduino-Uno. Nun meine Frage:

Woher weiß ich bzw. wie kann ich überprüfen, ob das Simulink-Modell von 
der Speichergröße auf mein UNO Board passt ? Und wie sieht es mit der 
Geschwindigkeit aus, reichen die 16MHz vom Uno für die Regelung aus ?

Ich bin kein µC-Fachmann, daher bitte entschuldigen, wenn die Fragen 
vermeintlich einfach sidn.

von Christian K. (the_kirsch)


Angehängte Dateien:

Lesenswert?

Ich hatte auch mal einen Magnetschweberegler mit einem ATmega 
realisiert.

Das war bei mir ein einfacher PID-Regelstrecke.
Input ADC, Output PWM und UI mit Taster und Display

Device: atmega644p

Program:    5298 bytes (8.1% Full)
(.text + .data + .bootloader)

Data:        294 bytes (7.2% Full)
(.data + .bss + .noinit)

von Patrick (Gast)


Lesenswert?

Christian K. schrieb:
> Ich hatte auch mal einen Magnetschweberegler mit einem ATmega
> realisiert.
>
> Das war bei mir ein einfacher PID-Regelstrecke.
> Input ADC, Output PWM und UI mit Taster und Display
>
> Device: atmega644p
>
> Program:    5298 bytes (8.1% Full)
> (.text + .data + .bootloader)
>
> Data:        294 bytes (7.2% Full)
> (.data + .bss + .noinit)

Danke für die Antwort.

Nur wo bekomme ich aus dem Simulink Modell genau diese Daten her ?

Wie viel Speicherplatz das ganze mich kostet und ob die Taktfrequenz 
dafür reicht ?

von Christian K. (the_kirsch)


Lesenswert?

Ich weiß ja nicht was du in Simulink gemacht hast.

Schaltung, Mathematische Formel, Regelstrecke?



Das musst du dann in selbst in C Implementieren. Nach dem Compilerlauf 
siehst du dann wie groß dein Programm geworden ist.

von Tilo (Gast)


Lesenswert?

Welche Toolboxen hast du zur Verfügung?
Es gibt für Matlab/Simulink Toolboxen, die tatsächlich das Modell als 
fertigen Code in den Controller packen können.

Das geht aber nut sehr bedingt mit einer handvoll Boards, glaube nicht, 
dass das Arduino-Uno dabei ist.

Es gibt auch "einfachere" Toolboxen, die nur den eigentlichen Regler in 
C generieren. Den Code für Sensor/Aktor des uC musst du dann noch selbst 
hinzufügen.

Ein einfacher PID braucht nicht viel Ressourcen.

von Klaus R. (klaus2)


Lesenswert?

...ich vermute auch kaum das Atmel Teil des RTW Codegen ist. Wenn, wäre 
es danach ja nur noch ein kleiner Sprung.

Klaus.

von Patrick (Gast)


Lesenswert?

Tilo L. schrieb:
> Welche Toolboxen hast du zur Verfügung?
> Es gibt für Matlab/Simulink Toolboxen, die tatsächlich das Modell als
> fertigen Code in den Controller packen können.
>
> Das geht aber nut sehr bedingt mit einer handvoll Boards, glaube nicht,
> dass das Arduino-Uno dabei ist.

Doch ist dabei ! Habe auch schon einfache Sachen mit Arduino + Simulink 
gemacht.

Ich würde ja gerne wissen, wie viel Speicherplatz und Rechenkapazität.

von Narfie (Gast)


Lesenswert?

Code generieren und übersetzen, ich wüsste nicht, dass es anders ginge. 
Aber meine Erfahrungen mit Simulink sind da begrenzt.

von Achim S. (Gast)


Lesenswert?

Patrick schrieb:
> Doch ist dabei ! Habe auch schon einfache Sachen mit Arduino + Simulink
> gemacht.
>
> Ich würde ja gerne wissen, wie viel Speicherplatz und Rechenkapazität.

Ich habe es nie selber verwendet, aber schon mal jemanden beraten, der 
an so was gearbeitet hat (Simulink auf Arduino Mega 2560). Mein Eindruck 
war damals (ohne Anspruch auf Allgemeingültigkeit): Performance bzw. 
Ressourcenverbrauch waren verglichen mit einer "direkten" 
µC-Programmierung in C irgendwo zwischen Faktor 2 und Faktor 200 
schlechter.

Das ist natürlich ein ziemlich grober Rahmen. Es hing stark davon ab, 
wie tief man in die gesamte Code-Erzeugung für den µC eingestiegen ist 
(als Zwischenschritt der Toolchain wird C-Code erzeugt, den man sich 
anschauen kann, um Performancebremsen zu finden).

Es hat die Sache z.B. schon deutlich beschleunigt, wenn man dem System 
abgewöhnte, jeden doofen Zähler in Gleitkommarithmetik zu rechnen (was 
damals zu Beginn der Default war). Wenn man sein System erst mal im 
Griff hat, kommen solche Anfängerfehler hoffentlich nicht mehr vor.

Für eine konkrete Aufgabenstellung kann ich auch nur empfehlen: einfach 
mal implementieren, ausprobieren und analysieren.

von Tilo L. (Gast)


Lesenswert?

Patrick schrieb:
> Ich würde ja gerne wissen, wie viel Speicherplatz und Rechenkapazität.

Das wird dir keiner sagen können. Du wirst den Code generieren müssen 
und dann schauen, was raus kommt. Wenn der uC dabei ist müsste der 
Compiler einen Fehler ausgeben, wenn die Ressourcen nicht mehr reichen.

von Patrick (Gast)


Lesenswert?

Ok, ich verstehe.

Ich dachte vll. kann man sehen, was das Effektiv an Speicherkapazität 
kosten würde, wenn man solch ein Simulink-Modell direkt auf den µC 
flashen würde.

Wie siehts mit der Taktfrequenz aus ? Wenn 16 MHz angegeben sind, woher 
weiß ich, ob meine µC-Geschwindigkeit für eine einfache Regelung 
ausreicht ?

von Tilo L. (Gast)


Lesenswert?

Das sollte in der Dokumentation zur Toolbox stehen.
Ansonsten in deinem Fall:
Laufen lassen und schauen wie stabil die Regelung ist.
Eventuell kannst du am Ausgang ein Oszi anschließen und schauen, wie 
schnell sich die Werte ändern.
Den Wert kannst du dann mit der Frequenz des Reglers aus dem Modell 
vergleichen.

Alternativ wäre ein Zwischenschritt möglich, schau dir den C bzw. 
ASM-Code an und zähle die Taktschritte.

von Chris S. (schris)


Lesenswert?

Je nach toolchain gibt es einen entsprechenden Befehlt, z.B. :
avr-size --mcu=atmega328p -C main.elf

Hier ein Beispiel der Ausgabe:
AVR Memory Usage
----------------
Device: atmega328p

Program:   29290 bytes (89.4% Full)
(.text + .data + .bootloader)

Data:       1643 bytes (80.2% Full)
(.data + .bss + .noinit)

von Frank (Gast)


Lesenswert?

was problemlos geht ist das Modell mit dSpace Targetlink aus Simulink 
heraus zu generieren. Das läuft auch problemlos auf nem mega2560. 
Codequalität und Effizienz sind nicht schlecht für einen Generator. Dazu 
braucht es natürlich zwingend ein Bios auf dem mega. Das lässt sich zwar 
auch als Customcode modellbasiert machen, ist aber eine echte 
Quälerei...

Gruss
Frank

von Matthias (Gast)


Lesenswert?

Der Regler ist ja für eine gewisse Abtastrate ausgelegt.

Sagen wir Abtastzeit 400 Hz. Wieviele Befehle schafft dein Controller in 
der Zeitspanne?

Nehmen wir grob an, dass jeder Befehl einen Takt langbraucht:

A: 1/400 [s] / (1/16M) [n/s] = 40.000 Befehle

Wenn dein Regelalgorithmus weniger als 40.000 Befehle braucht, dann 
würde es sich ausgehen bei einer Abtastzeit vom 1/400 s.

Es kann Dir niemand ohne den generierten Algorithmus von Simulink sagen, 
ob es sich ausgeht oder nicht.

von Patrick (Gast)


Lesenswert?

Erst mal Danke alle für eure Antworten.

Kurze Frage:
Wenn ich in Arduino ein Programm kompiliere, bekomme ich folgendes 
angezeigt:
Binäre Sketchgröße: 1.636 Bytes (von einem Maximum von 258.048 Bytes)

Was passiert, wenn das maximum erreicht ist ? Passiert irgendwas 
überhaupt oder wird das Programm nicht auf den µC geladen?

Matthias schrieb:
> Sagen wir Abtastzeit 400 Hz. Wieviele Befehle schafft dein Controller in
> der Zeitspanne?

Matthias schrieb:
> Nehmen wir grob an, dass jeder Befehl einen Takt langbraucht:
>
> A: 1/400 [s] / (1/16M) [n/s] = 40.000 Befehle

Die Rechnung versteh ich nicht ganz. Geht das vll. bitte ausführlicher ?

von Matthias (Gast)


Lesenswert?

Dein digitaler Regler ist für von eine Abtastrate ausgelegt worden von 
dir.

Ich habe da mal jetzt dafür 400Hz angenommen. Das heißt, dass dein 
Regelalgorithmus maximal 1/400 Sekunden (= 2500µs) brauchen darf.

Wenn man davon ausgeht, dass jede Instruktion deines Kontrollers einen 
Takt braucht und dieser 16MHz beträgt, dann wird alle 62,5 ns 
(=1/f_cpu=1/16M) ein Befehl abgearbeitet. Dein Regler muss aber alle 
2500µs einen neuen Stellwert liefern...

Das ergibt dann eben maximal 40.000 Befehle, die dein µC schafft.
Überspitzt gesagt: Nur weiß keiner ob du einen Regler im Zustandsraum 
mit Beobachter oder einen Zweipunktregler gebaut hast.

D.h. entweder du zählst die Instruktionen deines generierten Codes oder 
du toggelst einen Pin am Begin des Algorithmus und misst mit dem oszi.

von Patrick (Gast)


Lesenswert?

lieber Mathias, danke für deine Antwort ! War sehr hilfreich !

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.