folgendes mich zur Verzweifulung bringendes Problem:
Ich möchte mithilfe von Matlab und Arduino zwei Schrittmotoren steuern. Kenne mich aber bzgl Programmierung dessen nur sehr eingeschränkt aus. Eine Bibliothek, wie Adafruit, will ich nicht benutzen...
Ist glaub ich für Jemanden, der sich auskennt recht trivial...für mich ein Endgegner...Sollte mir also Jemand helfen, wäre ich sehr dankbar!
Im Moment bin ich so weit:
Ich habe die Function, die ich im Main Programm ablaufen lassen will als Schleife geschrieben; sieht so aus:
Code:
%Stepper A
function[n_control, nch] = move_motor_A(a, n_steps, n_direct)
Du solltest als Dezimaltrenner Punkte verwenden und keine Kommas. Wenn Du 0,01 Sekunden Pause willst, musst Du 0.01 übergeben.
Die Geschwindigkeit solltest Du genau durch das verändern dieser Pausenzeit einstellen können. Letztendlich ist das ja die Zeit, die Du zwischen zwei Schritten wartest.
Wie würde das dann aussehen, wenn ich die Pausenzeit verändere (werds in nen Punkt ändern)?
Weil ich will die Geschwindigkeit ja später über die Oberfläche ändern und nicht jedesmal die Schleife neu eingeben...
Welche Möglichkeiten habe ich da?
Du hast eine Funktionsdefinition, die so aufgebaut ist:
Du musst Deine Pausenzeit als zusätzlichen Eingabewert definieren und an der Stelle, wo die Pause gemacht wird eben nicht den festen Wert einsetzen, sondern deine zusätzliche Eingangsvariable.
Okay, das heißt ich muss in der Schleife move_motor_A lediglich sowohl bei der Eingabe als auch bei der Ausgabe 'pause' als Variable deklarieren? Denn bisher war ja dann scheinbar der Pausenwert, der die Geschwingikeit festlegt, auf einen festen Wert fixiert?
Genügt es dazu, wenn ich 'pause' in die Klammerwerte schreibe oder muss ich auch den möglichen Umfang mit dazuschreiben?
Ich bin nämlich davon ausgegangen, dass in meiner obigen Schleife die Pause nur zur Funktionstrennung verantwortlich ist, weil das eine digital.write ja für vorwärts und das andere für rückwärts (oder cw und ccw) verantwortlich ist; erhöhe ich also den Pausenwert, würd der ganze Prozess in meinen Augen einfach nur länger dauern...?
ifnargout==0,
% print speed value disp(['The speed of stepper number ' num2str(num) 'isset to: ' num2str(a.sspd(num)) ' over 255']);
else % return speed value
val=a.sspd(num);
end
ifnargout==0,
% print speed value for each stepper for num=1:2,
disp(['The speed of stepper number ' num2str(num) 'isset to: ' num2str(a.sspd(num)) ' over 255']);
end else % return speed values
val=a.sspd;
end
Okay, das heißt ich muss in der Schleife move_motor_A lediglich sowohl bei der Eingabe als auch bei der Ausgabe 'pause' als Variable deklarieren?
Als Eingang sollte reichen.
_Johannes_ hat Folgendes geschrieben:
Denn bisher war ja dann scheinbar der Pausenwert, der die Geschwingikeit festlegt, auf einen festen Wert fixiert?
Nach meinem sehr flüchtigen Blick auf den Code habe ich das so interpretiert, ja.
Zitat:
Genügt es dazu, wenn ich 'pause' in die Klammerwerte schreibe oder muss ich auch den möglichen Umfang mit dazuschreiben?
Die Pause wird ein Eingangswert wie a, n_steps und n_direct definiert. Du solltest ihn allerdings nicht "pause" nennen, da Du sonst die Funktion Pause überschreibst - das wird merkwürdige Fehlermeldungen geben...
Zitat:
Ich bin nämlich davon ausgegangen, dass in meiner obigen Schleife die Pause nur zur Funktionstrennung verantwortlich ist, weil das eine digital.write ja für vorwärts und das andere für rückwärts (oder cw und ccw) verantwortlich ist; erhöhe ich also den Pausenwert, würd der ganze Prozess in meinen Augen einfach nur länger dauern...?
Jetzt habe ich nochmal genau hingeschaut. Und es sieht so aus, als würde man auf ledPin3 dem Treiber die Richtung mitteilen und auf ledPin2 ein mach-jetzt-einen-Schritt-Signal schicken. Den Schritt macht der Treiber dann auf der steigenden Flanke von ledPin2. Die erste Pause ist dann dazu da, dass ledPin2 eine kleine Weile auf null ist, bevor er wieder auf 1 gesetzt wird. Wahlweise macht der Treiber den Schritt auch auf der fallenden Flanke - aber das ist eigentlich Wurst.
Ich hatte bei der Konstruktion was anderes im Sinn, das war aber Quatsch.
Die Drehgeschwindigkeit ist ja nichts anderes als die Zahl der Schritte je Sekunde. Die kannst Du durch den zweiten Aufruf von pause() in Deiner Schleife beeinflussen. Wenn die zweite Pause sehr lang ist, hat man viel Zeit zwischen zwei Schritten und die Drehzahl ist klein. Wenn die zweite Pause sehr klein ist, folgen die Schritte sehr schnell aufeinander und die Drehzahl ist groß.
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.