Einlesen von internen Signalen eines Mikrocontrollers mit Matlab: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Keine Bearbeitungszusammenfassung |
|||
(21 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 = | ||
void | == 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"> | ||
void setup() | |||
{ | |||
Serial.begin(9600); // Serielle Kommunikation über COM-Port mit 9600bps | |||
} | |||
// Variablen | void loop() | ||
{ | |||
// Variablen setzen | |||
int Signal1; | |||
int Signal2; | |||
int Signal3; | |||
// Variablen | // 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(","); | |||
} | |||
</code> | |||
== 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: | |||
Zeitstempel;Signal1;Signal2;Signal3, | |||
Zeitstempel;Signal1;Signal2;Signal3, | |||
Zeitstempel;Signal1;Signal2;Signal3, | |||
= Verarbeiten von Signalen aus einer Textdatei mit Hilfe von Matlab-Simulink = | = Verarbeiten von Signalen aus einer Textdatei mit Hilfe von Matlab-Simulink = | ||
# Voraussetzung: Die Signale liegen in einer Textdatei in deroben beschriebenen Form vor. | # 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'''!): | # 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 <source line lang="matlab" style="font-size:medium"> | |||
A = funktion_signale_aus_txtlog_einlesen('Testdatei.log'); </source> | |||
# 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: | |||
<source line lang="matlab" style="font-size:medium"> | |||
% 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]') | |||
</source> | |||
== Quelltext == | == Quelltext == | ||
<source line lang="matlab" style="font-size:medium"> | 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. | <source line lang="matlab" style="font-size:medium"> | ||
%%% | function [A] = funktion_signale_aus_txtlog_einlesen(Datei); | ||
%%% Eingang: Name inkl. Pfad einer Textdatei | %%% Funktion zum Einlesen von Signalen aus einer Textdatei. | ||
%%% Ausgang: Matrix mit allen eingelesen Signalen in den Spalten (je Zeile | %%% | ||
%%% Text eine Zeile in der Matrix) | %%% Eingang: Name inkl. Pfad einer Textdatei | ||
%%% Format der Textdatei: | %%% Ausgang: Matrix mit allen eingelesen Signalen in den Spalten (je Zeile | ||
%%% Zeitstempel;Signal1;Signal2;Signal3, | %%% Text eine Zeile in der Matrix) | ||
%%% | %%% Format der Textdatei: | ||
%%% also z. B.: | %%% Zeitstempel;Signal1;Signal2;Signal3, | ||
%%% 34368;652;27;0;0;0;286;-68391, | %%% | ||
%%% 34386;652;27;0;0;0;285;-68392, | %%% also z. B.: | ||
%%% 34420;652;27;0;0;0;283;-68394, | %%% 34368;652;27;0;0;0;286;-68391, | ||
%%% 34453;652;27;0;0;0;282;-68395, | %%% 34386;652;27;0;0;0;285;-68392, | ||
%%% 34487;652;27;0;0;0;284;-68393, | %%% 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 | %% Datei öffnen und Daten einlesen | ||
% öffnen | % öffnen | ||
fid = fopen(Datei); | fid = fopen(Datei); | ||
% Rohdaten einlesen | % Rohdaten einlesen | ||
raw_data = fread(fid,'*char')'; | raw_data = fread(fid,'*char')'; | ||
if ~(strcmp(raw_data(1),';')) | if ~(strcmp(raw_data(1),';')) | ||
raw_data=[';',raw_data]; | |||
end | end | ||
%% Semicolons und Kommas finden | %% Semicolons und Kommas finden | ||
string_laenge = length(raw_data); | string_laenge = length(raw_data); | ||
semicolon = strfind(raw_data,';'); | semicolon = strfind(raw_data,';'); | ||
komma = strfind(raw_data,','); | komma = strfind(raw_data,','); | ||
gesamt = sort([semicolon komma]); | gesamt = sort([semicolon komma]); | ||
n_spalten = round((length(gesamt)-1)/length(komma)); | n_spalten = round((length(gesamt)-1)/length(komma)); | ||
i_semicolon = 1; | i_semicolon = 1; | ||
i_komma = 1; | i_komma = 1; | ||
i_zeilen = 1; | i_zeilen = 1; | ||
i_gesamt = 1; | i_gesamt = 1; | ||
%% leere Matrix A erzeugen | %% leere Matrix A erzeugen | ||
A = []; | A = []; | ||
% Matrix A befüllen | % Matrix A befüllen | ||
try | try | ||
while i_gesamt <= length(gesamt) | while i_gesamt <= length(gesamt) | ||
for i_spalten = 1:n_spalten | for i_spalten = 1:n_spalten | ||
Zeile 105: | Zeile 132: | ||
end | end | ||
end | end | ||
catch | catch | ||
%fprintf(1, '%s: Catch-Zweig erreicht\n', mfilename); | %fprintf(1, '%s: Catch-Zweig erreicht\n', mfilename); | ||
end | end | ||
%% Datei schließen | %% Datei schließen | ||
fclose(fid); | fclose(fid); | ||
</source> | </source> |
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);