Hallo zusammen, ich bin nun durch etliche Foren gewandert und keiner konnte mir bisher richtig helfen, daher erst einmal bitte ein kein "Anschiss" wenn ihr andere Beiträge von mir in anderen Foren findet... Im Arduino und Matlab-Forum habe ich noch nicht die antwort erhalten die ich suche bzw. welche ich brauche und ich komme alleine einfach nicht mehr weiter.... Daher nun die Frage an euch kennt sich jemand mit S-Functions und Arduino in Simulink aus? Wenn ja wie kann ich mein Arduino in Programm richtig einbinden in meinen S-Function-Builder? Habe mich an ein Youtube-Video gehalten und dies ohne Erfolg... habe auch andere Varianten durchprobiert aber alles ohne Erfolg wie gesagt.... Im Anhang findet ihr meinen Arduino Code. Was ich bisher gemacht hab findet ihr in der Textdatei... Wie gesagt, ich entschuldige mich im Voraus für das Crossposting und hoffe auf Hilfe von euch :)
> daher erst einmal bitte ein kein "Anschiss" wenn ihr > andere Beiträge von mir in anderen Foren findet... > Wie gesagt, ich entschuldige mich im Voraus für das Crossposting und > hoffe auf Hilfe von euch :) Mein Gott, Du bist nicht unterwürfig genug.
Ähm : was soll das Programm machen - und was macht es stattdessen ? Wo kommt Matlab in's Spiel und was soll das machen ?
Der Nächste bitte!! schrieb: >> daher erst einmal bitte ein kein "Anschiss" wenn ihr >> andere Beiträge von mir in anderen Foren findet... >> Wie gesagt, ich entschuldige mich im Voraus für das Crossposting und >> hoffe auf Hilfe von euch :) > > Mein Gott, Du bist nicht unterwürfig genug. Es sind immer alle direkt auf 180 wenn sie rausfinden die Frage wurde schon mehrfach gestellt in Foren.... fop schrieb: > Ähm : was soll das Programm machen - und was macht es stattdessen > ? > Wo kommt Matlab in's Spiel und was soll das machen ? Das Programm soll lediglich meine Temperaturen messen und da meine Regelung in Simulink schon steht habe ich vorgehabt die Temperaturmessung auch in Simulink zu machen... Da es keinen Block und keine library in den Support Packages gibt, muss ich mir einen eigenen Block "basteln", habe dies auch schon gemacht, doch ich scheitere immer wieder mit dem Mist... habe meine Datei im Anhang als zip
Tobi A. schrieb: > Das Programm soll lediglich meine Temperaturen messen und da meine > Regelung in Simulink schon steht habe ich vorgehabt die > Temperaturmessung auch in Simulink zu machen... Ob man mit Simulink AVR-Code erzeugen kann, da hab ich so meine Zweifel. Ich lese da nur was von FPGAs. Ich würde die Reglung direkt in C programmieren.
Peter D. schrieb: > Tobi A. schrieb: >> Das Programm soll lediglich meine Temperaturen messen und da meine >> Regelung in Simulink schon steht habe ich vorgehabt die >> Temperaturmessung auch in Simulink zu machen... > > Ob man mit Simulink AVR-Code erzeugen kann, da hab ich so meine Zweifel. > Ich lese da nur was von FPGAs. > Ich würde die Reglung direkt in C programmieren. Also die Beispiele aus den Support-Packages gehen ohne Probleme^^ mein Beispiel auch nur dieses erzeugen des Blocks nervt mich lediglich noch... Verstehe ich dich richtig das ich den Arduino-Code den ich schon habe in C umwandeln sollte und dann einlesen in meinen eigenen Block oder wie meinst du das? :)
Die Arduino-Toolbox für Simulink habe ich noch nie ausprobiert. Die Matlab-Arduino-Toolbox war allerdings gut durchdacht. Allen Unkenrufen zum Trotz ist es ein wunderbares Werkzeug, um einen per SPI oder I2C angeschlossenen Sensor oder Aktuator interaktiv zu testen, bevor man das Programm für den µC entwickelt. Es wird kein Arduino-Code erzeugt, sondern auf den Arduino wird eine Firmware geflasht, daß dieser als I/O-Karte unter Matlab/Simulink arbeitet. Wenn ich das richtig verstehe, willst Du Sensordaten von Deinem per SPI am Arduino angeschlossenen Sensor auslesen. Unter Matlab würde ich den Arduino mit SPI-Unterstützung initialisieren, wie es auch in der Toolbox-Doku beschrieben ist, und die empfangenen Bytes unter Matlab mit den bitshift-Befehlen auseinanderfrickeln, bis sich die realen Daten ergeben. Bitoperationen sind unter Matlab immer etwas mühsam. Unter Simulink wird es ähnlich funktionieren, wobei das Auseinanderfrickeln der Datenworte wahrscheinlich noch etwas komplizierter als unter Matlab sein wird. Notfalls machst Du die Arduino-Geschichte erst unter Matlab und bindest dann die M-Funktion in Simulink ein. Was willst Du mit der S-Funktion bezwecken?
:
Bearbeitet durch User
Tobi A. schrieb: > Verstehe ich dich richtig das ich den Arduino-Code den ich schon habe in > C umwandeln sollte und dann einlesen in meinen eigenen Block oder wie > meinst du das? :) Ich benutze kein Simulink. Ich schreibe die Regelung als C-Programm für den AVR. Also EVA-Prinzip: ADC einlesen, Daten verarbeiten (Regelung), DAC ausgeben. Die Regelung erfolgt in float. Die PID-Parameter schicke ich z.B. über die UART an den AVR, der sie im EEPROM ablegt. Dadurch kann man sie leicht anpassen, bis die Regelung stabil arbeitet. Für Temperaturregelungen reicht die Rechenleistung des AVR dicke aus.
Walter T. schrieb: > Wenn ich das richtig verstehe, willst Du Sensordaten von Deinem per SPI > am Arduino angeschlossenen Sensor auslesen. richtig :) > Unter Matlab würde ich den Arduino mit SPI-Unterstützung initialisieren, > wie es auch in der Toolbox-Doku beschrieben ist, und die empfangenen > Bytes unter Matlab mit den bitshift-Befehlen auseinanderfrickeln, bis > sich die realen Daten ergeben. Bitoperationen sind unter Matlab immer > etwas mühsam. > > Unter Simulink wird es ähnlich funktionieren, wobei das > Auseinanderfrickeln der Datenworte wahrscheinlich noch etwas > komplizierter als unter Matlab sein wird. Notfalls machst Du die > Arduino-Geschichte erst unter Matlab und bindest dann die M-Funktion in > Simulink ein. > > Was willst Du mit der S-Funktion bezwecken? da ich die SPI-Bibliothek bzw. die Blöcke nicht gut finde und auch nicht damit zu Recht komme, wollte ich meinen Code darin einbinden und dann einfach verwenden, leichter gesagt als getan wie sich herausgestellt hat bisher... Also meinen oben angehängten Code in einen Matlab-code umwandeln der mit der SPI-Bib des Support-Packages conform geht und diesen code dann in den M-function-Block einfügen? (wenn das wirklich so klappen kann ärgere ich mich schwarz über meine eigene Unfähigkeit...)
Erzähl dochmal, was das ganze überhaupt werden soll. Für mich klingt der riesen Aufwand nur für ne Temperaturregelung hoffnungslos oversized. Matlab ist doch eher ein Tool für Matrizenrechnung. Und auf welchem Target soll das überhaupt laufen oder soll etwa der PC die ganze Zeit eingeschaltet bleiben müssen.
Peter D. schrieb: > Erzähl dochmal, was das ganze überhaupt werden soll. > Für mich klingt der riesen Aufwand nur für ne Temperaturregelung > hoffnungslos oversized. Matlab ist doch eher ein Tool für > Matrizenrechnung. > Und auf welchem Target soll das überhaupt laufen oder soll etwa der PC > die ganze Zeit eingeschaltet bleiben müssen. Einfach nur zur Temperaturüberwachung an einem Dummy in einem Windkanal. Und ja der PC/Laptop bleibt die ganze während den Messungen an. Gemessen und geregelt werden Lesitungen von Heizelementen. Die Temperatur hat keinerlei Einfluss auf die Regelung sie dient nur als Zusatzinfo...
Dann würde ich Simulink komplett außen vorlassen und die Daten mit Zeitstempel in Matlab einlesen.
Habs hinbekommen nach zwei langen Nächten!! Wenn sich jmd für die Lösung interessiert kann er mich gerne kontaktieren.
Hi Tobi, ich hoffe du bist immernoch aktiv hier im Forum Könntest du mir bitte bei dem selben Problem, dass du hattest weiterhelfen? Würde mich sehr über eine Antwort freuen. Vielen Dank
hi Tobi, danke für die schnelle Antwort. Kurz zu meine Projekt. Ich bin gerade dabei ein Programm in Simulink für eine Klimakammer zu schreiben und möchte mit diesen Temperatursensoren die unterschiedlichen Temperaturen auslesen , damit ich im Notfall alles ausschalten kann. Mit der Arduino IDE Software hab ich die Auslesung schonmal hinbekommen. Da ich aber mit Simulink das Programm schon geschrieben/gebaut habe benötige ich eben auch diese Infos im Simulink. Ich habe mich mal ein wenig eingelesen wie man das mit dem S Builder auch realisieren kann. Deswegen bin auch auf diesen und auf anderen Foren auf dich aufmerksam geworden. Aber jetzt zu meinem Problem, dass ich einfach nicht weiterkomme.. Bekomme beim Compilieren immer nur fehlermeldungen.. Wäre es vielleicht möglich, dass du diesen SBlock mit mir teilst? Laut deines letzten Kommentares hast du es ja hinbekommen. Danke schonmal im vorraus.
Ich hoffe , ich hab dich mal jetzt nicht irgendwie verärgert... weil ich nichts zurück bekomme... Wäre es dennoch möglich, dass du mir die Datei zukommen lässt? ich versuche es jetzt schon seit geschlagenen 4 tagen und ich bekomme das einfach nicht zum laufen. Würdest mir wirklich weiterhelfen. Danke
welche Art von Fehlermedlung kriegst du? Welchen Teil des Arduino-Codes schreibst du in welchen Reiter im S-Builder? Ich bin nur nicht immer aktiv hier... wenn es mal dauert zwecks antwort ist es nicht weil ich mich ärgere ;)
also mein tatsächlicher Fortschritt ist ähnlich zu deiner hochgeladenen Version, da alles anderen Anläufe auch gescheitert sind.. Also beim Raster Libaries ist das drin: #include <math.h> #ifndef MATLAB_MEX_FILE #define Arduino 100 #define NOP _asm__ __volatile_ ("nop\n\t") #include "Arduino.h" #include "spi.h" #include "spi.cpp" const byte MAX1_CS = 11; float MAX_6675(int CS) { unsigned int KTemp = 0; float Celius = 0; digitalWrite(CS, LOW); NOP; // delay 62.5ns on a 16MHz AtMega, 100ns erforderlich NOP; byte MSB = SPI.transfer(0); // höherwertiges Byte einlesen, D15 ... D8 byte LSB = SPI.transfer(0); // niederwertiges Byte einlesen, D7 ... D0 digitalWrite(CS, HIGH); KTemp = MSB << 8; KTemp = KTemp | LSB; KTemp = KTemp >> 3; Celius = (float) (KTemp * 0.25); return Celius; } #endif bei outputs das /* This sample sets the output equal to the input y0[0] = u0[0]; For complex signals use: y0[0].re = u0[0].re; y0[0].im = u0[0].im; y1[0].re = u1[0].re; y1[0].im = u1[0].im; */ if(xD[0]==1) { #ifndef MATLAB_MEX_FILE y0[0]((MAX6675(MAX1_CS),2)); #endif } und das bei updates /* * Code example * xD[0] = u0[0]; */ if (xD[0] !=1) { #ifndef MATLAB_MEX_FILE SPI.begin(); pinMode(10, OUTPUT); // wegen SPI Funktion notwendig digitalWrite(MAX1_CS, HIGH); // CS High Pegel // digitalWrite(MAX2_CS, HIGH); // digitalWrite(MAX3_CS, HIGH); pinMode(MAX1_CS, OUTPUT); // CS Pin Ausgang // pinMode(MAX2_CS, OUTPUT); // pinMode(MAX3_CS, OUTPUT); #endif xD[0]=1; } Funktioniert das so wie ich das bei simulink zusammengeschlossen habe , oder muss ich noch für SO Cs und SCK noch ein paar digital inputs davorstellen? Die Fehlermeldung, die ich bekomme ist diese: search TEMP_SPI Simulation 4 1 1 Clear 08:55 PM Elapsed: 1:12 min ### Starting build procedure for model: TEMP_SPI ### Generating code and artifacts to 'Model specific' folder structure Code Generation 2 1 Elapsed: 47 sec ### Generating code into build folder: C:\Users\Haral\Desktop\SPI_TEMP\TEMP_SPI_ert_rtw Source 'TEMP_SPI/S-Function Builder' specifies that its sample time (-1) is back-inherited. You should explicitly specify the sample time of sources. You can disable this diagnostic by setting the 'Source block specifies -1 sample time' diagnostic to 'none' in the Sample Time group on the Diagnostics pane of the Configuration Parameters dialog box. Component:Simulink | Category:Block warning ### Invoking Target Language Compiler on TEMP_SPI.rtw ### Using System Target File: C:\Program Files\MATLAB\R2018b\rtw\c\ert\ert.tlc ### Loading TLC function libraries ...... ### Initial pass through model to cache user defined code ### Caching model source code .......................... ### Writing header file TEMP_SPI_types.h . ### Writing header file TEMP_SPI.h ### Writing header file rtwtypes.h ### Writing header file multiword_types.h ### Writing source file TEMP_SPI.c ### Writing header file TEMP_SPI_private.h ### Writing header file rtmodel.h . ### Writing source file ert_main.c ### TLC code generation complete. ### Generating TLC interface API. . ### Creating data type transition file TEMP_SPI_dt.h .### Evaluating PostCodeGenCommand specified in the model ### Using toolchain: MinGW64 | gmake (64-bit Windows) ### Creating 'C:\Users\Haral\Desktop\SPI_TEMP\TEMP_SPI_ert_rtw\TEMP_SPI.mk' ... ### Building 'TEMP_SPI': "C:\PROGRA~1\MATLAB\R2018b\bin\win64\gmake" -f TEMP_SPI.mk all C:\Users\Haral\Desktop\SPI_TEMP\TEMP_SPI_ert_rtw>cd . C:\Users\Haral\Desktop\SPI_TEMP\TEMP_SPI_ert_rtw>if "" == "" ("C:\PROGRA~1\MATLAB\R2018b\bin\win64\gmake" -f TEMP_SPI.mk all ) else ("C:\PROGRA~1\MATLAB\R2018b\bin\win64\gmake" -f TEMP_SPI.mk ) "C:\PROGRA~3\MATLAB\SUPPOR~1\R2018b\3P778C~1.INS\MINGW_~1.INS\bin/gcc" -c -ansi -pedantic -Wno-long-long -fwrapv -m64 -O3 -fno-loop-optimize -fno-aggressive-loop-optimizations -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR -D_RUNONTARGETHARDWARE_BUILD_ -D_ROTH_MEGA2560_ -DMODEL=TEMP_SPI -DNUMST=1 -DNCSTATES=0 -DHAVESTDIO -DMODEL_HAS_DYNAMICALLY_LOADED_SFCNS=0 -DON_TARGET_WAIT_FOR_START=1 -DCLASSIC_INTERFACE=0 -DALLOCATIONFCN=0 -DTID01EQ=0 -DEXT_MODE=1 -DONESTEPFCN=1 -DTERMFCN=1 -DMULTI_INSTANCE_CODE=0 -DINTEGER_CODE=0 -DMT=0 -DEXIT_FAILURE=1 -DEXTMODE_DISABLEPRINTF -DEXTMODE_DISABLETESTING -DEXTMODE_DISABLE_ARGS_PROCESSING=1 -DSTACK_SIZE=64 -D__MW_TARGET_USE_HARDWARE_RESOURCES_H__ -DRT -DMW_TIMERID=5 -DMW_PRESCALAR=1024 -DMW_TIMERCOUNT=62411 -DMW_SCHEDULERCOUNTER=1 -D_RTT_BAUDRATE_SERIAL0_=9600 -D_RTT_BAUDRATE_SERIAL1_=9600 -D_RTT_BAUDRATE_SERIAL2_=9600 -D_RTT_BAUDRATE_SERIAL3_=9600 -D_RTT_ANALOG_REF_=0 -DCLASSIC_INTERFACE=0 -DALLOCATIONFCN=0 -DEXT_MODE=1 -DONESTEPFCN=1 -DTERMFCN=1 -DMULTI_INSTANCE_CODE=0 -DINTEGER_CODE=0 -DMT=0 -DTID01EQ=0 -DON_TARGET_WAIT_FOR_START=1 -DEXIT_FAILURE=1 -DEXTMODE_DISABLEPRINTF -DEXTMODE_DISABLETESTING -DEXTMODE_DISABLE_ARGS_PROCESSING=1 -DSTACK_SIZE=64 -DRT -DMODEL=TEMP_SPI -DNUMST=1 -DNCSTATES=0 -DHAVESTDIO -DMODEL_HAS_DYNAMICALLY_LOADED_SFCNS=0 -IC:/Users/Haral/Desktop/SPI_TEMP -IC:/Users/Haral/Desktop/SPI_TEMP/TEMP_SPI_ert_rtw -IC:/PROGRA~1/MATLAB/R2018b/extern/include -IC:/PROGRA~1/MATLAB/R2018b/simulink/include -IC:/PROGRA~1/MATLAB/R2018b/rtw/c/src -IC:/PROGRA~1/MATLAB/R2018b/rtw/c/src/ext_mode/common -IC:/PROGRA~1/MATLAB/R2018b/rtw/c/ert -IC:/PROGRA~1/MATLAB/R2018b/rtw/c/src/rtiostream/rtiostreamtcpip -IC:/PROGRA~1/MATLAB/R2018b/toolbox/coder/rtiostream/src/utils -I/hardware/arduino/avr/cores/arduino -I/hardware/arduino/avr/variants/mega -IC:/PROGRA~3/MATLAB/SUPPOR~1/R2018b/toolbox/target/SUPPOR~1/ARDUIN~1/in clude -IC:/PROGRA~3/MATLAB/SUPPOR~1/R2018b/toolbox/target/SUPPOR~1/ARDUIN~1/SC HEDU~1/include -IC:/PROGRA~3/MATLAB/SUPPOR~1/R2018b/toolbox/target/SUPPOR~1/ARDUIN~2/in clude -I/hardware/tools/avr/avr/include/avr -IC:/PROGRA~3/MATLAB/SUPPOR~1/R2018b/toolbox/target/shared/EXTERN~1/incl ude @TEMP_SPI_comp.rsp -o "TEMP_SPI.obj" "TEMP_SPI.c" gcc: error: unrecognized command line option '-mmcu=atmega2560' gmake: *** [TEMP_SPI.obj] Error 1 C:\Users\Haral\Desktop\SPI_TEMP\TEMP_SPI_ert_rtw>echo The make command returned an error of 2 The make command returned an error of 2 C:\Users\Haral\Desktop\SPI_TEMP\TEMP_SPI_ert_rtw>An_error_occurred_durin g_the_call_to_make Der Befehl "An_error_occurred_during_the_call_to_make" ist entweder falsch geschrieben oder konnte nicht gefunden werden. ### Creating HTML report file TEMP_SPI_codegen_rpt.html ### Build procedure for model: 'TEMP_SPI' aborted due to an error. Error(s) encountered while building "TEMP_SPI": ### Failed to generate all binary outputs. Component:Simulink | Category:Model error Ich hoffe du kannst mir da weiterhelfen. Grüße Harry. Um mit dir darüber besser zu kommunizieren wäre meine Email. harald.heitner@study.hs-duesseldorf.de oder ist facebook oder instagramm auch ok? Danke
kriegst morgen eine Antwort von mir bin morgen erst wieder zu hause... habs aber kurz überflogen das ganze und sehe du hast keinen Eingang im S-Builder-Block... wie viele SPI-Bausteine hast du und welchen Arduino? Wie gesagt mehr kann ich erst morgen Abend sagen
Also ich benutze für mein Programm den Arduino Mega 2560. Habe einen pt1000 dran und der läuft in den MAX6675 mit 5 Ausgängen. einmal 5v(VCC) , GND , SCK, CS, SO. soviel ich rausbekommen habe brauchen die alle uint8, d.h. ich muss denen noch alle einen Eingang verpasssen. Ok vielen Dank, dann warte ich auf deine Antwort morgen abend. Wenn ichs nicht so hinbekomme, würde ich dir auch gerne dein Programm abkaufen für diesen Max6675. Dankeschön Gruß harry
Hast du nur einen SPI-Baustein oder mehrere? weil ich habe damals 12 Stück gehabt und aus Erfahrung kann ich sagen es sollten maximal 8-10 Bausteine sein, je nachdem was noch geplant ist, da sonst Laufzeitprobleme entstehen ... Ich will versuchen dir morgen Abend das ganze so zu erklären, dass du keine Lösung "kaufen" musst, denn davon hatte ich im Endeffekt mehr Lerneffekt als wenn ich etwas fertiges benutzt hätte, vor allem da ich gefühlt der erste war der sowas gemacht hat^^
Ich habe genau 2 pt1000 mit 2 max6675. Also möchte ich auch nur 2 unterschiedliche Temperaturen auslesen. Das wäre super nett, wenn das klappen würde. Learning by doing :). Da hast du sicherlich recht. Habe den Rest des Programms schon geschrieben , und das funktioniert auch einwandfrei. Nur bei diesen Thermoelementen komme ich einfach nicht drauf :). Könnten wir uns zur erklärung irgendwie anders unterhalten in nem messenger oder ähnliches?ß Schönen Start in den Montag. Gruß Harry
> Könnten wir uns zur erklärung irgendwie anders unterhalten in nem > messenger oder ähnliches?ß Hauptsache der Rest hat nichts von diesem Thread?
Hallo zusammen, gibt es eine Lösung für das Problem? Stehe gerade vor der gleichen Herausforderung und bekomme im Simulink auch immer wieder einen "Model-Error" bei der Verwendung der s-function Grüße Ludwig
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.