Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Schrittmotor ansteuern, Motor bewegt sich nicht?
Doofit
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

Schrittmotor ansteuern, Motor bewegt sich nicht?

beantworten | zitieren | melden

Hallo,
ich habe jetzt schon mehrer Wochen damit verbracht deutsche und englische Seiten zu durchsuchen, was die Steuerung von Schrittmotoren über CSharp angeht. Ich hab auch schon eine ganz Menge gefunden,aber erstmal zum Anfang. Ich habe mir eine 5-Achs-Steuerkarte (http://www.savebase.com/infobase/downloads/breakout_board_stepper_driver/user_manual_5_axis_breakout_board.pdf), sowie 3 Nema-17-Motoren besorgt (1,7A , 1,8°, 200 Schritte für eine ganze Umdrehung bei Vollschrittbetrieb), da ich fürs erste nur mal die X-, Y- und Z-Achse verwenden möchte. Die Steuerkarte ist über den OnBoard-LPT mit dem PC verbunden. Nachdem ich die inpout32.dll importiert habe, bin ich nun durch Google so weit, dass ich es im Wechsel mit "ControlPort.Output(0x378, Binärwert);" und "System.Threading.Thread.Sleep(Zeit);" schaffe ein Signal an die Achsen zu senden, was man an der LED für die jeweilige Achse erkennt. Wenn ich die Anleitung der Steuerkarte richtig lese muss ich erst durch einen Pin die Drehrichtung angeben und daraufhin dann einen anderen Pin immer ein- und ausschalten. Dies wurde mir auch auf gutefrage.net von einem Programmierer so bestätigt. Hier mal ein Codeausschnitt mit dem ich versuche die Z-Achse zu steuern:

PortAccess.Output(0x378, 01000000);  //Drehrichtung angeben
System.Threading.Thread.Sleep(x);     //Zeit x warten
PortAccess.Output(0x378, 01100000);  //Impuls, Bit ein
System.Threading.Thread.Sleep(x);     //Zeit x warten
PortAccess.Output(0x378, 00000000);  //Bit aus
System.Threading.Thread.Sleep(x);     //Zeit x warten
PortAccess.Output(0x378, 01100000);  //Impuls Bit ein
System.Threading.Thread.Sleep(x);     //Zeit x warten
PortAccess.Output(0x378, 00000000);  //Bit aus
Das kann man natürlich am Ende alles in eine Schleife legen, doch zum Testen wollte ich es erst einmal so probieren. Der Code wiederholt sich so eine ganze Weile und startet sobald ein Button geklickt wird. Soweit so gut, klicke ich den Button, blinkt die LED für Z und man hört auch dass da irgendwas schaltet (Relais). Trotzdem bewegt sich der Motor nicht, aber ich bin mir sicher dass er richtig angeschlossen ist. Manchmal merkt man auch, dass er einen kleinen Ruck macht, aber nur minimal und das macht er auch nicht immer....bin langsam echt am verzweifeln, vielleicht hat hier jemand ein paar Tipps für mich, da ich keine Fehlermeldungen bekomme und demnach das Prinzip ja stimmen müsste...
private Nachricht | Beiträge des Benutzers
Stefan.Haegele
myCSharp.de - Member

Avatar #avatar-3068.jpg


Dabei seit:
Beiträge: 458
Herkunft: Untermeitingen

beantworten | zitieren | melden

Dumme Frage, aber kannst du sicherstellen, dass deine Hardware funktioniert? Vom Glauben alleine würde ich mich nicht zufrieden geben... Es gibt doch bestimmt Demoanwendungen zum Testen, oder?
private Nachricht | Beiträge des Benutzers
Doofit
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

Ja die Hardware funktioniert, habe die Motoren angeschlossen und über Mach3 (ein CNC-Programm dass ich mir gekauft habe) bewegt.....also dort liegt nicht das Problem.
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5985
Herkunft: Leipzig

beantworten | zitieren | melden

Hi Doofit,

hast du evtl. die Möglichkeit nachzuschauen, ob bei dem funktionierenden Programm die gleichen Befehle geschickt werden, wie bei deinem Programm?

Ansonsten sieht mir der Code danach aus, daß du Binäre Daten definieren möchtest:
Zitat von Doofit
PortAccess.Output(0x378, 01000000); //Drehrichtung angeben

Allerdings steht 01000000 für die dezimale Schreibweise, nicht für die binäre.

Christian
Weeks of programming can save you hours of planning
private Nachricht | Beiträge des Benutzers
Doofit
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

Hi MrSparkle,
ich wüsste leider nicht wie...
aber danke erstmal für den Hinweis mit der Schreibweise.
Muss auch zugeben dass ich nicht so vertraut mit C# bin, eher hobbymäßig.
Also jetzt bekommt der Motor immer ein Signal, was schonmal ein großer Unterschied zu vorher ist. Trotzdem bewegt er sich nicht, man spürt lediglich kleine "Zucker". Der Code sieht nun folgendermaßen aus:


PortAccess.Output(0x378, 0x40);         //Drehrichtung angeben
System.Threading.Thread.Sleep(x);     //Zeit x warten
PortAccess.Output(0x378, 0x60);         //Impuls, Bit ein
System.Threading.Thread.Sleep(x);     //Zeit x warten
PortAccess.Output(0x378, 0x0);           //Bit aus
System.Threading.Thread.Sleep(x);     //Zeit x warten
PortAccess.Output(0x378, 0x60);         //Impuls Bit ein
System.Threading.Thread.Sleep(x);     //Zeit x warten
PortAccess.Output(0x378, 0x0);           //Bit aus


Für x habe ich momentan den Wert x = 40, aber ich denke nicht dass das mit meinem Problem zusammenhängt oder?
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5985
Herkunft: Leipzig

beantworten | zitieren | melden

40 Millisekunden ist nicht lange, nichteinmal eine 10tel Sekunde. Das könnten die "Zucker" des Motors sein.

Christian
Weeks of programming can save you hours of planning
private Nachricht | Beiträge des Benutzers
Palin
myCSharp.de - Member



Dabei seit:
Beiträge: 1115

beantworten | zitieren | melden

Schau mal ob der Motor bei dem Befehl nicht einfach nur einen Step macht. Wenn ja mal schauen ob es einen anderen Befehl zum Dauerbetrieb gibt oder du die Stepanzahl hoch setzen musst.

p.s. Ersetzt doch mal die Zahlen (Magic Values) durch Konstanten, das macht das ganze Besser lesbar (Spart auch die Kommentare). Und wenn du einen Wert änderst ändert er sich überall.
Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern
private Nachricht | Beiträge des Benutzers
Doofit
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

Daran liegt es glaube ich nicht, denn wenn ich 1000ms einstelle dann zuckt der Motor eben alle 1000ms und wenn ich 1ms angebe dann zuckt er so oft dass er im Prinzip nur durchgehend brummt. Dennoch bewegt er sich nicht....das Problem muss an anderer Stelle liegen...
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5985
Herkunft: Leipzig

beantworten | zitieren | melden

Ich glaube, Palin hat Recht. Es heißt schließlich "Schritt"-Motor :)
Weeks of programming can save you hours of planning
private Nachricht | Beiträge des Benutzers
Doofit
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

@ Palin,
ich finde leider nichts dazu, wie und ob man die Stepanzahl hochstellen kann...aber es kann gut sein dass der Motor nur einen Step macht, das würde dieses "Zucken" erklären. Aber wenn das so ist, müsste ich ja einfach eine Schleife einfügen und dann müsste er unendlich viele Steps machen (bis ich die Schleife unterbreche) und letztendlich eine ganze Umdrehung schaffen, aber auch das funktioniert nicht
private Nachricht | Beiträge des Benutzers
Palin
myCSharp.de - Member



Dabei seit:
Beiträge: 1115

beantworten | zitieren | melden

Verwende doch mal die in der Doku angegebenen Testwerte.
Zitat
Neutral values
for test

320 steps,
600mm/min,
200 mm’s/sec/sec,
2 Step Pulse
2 Dir Pulse

Welche Bitwerte du dafür setzen musst kann ich dir aber nicht sagen ;). Da müsstest/sollte du aber auch eine Doku für haben.
Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern
private Nachricht | Beiträge des Benutzers
Doofit
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

Hat sich leider auch nach den veränderten Eingaben nichts geändert......ich weiß echt nicht was es sein könnte :(
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16109

beantworten | zitieren | melden

Zeig mal Deinen Code mit der Schleife.
Denn mit "geht nicht" kann keiner was anfangen.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Doofit
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

Hier mal der komplette Code:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace Schrittmotor_Versuch_2
{
    public partial class Form1 : Form
    {
        int x = 100;
        public Form1()
        {
            InitializeComponent();
        }

        private void btnZ_Click_1(object sender, EventArgs e)
        {
            lblAnzeige.Text = "Z-Achse";
            System.Threading.Thread.Sleep(x);
            PortAccess.Output(0x378, 0x20);
            for (int i = 0; i < 100; i++)
            {
                
                System.Threading.Thread.Sleep(x);
                PortAccess.Output(0x378, 0x40);
                System.Threading.Thread.Sleep(x);
                PortAccess.Output(0x378, 0x0);
                System.Threading.Thread.Sleep(x);
            }            
        }
        
        private void btnAus_Click(object sender, EventArgs e)
        {
            PortAccess.Output(0x378, 0);
            PortAccess.Output(0x37A, 0);
            lblAnzeige.Text = "Aus";
        }
    }
}

public class PortAccess
{
    [DllImport("inpout32.dll", EntryPoint = "Out32")]
    public static extern void Output(int adress, int value);
}


class CParallelPort
{
    // inpout32.dll muss im /bin/debug-Ordner vorhanden sein!
    // Dieser Code funktioniert nur mit Windows XP
    // Für Windows 7 wird eine 64-Bit-DLL inpoutx64.dll benötigt!
    [DllImport("inpout32.dll", EntryPoint = "Out32")]
    public static extern void Output(int adress, int value);
    [DllImport("inpout32.dll", EntryPoint = "Inp32")]
    public static extern int Input(int adress);
}
private Nachricht | Beiträge des Benutzers
ujr
myCSharp.de - Experte



Dabei seit:
Beiträge: 1770

beantworten | zitieren | melden

Ist es richtig, dass Du immer 0x0 ausgibst? Sollte nicht die Richtungsinformation erhalten bleiben und nur das Pulsbit alternieren?
private Nachricht | Beiträge des Benutzers
Doofit
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

Habe auch schon folgendes in der Schleife probiert:


PortAccess.Output(0x378, 0x40);
System.Threading.Thread.Sleep(x);
PortAccess.Output(0x378, 0x60);
System.Threading.Thread.Sleep(x);

Hat ebenfalls nicht funktioniert...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Doofit am .
private Nachricht | Beiträge des Benutzers
Palin
myCSharp.de - Member



Dabei seit:
Beiträge: 1115

beantworten | zitieren | melden

Zitat von Doofit
@ Palin,
ich finde leider nichts dazu, wie und ob man die Stepanzahl hochstellen kann...aber es kann gut sein dass der Motor nur einen Step macht, das würde dieses "Zucken" erklären. Aber wenn das so ist, müsste ich ja einfach eine Schleife einfügen und dann müsste er unendlich viele Steps machen (bis ich die Schleife unterbreche) und letztendlich eine ganze Umdrehung schaffen, aber auch das funktioniert nicht :(

Muss nicht sein, wenn du in die Doku schaust, siehst du, das der Motor die ersten paar Steps beschleunigt. Wenn die Geschwindigkeit beim ersten Step 0 ist bewegt er sich nicht. (Da er aber Rückelt würde ich davon ausgehen. Das sich das sich was bewegt (Newton) nur vielleicht nicht das was du erwartest.)

In deinem Beispiel sehe ich jetzt nicht, das du Standartwerte setzt. Grundlegend kann es sein das du den Motor erst mal in einen Programmierbaren Modus setzen musst um die Werte zu setzen und dann wieder zurücksetzen musst. Das sollte eigentlich dokumentiert sein.

Wenn du dazu keine Doku hast, gibt es z.B. die Möglichkeit sich mit einem Y-Cabel am Comport dazwischen zu hängen und z.B. mit RealTerm zu schauen, was das andere Programm, da sendet.

Da du einen Comport an deinen PC hängen kannst, solltest du wohl das am besten auch machen. Dann kannst du die Serial Port Klasse verwenden und bekommst gegebenen falls Rückmeldung (z.B. Error Recived).
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Palin am .
Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern
private Nachricht | Beiträge des Benutzers
Doofit
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

Mir ist noch etwas aufgefallen. Wenn ich den Motor ansteuern will - egal mit welcher Methode - liegt nur auf Pin 7, Pin 8 und GND Spannung an, auf Pin 1 jedoch nicht (Benennung nach Doku = http://www.savebase.com/infobase/downloads/breakout_board_stepper_driver/user_manual_5_axis_breakout_board.pdf ). Das heißt, wenn ich GND und Pin 7 oder Pin 8 mit den zwei Kabeln einer Spule des Motors verbinde, macht er einen Step (wenn das Programm währenddessen läuft). Verbinde ich aber - egal ob Pin 7, Pin 8 oder GND - mit Pin 1, passiert gar nichts mehr. Hat das was zu bedeuten? Muss ich irgendwie Spannung an Pin 1 bringen?

LG und danke für all die Antworten bisher ;)
private Nachricht | Beiträge des Benutzers
vbprogger
myCSharp.de - Experte

Avatar #avatar-1820.gif


Dabei seit:
Beiträge: 1723
Herkunft: NRW/DE

beantworten | zitieren | melden

Die Karte bekommt die Spannungsversorgung über USB, hast du die Karte _zusätzlich_ an USB des PC angeschlossen?
Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.
---------
Bemerkung: ich beantworte keine Fragen via PM, denn das Forum soll ja was davon haben!
private Nachricht | Beiträge des Benutzers
Palin
myCSharp.de - Member



Dabei seit:
Beiträge: 1115

beantworten | zitieren | melden

Dann rufe die Methode doch einfach mal mit 00100001 auf.

Ich halte es aber immer noch für besser raus zu bekommen was das funktionierende Programm sendet.
Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern
private Nachricht | Beiträge des Benutzers
Doofit
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

Ja die Karte ist via LPT und USB angeschlossen.

Palin, kannst du das evtl etwas genauer ausführen? Ich kenne dieses Programm gar nicht.
private Nachricht | Beiträge des Benutzers
Palin
myCSharp.de - Member



Dabei seit:
Beiträge: 1115

beantworten | zitieren | melden

Hi

du hast ja Mach3 (funktionierende Programm) welches wohl die Richtigen Befehle sendet. Wenn du zwischen Motor und PC ein Y-Carbel (wirst du im Zweifel Kaufen müssen) hängst. Kannst du z.B. mit RealTearm (gibt es kostenlos) schauen, was da an den Motor gesendet wird.
Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern
private Nachricht | Beiträge des Benutzers
Doofit
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

Hi,
so, ich bin jetzt umgestiegen auf eine USB Steuerkarte mit Stepperdrivern inklusive der Motoren. Mit dem mitgelieferten Testprogramm kann man die Motoren auch wunderbar bewegen. Das möchte ich allerdings natürlich durch mein eigenes Programm machen. Hat jemand Beispiele, Links, etc. zu der Ansteuerung vom USB-Port über C#? Hab auch schon Google gefragt, aber zur Ansteuerung via USB gibt es gar nicht so viel wie zum LPT-Port, ist ja klar, der LPT existiert schon etwas länger :D Aber da mich dieser echt zur puren Verzweiflung bringt, versuche ich es nun mit USB.

Danke :)
private Nachricht | Beiträge des Benutzers
manullino
myCSharp.de - Member

Avatar #avatar-2873.jpg


Dabei seit:
Beiträge: 373
Herkunft: Oranjestad, Aruba

beantworten | zitieren | melden

Hallo doofit,

hast du das Board mitterweile zum Leben erweckt?


Gruesse,
Manullino
private Nachricht | Beiträge des Benutzers