WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

ansteuerung schrittmotor

 

pfeili
Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 10.08.2010, 21:11     Titel: ansteuerung schrittmotor
  Antworten mit Zitat      
liebe leute,

ich bin seit wenigen wochen verantwortlicher für ein labor, in welchem mein vorgänger u.a. schrittmotoren mittels das1600 über viewdac (dos) angesteuert hatte. nun möchte ich die veraltete messtechnik aktualisieren und alles MATLAB-tauglich machen. dazu habe ich mir seine programme durchgesehen und bin dabei auf eine syntax gestoßen, mit der ich in matlab nicht weiter weiß. es geht um das senden von 8bit-output in einer schleife. ich gebe vielleicht gleich mal ein beispiel an, welches in der callback eines start-pushbuttons auftauchen sollte:

Code:

% Abgreifen des Eingabewertes aus dem Edit-Feld und Umwandeln in eine % Zahl
l = str2double(get(handles.input_strecke, 'String'))  

% Multiplikation der Strecke in mm mit Schritten/mm ergibt Anzahl
% Schritte
n = l * 316

% Schleife, welche drei 8-bit-outputs solange sendet, wie die Anzahl an
% Schritten beträgt

for i = 1:n

sende 0 an port 1794
sende 8 an port 1792
sende 0 an port 1792

end

 


ich wüsste gern, wie diese sendebefehle darzustellen sind. das programm viewdac stammt von mitte der 90er und hier werden nacheinander abzuarbeitende kommandos per drag&drop in ein kommandofenster gezogen und dann per häckchensetzen der ablauf festgelegt (und leider nicht, indem ich sie hintereinander schreibe). in einem durcheinander von blöcken, loops, buttons, i/o tasks...geht dann schon mal die übersicht verloren.

leider bin ich in diesem bereich absolut neu und die messtechnik ist auch nur mittel zum zweck, aber es sollte schon alles funktionieren, sonst vergraule ich mit dem dos noch die studenten (auch wenn es damit funktioniert).

ich bin euch für jegliche hilfe dankbar.

pfeili
Private Nachricht senden Benutzer-Profile anzeigen


aj.geissler
Forum-Guru

Forum-Guru



Beiträge: 251
Anmeldedatum: 26.11.07
Wohnort: Seeheim-Jugenheim
Version: ---
     Beitrag Verfasst am: 11.08.2010, 10:30     Titel:
  Antworten mit Zitat      
Hi,

über welche Schnittstelle wurden die Schrittmotoren angesteuert ?

GPIB, RS232 etc. ?

Falls über RS232: Dieser Link könnte interessant sein:
http://www.gomatlab.de/matlab-rs232-communication-t564.html

Grüße
Andreas
_________________

Andreas Geißler
Private Nachricht senden Benutzer-Profile anzeigen
 
pfeili
Themenstarter

Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 15.10.2010, 14:09     Titel:
  Antworten mit Zitat      
Sorry, dass ich erst jetzt zum Antworten komme. Ich habe mittlerweile ein externes KUSB-Modul (Keithley Kusb3116) erhalten, mit welchem ich jetzt die Kommunikation über die gleiche Schnittstelle (37pin) versuche. Zu meinem Gerät gibt es einen DAQ-Adapter für Matlab, welchen ich gern nutzen möchte. Er nennt sich 'dtol'. Nun hätte ich gern obiges Senden vorgenommen. Begonnen habe ich wie folgt:

Code:

clc
dio = digitalio('dtol', 0);
hline = addline(dio, 0:2, 1, 'out');
vorlauf = 10;
schritte = 316 * 10;
for i =1:schritte
putvalue(dio.Line(1:3), [0 8 0])
end
 


Es funktioniert noch nicht. Ich beschäftige mich erst seit kurzem mit derartigen Ansteuerungen und bin für jede Hilfe dankbar, da ich es beruflich benötige. Kann mir da jemand helfen?

Viele Grüße und besten Dank schon mal.

pfeili
Private Nachricht senden Benutzer-Profile anzeigen
 
aj.geissler
Forum-Guru

Forum-Guru



Beiträge: 251
Anmeldedatum: 26.11.07
Wohnort: Seeheim-Jugenheim
Version: ---
     Beitrag Verfasst am: 15.10.2010, 15:55     Titel:
  Antworten mit Zitat      
Hi,

funktioniert überhaupt die Toolbox an sich ?
Könnte z.B. mit dem Befehl

daqhwinfo(’dtol’)

ausprobiert werden.

Leider habe ich nur die 14-seitige USB-Matlab-Beschreibung vorliegen, die keine Details zu den von Dir verwendeten Befehlen enthält.

Grüße
Andreas

USBMatlabadapter.pdf
 Beschreibung:

Download
 Dateiname:  USBMatlabadapter.pdf
 Dateigröße:  153.84 KB
 Heruntergeladen:  1270 mal

_________________

Andreas Geißler
Private Nachricht senden Benutzer-Profile anzeigen
 
pfeili
Themenstarter

Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 15.10.2010, 16:49     Titel:
  Antworten mit Zitat      
Hallo Andreas,

schön, dass du dich meiner erbarmst. Wink

Ja, die Toolbox funktioniert. Ich poste mal, was dasteht:

Code:

AdaptorDllName: 'C:\PROGRA~1\KEITHL~1\DAQADA~1\dtol.dll'
AdaptorDllVersion: '1, 0, 0, 52'
AdaptorName: 'dtol'
BoardNames: {'KUSB-3116(00)'}
InstalledBoardIds: {'0'}
ObjectConstructorName: {'analoginput('dtol',0)' 'analogoutput('dtol', 0)' 'digitalio('dtol', 0)'}
 


Meinen Code habe ich mittlerweile etwas abgeändert in:

Code:


clc
clear all
if (~isempty(daqfind))
    stop(daqfind)
end
% Erzeugen eines digitalen I/O-Objektes mit dem verwendeten
% KUSB-Matlab-Adapter und einer ID
dio = digitalio('dtol', 0)

% Zuordnung von Hardware-Zeilen zum Digitalen Objekt; addline(obj, ID der
% Hardwarelines, Richtung "in" oder "out", Port 0 oder 1)
a = addline(dio, 0:3, 1, 'Out')

% Vorschub in mm
Vorschub = 10;
% Schrittzahl
Schritte = 316 * Vorschub;

% zu sendende Daten
data1 = 0;
data2 = 8;
data3 = 0;

% Umwandlung in binären 8-bit-Output
bvdata1 = dec2bin(data1,8);
bvdata2 = dec2bin(data2,8);
bvdata3 = dec2bin(data3,8);

for i=1:Schritte
putvalue(dio.Line(1), 0)
putvalue(dio.Line(1:4), 8)
putvalue(dio.Line(1), 0)
pause(0.001)
end

 


Die 14-seitige Matlab-DAQ-Anleitung habe ich auch. Allerdings scheint sie mir für DIO nicht sehr viel zu nützen.

Viele Grüße

pfeili
Private Nachricht senden Benutzer-Profile anzeigen
 
pfeili
Themenstarter

Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 15.10.2010, 18:01     Titel:
  Antworten mit Zitat      
Um die 8-bit-Outputs einzubeziehen (was in dem vorher geposteten Beispiel gar nicht passierte) müsste man es so machen. Es muss immer so viele lines wie binvec-Elemente geben.

Code:

% Umwandlung in binären 8-bit-Output
bvdata1 = dec2binvec(data1,8);
bvdata2 = dec2binvec(data2,8);
bvdata3 = dec2binvec(data3,8);

for i=1:Schritte
putvalue(dio.Line(1:8), bvdata1)
putvalue(dio.Line(1:8), bvdata2)
putvalue(dio.Line(1:8), bvdata3)
pause(0.001)
end
 


Es dauert außerdem sehr lange, bis die for-Schleife durchgearbeitet ist. Gibt es da einen schnelleren Weg? Leider reagiert der Motor trotzdem noch nicht.

pfeili
Private Nachricht senden Benutzer-Profile anzeigen
 
pfeili
Themenstarter

Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 20.10.2010, 17:29     Titel:
  Antworten mit Zitat      
Hat noch jemand eine Idee?
Private Nachricht senden Benutzer-Profile anzeigen
 
pfeili
Themenstarter

Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 09.02.2011, 15:55     Titel: Ändern der Sendefrequenz
  Antworten mit Zitat      
Liebe Leute,

mittlerweile bin ich schon deutlich weiter. Mein Code steht in der Callback eines Pushbuttons und sieht folgendermaßen aus:

Code:

if (~isempty(daqfind))
    stop(daqfind)
end

% Registering the Hardware Driver Adaptor
daqregister('C:/Programme/Keithley Instruments/DAQAdaptorforMATLAB/dtol.dll');

% Erzeugen eines digitalen I/O-Objektes mit dem verwendeten
% KUSB-Matlab-Adapter
dio = digitalio('dtol');

% Definieren des Outputkanals für Drehrichtung (Pin 23 am DIO)
addline(dio, 3, 1, 'Out');
% Definieren des Outputkanals für Takt (Pin 35 am DIO)
addline(dio, 15, 1, 'Out');

% Winkel abgreifen
winkel = str2double(get(handles.rotedit, 'String'));

% Schrittzahl
schritte = 32 * winkel;

% Drehrichtung ändern
putvalue(dio.line(1), 1)

for n =1:schritte
    putvalue(dio.line(2), 1)        % Takt, steigende Flanke (high)
    putvalue(dio.line(2), 0)        % Takt, fallende Flanke (low)
end

delete (dio);
clear dio;
 


Der angesprochene Schrittmotor dreht in die entsprechende Richtung, aber im Vergleich zur DOS-Ansteuerung zu langsam.

Nun habe ich sowohl bei der DOS-Ansteuerung als auch bei meinem Matlab-Programm mit dem Oszi die Sendesignale (Rechteckimpulse) gemessen und festgestellt:

- beim Matlab-Skript: 4.5ms high und 4.5ms low-Signale
- im Vergleich dazu beim DOS-Programm: 2ms high und nur 0.8ms low-Signale

Nun meine Frage, wie kann ich die Zeit festlegen, wie lange high bzw. low anliegen soll? Kann ich in irgendeiner Art meine Sendefrequenz ändern, also etwas schnelleres, als meine Schleife generieren?

Für Hilfe wäre ich euch unendlich dankbar.

Mit beste Grüßen

pfeili
Private Nachricht senden Benutzer-Profile anzeigen
 
pfeili
Themenstarter

Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 11.02.2011, 13:22     Titel:
  Antworten mit Zitat      
Ich bin echt verzweifelt. Sad

Kann ich die for-Schleife irgendwie beschleunigen?

pfeili
Private Nachricht senden Benutzer-Profile anzeigen
 
Scriptor
Forum-Century

Forum-Century


Beiträge: 217
Anmeldedatum: 22.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.02.2011, 13:59     Titel:
  Antworten mit Zitat      
Kannst du den ganzen Spaß auch auf C ummünzen? Für solche Schleifenanwenungen, wird nicht ungern eine Mex function geschrieben, das Matlab for Schleifen recht langsam sind. Wer von der C-Sprache zu matlab gewechselt ist, hat nicht selten viel Langeweile beim Programm testen Very Happy.
Private Nachricht senden Benutzer-Profile anzeigen
 
pfeili
Themenstarter

Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 11.02.2011, 15:34     Titel:
  Antworten mit Zitat      
Hallo Scriptor,

danke für deine Antwort. Leider habe ich noch nie mit C gearbeitet. Dass die for-Schleifen in Matlab sehr langsam sind (while ist hier noch langsamer), habe ich auch immer wieder gelesen, aber ich wusste mir nicht anders zu helfen.

Gerade versuche ich es mit einer "TimerFcn", deren "TimerPeriod" für
Code:

putvalue(dio.line(2), 1)
 

nach 2ms und für
Code:

putvalue(dio.line(2), 0)
 

nach 0.8 ms abbricht und das ganze so oft tut, wie ich Impulse (Schritte) benötige. Ist denn so etwas möglich?

Da ich kein Programmierer bin, möchte ich mich programmiertechnisch nicht weit von Matlab entfernen. Dafür fehlt mir leider die Zeit.

Ich bin für jegliche Hilfe dankbar.

pfeili
Private Nachricht senden Benutzer-Profile anzeigen
 
pfeili
Themenstarter

Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 14.02.2011, 17:53     Titel:
  Antworten mit Zitat      
Letztendlich lande ich wieder bei einer for-Schleife.

Hat jemand noch eine andere Idee?

pfeili
Private Nachricht senden Benutzer-Profile anzeigen
 
pfeili
Themenstarter

Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 17.02.2011, 09:59     Titel:
  Antworten mit Zitat      
Hallo Leute,

hier einmal die Antwort vom Hersteller:

Zitat:

[...]beim KUSB-3116 sind die DIO’s rein Software gesteuert. Es gibt leider keine Möglichkeit diese schneller anzusteuern, als über eine Softwareschleife. Eine Taktvorgabe ist also nicht möglich. Das die Ansteuerung über DOS schneller ist, liegt einfach daran das DOS deutlich weniger Ressourcen beansprucht als Windows. Folge: Schleifen laufen deutlich schneller .[...]


Diese Antwort stimmt mich natürlich nicht optimistisch. Scheinbar kann ich mich davon verabschieden, die Schrittmotoren auf diese Weise ordentlich angesteuert zu bekommen, was mich den enormen Anschaffungspreis des Geräts sehr in Frage stellen lässt. Natürlich kann ich das Gerät für andere Sachen gut gebrauchen, aber ich dachte eben, dass ich damit flexibel an verschiedenen Versuchsständen arbeiten kann.

Wäre ich mit einer PCI-DIO-Variante besser gekommen, also würde sie schneller arbeiten?

Hat noch jemand eine Idee?

Beste Grüße

pfeili
Private Nachricht senden Benutzer-Profile anzeigen
 
pfeili
Themenstarter

Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 22.02.2011, 16:43     Titel:
  Antworten mit Zitat      
Hallo Leute,

mit folgenden Änderungen konnte ich meine Geschwindigkeit verdoppeln:

Code:


if (~isempty(daqfind))
    stop(daqfind)
end

% Registering the Hardware Driver Adaptor
daqregister('C:/Programme/Keithley Instruments/DAQAdaptorforMATLAB/dtol.dll');

% Erzeugen eines digitalen I/O-Objektes mit dem verwendeten
% KUSB-Matlab-Adapter
dio = digitalio('dtol');

% Definieren des Outputkanals für Drehrichtung (Pin 23 am DIO)
pin23 = addline(dio, 3, 1, 'Out');
% Definieren des Outputkanals für Takt (Pin 35 am DIO)
pin35 = addline(dio, 15, 1, 'Out');

% Winkel abgreifen
winkel = str2double(get(handles.rotedit, 'String'));

% Schrittzahl
schritte = 32 * winkel;

% Drehrichtung ändern
putvalue(pin23, 1)

for n =1:schritte
    putvalue(pin35, 1)        % Takt, high
    putvalue(pin35, 0)        % Takt, low
end

delete (dio);
clear dio;
 


Hier mal ein Vergleich:

Code:

for n = 1:10
tic
putvalue(dio.line(1), 1)        % 4 senden an 1792 (Takt, steigende Flanke rechtes Modul)
toc
tic
putvalue(dio.line(1), 0)        % 0 senden an 1792 (Takt, fallende Flanke rechtes Modul)
toc
end
 

Zitat:

Elapsed time is 0.059130 seconds.
Elapsed time is 0.012051 seconds.
Elapsed time is 0.009513 seconds.
Elapsed time is 0.008875 seconds.
Elapsed time is 0.009159 seconds.
Elapsed time is 0.008862 seconds.
Elapsed time is 0.009038 seconds.
Elapsed time is 0.008853 seconds.
Elapsed time is 0.008920 seconds.
Elapsed time is 0.008971 seconds.
Elapsed time is 0.009042 seconds.
Elapsed time is 0.009089 seconds.
Elapsed time is 0.008960 seconds.
Elapsed time is 0.008939 seconds.
Elapsed time is 0.009027 seconds.
Elapsed time is 0.009154 seconds.
Elapsed time is 0.009122 seconds.
Elapsed time is 0.008856 seconds.
Elapsed time is 0.009163 seconds.
Elapsed time is 0.009103 seconds.

wohingegen
Code:

for n = 1:10
tic
putvalue(pin22, 1)        % 4 senden an 1792 (Takt, steigende Flanke rechtes Modul)
toc
tic
putvalue(pin22, 0)        % 0 senden an 1792 (Takt, fallende Flanke rechtes Modul)
toc
end

Zitat:

Elapsed time is 0.003339 seconds.
Elapsed time is 0.004292 seconds.
Elapsed time is 0.003527 seconds.
Elapsed time is 0.003851 seconds.
Elapsed time is 0.003410 seconds.
Elapsed time is 0.004553 seconds.
Elapsed time is 0.003560 seconds.
Elapsed time is 0.004242 seconds.
Elapsed time is 0.003474 seconds.
Elapsed time is 0.004394 seconds.
Elapsed time is 0.003376 seconds.
Elapsed time is 0.004112 seconds.
Elapsed time is 0.003521 seconds.
Elapsed time is 0.003545 seconds.
Elapsed time is 0.003536 seconds.
Elapsed time is 0.004221 seconds.
Elapsed time is 0.003494 seconds.
Elapsed time is 0.004262 seconds.
Elapsed time is 0.003441 seconds.
Elapsed time is 0.004225 seconds.

liefert.

Hat nun vielleicht noch jemand eine Idee zur weiteren Beschleunigung? Geht es eventuell in einem Schritt, ähnlich dem hier (es funktioniert auch, dauert allerdings länger, als meine vorhergehende Variante):

Code:

putvalue([pin25 pin25], [1 0])
 


Ich kann im Vergleich zu meiner alten Variante schon zufrieden sein, aber ein bisschen muss sich noch rausholen lassen.

Außerdem: gibt es eine Möglichkeit, regelmäßigere Zeiten zu erwirken, z.B. immer genau 3 oder 4ms?

Vielen Dank euch allen.

pfeili
Private Nachricht senden Benutzer-Profile anzeigen
 
space
Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 12.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.05.2011, 12:31     Titel:
  Antworten mit Zitat      
Hi Pfeili,

ich habe dir einen PN geschrieben.

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.