Forum: Digitale Signalverarbeitung / DSP / Machine Learning Hardware in the Loop mit Matlab/SIMULINK und RS232


von Simon (Gast)


Lesenswert?

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ß

von pomes (Gast)


Lesenswert?

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.

von Simon (Gast)


Lesenswert?

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
--------------------------------------------------------------

von dassas (Gast)


Lesenswert?

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.

von Simon (Gast)


Lesenswert?

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