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