Einlesen von internen Signalen eines Mikrocontrollers mit Matlab: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Keine Bearbeitungszusammenfassung |
|||
(4 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 2: | Zeile 2: | ||
= Senden von Signalen von einem Mikrocontroller an einen PC = | = 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: | |||
<code type="matlab"> | <code type="matlab"> | ||
void setup() | void setup() | ||
Zeile 32: | Zeile 34: | ||
== Zweiter Schritt: Lesen Sie die Signale der RS232-Schnittstelle mit Hilfe eines geeigneten Programms ein == | |||
# Geeignete Programme sind z. B. [http://www.der-hammer.info/terminal/ 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: | # 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, | ||
Zeile 51: | Zeile 52: | ||
# Nun liegt die Matrix A im Matlab-Workspace vor und kann weiterverarbeitet werden. | # 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: | # 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: | ||
<source line lang="matlab" style="font-size:medium"> | <source line lang="matlab" style="font-size:medium"> | ||
% Leere Struktur erstellen | % Leere Struktur erstellen | ||
Zeile 69: | Zeile 71: | ||
== Quelltext == | == Quelltext == | ||
Die im Folgenden dargestelle Funktion können Sie auch [[Datei:Funktion_signale_aus_txtlog_einlesen.m]] hier herunterladen. | |||
<source line lang="matlab" style="font-size:medium"> | <source line lang="matlab" style="font-size:medium"> | ||
function [A] = funktion_signale_aus_txtlog_einlesen(Datei); | function [A] = funktion_signale_aus_txtlog_einlesen(Datei); |
Aktuelle Version vom 29. November 2019, 10:56 Uhr
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);