Einlesen von internen Signalen eines Mikrocontrollers mit Matlab
[Kategorie:HowTo] Sie können Signale von einem Mikrocontroller an einen PC senden und diese dann dort weiterverarbeiten.
Senden von Signalen von einem Mikrocontroller an einen PC
Erster Schritt: Erstellen Sie in Ihrem Mikrocontroller-Programm eine Ausgabe an die RS232-Schnittstelle Ihres PCs
Ein Minimalbeispiel eines Arduino sieht z. B. so aus:
void setup()
{
Serial.begin(9600); // Serielle Kommunikation über COM-Port mit 9600bps
}
void loop()
{
// Variablen setzen
int Signal1;
int Signal2;
int Signal3;
// Variablen mit Inhalt füllen
// hier müssen jetzt Variablen eingelesen, ausgerechnet, etc. werden
// Variablen/Signale senden:
Serial.print(millis());
Serial.print(";");
Serial.print(Signal1);
Serial.print(";");
Serial.print(Signal2);
Serial.print(";");
Serial.print(Signal3);
Serial.println(",");
}
Zweiter Schritt: Lesen Sie die Signale der RS232-Schnittstelle mit Hilfe eines geeigneten Programms ein
- Geeignete Programme sind z. B. hterm u. a.
- Lesen Sie von dem COM-Port, an dem Ihr MIkrocontroller (ggf. über USB) hängt mit der richtigen Baudrate (wie oben im Mikrocontroller eingestellt) die Signale ein.
- Den COM-Port erfahren Sie am besten über den Gerätemanagers Ihres PCs, dort unter "Anschlüsse".
- Speichern Sie die Signale als Textdatei ab.
- Die Zeilen stellen die Zeitpunkte dar. Es empfiehlt sich, als erstes Signal "Signal1" die Zeit mitzuschicken, z. B. die Anzahl der vergangenen Millisekunden.
- Speichern Sie diesen per RS232-Schnittstelle eingelesenen Text mit Hilfe der o. g. Programme. Dieser sollte dann so aussehen:
Zeitstempel;Signal1;Signal2;Signal3, Zeitstempel;Signal1;Signal2;Signal3, Zeitstempel;Signal1;Signal2;Signal3,
Verarbeiten von Signalen aus einer Textdatei mit Hilfe von Matlab-Simulink
- Voraussetzung: Die Signale liegen in einer Textdatei in deroben beschriebenen Form vor.
- Speichern Sie den u. g. Quelltext von Matlab unter funktion_signale_aus_txtlog_einlesen.m!).
- Führen Sie die Funktion aus, z. B. mit Hilfe von
A = funktion_signale_aus_txtlog_einlesen('Testdatei.log');
- Nun liegt die Matrix A im Matlab-Workspace vor und kann weiterverarbeitet werden.
- Es empfiehlt sich ein Matlab-Skript, in dem die FUnktion mit obigem Funktionsaufruf gestartet und dann die Matrix A weiter verarbeitet wird, z. B. so:
% Leere Struktur erstellen
messung = [];
% Messsignale dort einfügen
messung.Zeit = A(:,1);
messung.Geschwindigkeit = A(:,2);
% Darstellen
figure
plot(messung.Zeit, messung.Geschwindigkeit)
box on, grid on
xlabel('t [s]')
ylabel('v [m/s]')
Quelltext
Die im Folgenden dargestelle Funktion können Sie auch Datei:Funktion signale aus txtlog einlesen.m hier herunterladen.
function [A] = funktion_signale_aus_txtlog_einlesen(Datei);
%%% Funktion zum Einlesen von Signalen aus einer Textdatei.
%%%
%%% Eingang: Name inkl. Pfad einer Textdatei
%%% Ausgang: Matrix mit allen eingelesen Signalen in den Spalten (je Zeile
%%% Text eine Zeile in der Matrix)
%%% Format der Textdatei:
%%% Zeitstempel;Signal1;Signal2;Signal3,
%%%
%%% also z. B.:
%%% 34368;652;27;0;0;0;286;-68391,
%%% 34386;652;27;0;0;0;285;-68392,
%%% 34420;652;27;0;0;0;283;-68394,
%%% 34453;652;27;0;0;0;282;-68395,
%%% 34487;652;27;0;0;0;284;-68393,
%% Datei öffnen und Daten einlesen
% öffnen
fid = fopen(Datei);
% Rohdaten einlesen
raw_data = fread(fid,'*char')';
if ~(strcmp(raw_data(1),';'))
raw_data=[';',raw_data];
end
%% Semicolons und Kommas finden
string_laenge = length(raw_data);
semicolon = strfind(raw_data,';');
komma = strfind(raw_data,',');
gesamt = sort([semicolon komma]);
n_spalten = round((length(gesamt)-1)/length(komma));
i_semicolon = 1;
i_komma = 1;
i_zeilen = 1;
i_gesamt = 1;
%% leere Matrix A erzeugen
A = [];
% Matrix A befüllen
try
while i_gesamt <= length(gesamt)
for i_spalten = 1:n_spalten
i_gesamt = i_gesamt+1;
if i_gesamt >1
if strcmp(raw_data(gesamt(i_gesamt-1)),',')
i_komma = i_komma +1;
end
end
try
A(i_komma,i_spalten) = str2num(raw_data(gesamt(i_gesamt-1)+1:gesamt(i_gesamt)-1));
catch
%fprintf(1, '%s: Catch-Zweig erreicht\n', mfilename);
end
end
end
catch
%fprintf(1, '%s: Catch-Zweig erreicht\n', mfilename);
end
%% Datei schließen
fclose(fid);