Hi, ist es möglich eine Regleung in Matlab/Simulink über die RS232-Schnittstelle mit der Hardware zu verbinden. (Also ohne extra Hardware) Messwert vom Sensor empfangen: Sensor ---> µC ---> RS232 ---> Matlab Sollwert senden: Matlab ---> RS232 ---> µC ---> Aktor und alles natürlich in Echtzeit. Braucht man hierfür vielleicht extra Toolboxen ? Gibts hierfür ein Beispiel Projekt? Oder ein empfehlenswertes Buch? Gruß
Man kann RS232 direkt unter Matlab nutzen: help serial Evtl musst du dir eigene Blöcke programmieren für die Kommunikation in Simulink oder m files in Matlab. Extra Toolboxen braucht man keine - falls du keine besondere für die Regelung brauchst. Tip: Nimm Embedded Matlab Blöcke in Simulink, die sind echtzeitfähig.
Hi, also ich hab es jetzt soweit hinbekommen dass ich senden kann. Irgnedwie ragiert aber mein Mikrocontroller viel zu langsam auf die Befehle. Ich hab gemerkt das Matlab die Daten irgendwie Puffert und dann Stück für Stück weitergibt. Also der Flashenhals ist (glaube ich zu mindest) bei Matlab. Breche ich die While-Schleiche ab bewegt sich mein Motor immer noch. Ich hab jetzt ca. 4 Stunden lang gesucht und bin nicht weitegekommen. Hier mein Skript: Eine Zahl wird im 10 ms Takt von 1 bis 1000 hoch und wieder runtergezählt und dabei jeweils einmal rausgesendet. Würde mich sehr über Hilfe freuen. --------------------------------------------------------------
1 | % Creating serial port object |
2 | serobjw = serial('/dev/cu.SERIAL1-SPP-1'); |
3 | |
4 | %Set connection properties |
5 | serobjw.Baudrate = 115200; % Set the baud rate at the specific value |
6 | set(serobjw, 'Parity', 'none') ; % Set parity as none |
7 | set(serobjw, 'Databits', 8) ; % set the number of data bits |
8 | set(serobjw, 'StopBits', 1) ; % set number of stop bits as 1 |
9 | set(serobjw, 'FlowContro', 'none') ; % set FlowContro to none |
10 | |
11 | set(serobjw, 'OutputBufferSize', 100) ; |
12 | |
13 | |
14 | fopen(serobjw) ; |
15 | |
16 | |
17 | |
18 | speed = 100; |
19 | tempCountUp = 1; |
20 | |
21 | tempStringPart1 = '['; |
22 | tempStringPart2 = ']'; |
23 | |
24 | |
25 | |
26 | while (1) |
27 | |
28 | cString = sprintf('%s%05.0f%s', tempStringPart1,speed,tempStringPart2); |
29 | |
30 | if (strcmp(serobjw.TransferStatus,'write') == 0) |
31 | fprintf(serobjw,cString,'async'); |
32 | end
|
33 | |
34 | if(speed == 1) |
35 | tempCountUp = 1; |
36 | end
|
37 | |
38 | if(speed == 1000) |
39 | tempCountUp = 0; |
40 | end
|
41 | |
42 | if(tempCountUp == 1) |
43 | speed = speed + 1; |
44 | end
|
45 | |
46 | if(tempCountUp == 0) |
47 | speed = speed - 1; |
48 | end
|
49 | |
50 | cString
|
51 | |
52 | pause(0.01); |
53 | |
54 | end
|
--------------------------------------------------------------
Ja Matlab puffert zwischen hier maximal 100 Bytes. Also bei der Geschwindigkeit ca 8 ms. Dies kann man mit 'sync' anstatt 'asyns' abschalten - dann wartet Matlab bis der Puffer leer ist. Je nach Betriebssystem wird evtl auch ein Puffer bei der Schnittstelle selber eingebaut. Man kann auch mit Matlab Pufferbelegung nachschauen serobjw.BytesToOutput oder ähnlich. Versuche mal fwrite um Bytes anstatt eines Strings zu senden. Evtl macht auch die "Echtzeitfähigkeit" von Matlab oder dem Betriebssystem Probleme.
Das mit dem 'async' und 'sync' habe ich schon probiert, aber die Geschwindigkeit ist die gleiche. Es liegt ganz sicher am Puffer. Nur WO soll ich da nach schauen?
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.