Forum: Digitale Signalverarbeitung / DSP / Machine Learning Matlab/Simulink Embedded Code-Erstellung für Atmel AVR32


von Yavor T. (Firma: home) (yavor)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich bin neu im Mikrocontrollerprogrammieren und hätte ein Anliegen. Wäre 
für jede Hilfe dankbar. Die Situation ist folgende:

Ich habe einen Controller für einen Quadrocopter mit Simulink entworfen 
und möchte diesen nun auf einen Atmel AVR32 Prozessortyp 32UC3A0512-U 
implementieren.

Die C-Code für den Mikrocontroller ist bereits geschrieben und 
implementiert (nicht von mir) und läuft auf dem Board gut. Ich müsste 
nur den vorhandenen PID-Controller durch den von mir entworfenen 
Hinf-Controller ersetzen.

Der Hinf Controller ist ein State-Space Model und ist im Simulink durch 
ein LTI-System-Block (oder Subsystem-Block) dargestellt. Nun erstelle 
ich die C-Code durch Rechtsklick auf das Block -> C/C++ Code -> Build 
this Subsystem. Anschließend kopiere ich alle von Matlab erstellten .c 
und .h Dateien in meine Code und rufe in der main() die 
Subsystem_initialize(); und in der while(1)-Schleife die 
Subsystem_step(); Funktion auf.

Die Code wird erfolgreich kompiliert, kann aber auf den Controller nicht 
übertragen werden (ich bekomme einen Error, der meiner Meinung nach 
nicht viel Information enthält).

Meine Fragen: Kann das Problem an den von Matlab definierten Datentypen 
liegen (verstehe: Wortlänge für int, long etc.)? Ich habe nämlich 
gesehen, dass man im Konfigurationsfenster von Simulink für Embedded 
hardware die Number of bist / Largest atomic size vorgeben kann (s. 
Anhang). Ich habe dort als Hardware Atmel/AVR ausgewählt, aber ich habe 
im Internet gelesen, dass das nicht bei allen AVR Prozessoren gleich 
sind (einer musste für int 16 bits auswählen anstatt der von Matlab 
vorgegebenen 32).

Vielleicht liegt es ja gar nicht daran. Woran könnte es noch liegen?

Danke im Voraus für eure Hilfe.

: Verschoben durch User
von Rudolph (Gast)


Lesenswert?

Ein AVR32 ist kein AVR.
AVR32 ist 32 Bit, AVR 8 Bit.

von Alex E. (tecnologic) Benutzerseite


Lesenswert?

Moin,

Sind in dem Code spezial Funktionen wie sinus oder sqrt oder so drin?
Falls ja, musst du mal gucken ob es bereits ein fertiges Codereplacement 
Lib gibt. Nur not nimm das vom Cortex-M und mach n Wrapper der 
arm_sin_f32 oder so implementiert.


falls das reine Arithmetik ist setzte die HW mal auf Generic/32Bit.
Außerdem solltes du das Subsystem auf Atomic stellen und im Tab 
Codegeneration des Subsystems einen Modulnamen anlegen der Sprechend 
ist, Matlab ver wendet sonst immer sehr lange Namen.

Ist deine step-Funktion als void-void eingestellt, falls ja musst du 
noch die get und set Funktionen des Moduls verwenden. Also in jedem 
Zyklus set  der Eingänge und dann step und dann get der Ausgänge.

Hast du die Datentypen für dein Subsystem sauber festgelegt sonst baut 
die der Embedded Coder double code. Hat der AVR32 eine FPU? falls ja, 
solltest du alle Signale des Reglers auf single setzen und dann 
generieren. Dann wird der mit floats aufgebaut.

Außerdem wären deine Einstellungen bei Codegeneration und darunter 
Interface interessant um dir weiter zu helfen.



Wenn man sich mit der Codegenerierung beschäftigt dann kommt da 
mitlerweile sehr gut lesbarer und halbwegs effizienter C oder C++ Code 
raus.

Gruß

Tec

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.