|
Um aus den Messdaten eine Fourie-Transofrmation zu berechnen wurde
MatLab verwendet. Folgendes Programm liest eine, vorher in das
Programm per "drag&drop" importierte log-Datei ein, berechnet die
spektrale Verteilung und zeigt sowohl den x-/ als auch den y-Graph an.
Werden diese Daten für spätere Berechnung noch weiter benötigt kann
man die Frequenzen und die dazugehörigen Amplituden aus den Arrays
fftx/ffty/frequenz exportieren.
|
t = data(:, 1)/1000; Signalx = data(:, 2); dt=t(2)-t(1); %
Schrittweite Fa = 1 / dt; % Abtastfrequenz Fg = Fa / 2; %
Grenzfrequenz, hier wird das Spektrum gespiegelt n =
length(Signalx); % Laenge des Signals FFT_Signalx =
abs(fft(Signalx,n)/n); % Fast Fourier Trafo
f=(0:floor(n/2))/(n*dt); %Frequenzachse bis zur Grenzfrequenz
subplot(2,1,1)
plot(f,FFT_Signalx(1:length(f)));
title('FFT der x-Komponente'); xlabel('Frequenz in Hz');
ylabel('Amplitude'); grid on; axis([0 250 0 40])
Signaly = data(:, 3); dt=t(2)-t(1); % Schrittweite Fa = 1
/ dt; % Abtastfrequenz Fg = Fa / 2; % Grenzfrequenz, hier
wird das Spektrum gespiegelt n = length(Signaly); % Laenge
des Signals FFT_Signaly = abs(fft(Signaly,n)/n); % Fast
Fourier Trafo f=(0:floor(n/2))/(n*dt); %Frequenzachse bis zur
Grenzfrequenz
subplot(2,1,2)
plot(f,FFT_Signaly(1:length(f))); title('FFT der
y-Komponente'); xlabel('Frequenz in Hz');
ylabel('Amplitude'); grid on; axis([0 250 0 300]);
ffty = FFT_Signaly(1:length(f)); fftx =
FFT_Signalx(1:length(f)); frequenz = f';
|
|
|
|
|
|
|
|
Quellcode als
MatLab-Script Datei zum downloaden ! |
|
|
|
|
|
|
Der Quellcode für die Motoransteuerung durch die App wurde etwas
erweitert. Wie die Analye der verschiedenen Geschwindigkeiten gezeigt
hat, sind hauptsächlich die niedrigen Drehraten proplematisch. Daher
soll über das Geschwindigkeitenspektrum die verschiedenen
Ansteuerungsarten des Motors kombiniert werden: In dem langsamen
Bereich soll der Mikroschrittbetrieb verwendet werden, bei den mittleren
Drehzahlen der Interleavebetrieb und hohen Geschwindigkeiten díe
Doublecoilansteuerung.
Folgender Code-Ausschnitt soll
verdeutlichen wie das Programm erweitert wurde.
|
case 97: // Linkslauf
if (digitalRead(6) == HIGH) { //
Schlitten ist nicht am linken Endschalter
switch(Drehzahl){
//Abfrage welche Drehzahl eingestellt ist
case 18:
//langsamste Drehzahl -> Mikrostep ff+3
Serial.println("Mikrostep 1");
myMotor->setSpeed(50);
myMotor->step(3, FORWARD, MICROSTEP);
//^
break;
case 36:
Serial.print("Mikrostep 2");
myMotor->setSpeed(1000);
myMotor->step(5, FORWARD, MICROSTEP);
break;
case 54:
// Mittlere Drehzahl -> Interleave ff+3
Serial.println("Interleave 1");
myMotor->setSpeed(60);
myMotor->step(1, FORWARD, INTERLEAVE);
//^
break;
case 72:
Serial.println("Interleave 2");
myMotor->setSpeed(120);
myMotor->step(1, FORWARD, INTERLEAVE);
break;
case 90:
Serial.println("Interleave 3");
myMotor->setSpeed(220);
myMotor->step(1, FORWARD, INTERLEAVE);
break;
case 108:
Serial.println("Interleave 4");
myMotor->setSpeed(255);
myMotor->step(1, FORWARD, INTERLEAVE);
break;
case 126:
Serial.println("Double 1");
myMotor->setSpeed(150);
myMotor->step(1, FORWARD, DOUBLE);
break;
case 144:
Serial.println("Double 2");
myMotor->setSpeed(200);
myMotor->step(1, FORWARD, DOUBLE);
break;
case 162:
Serial.println("Double 3");
myMotor->setSpeed(255);
myMotor->step(1, FORWARD, DOUBLE);
break;
case 180:
Serial.println("Double 4");
myMotor->setSpeed(1000);
myMotor->step(1, FORWARD, DOUBLE);
break;
} |
|
|
|