Laden...

Schrittmotor ansteuern, Motor bewegt sich nicht?

Erstellt von Doofit vor 8 Jahren Letzter Beitrag vor 7 Jahren 7.629 Views
D
Doofit Themenstarter:in
13 Beiträge seit 2015
vor 8 Jahren
Schrittmotor ansteuern, Motor bewegt sich nicht?

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...

463 Beiträge seit 2009
vor 8 Jahren

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?

D
Doofit Themenstarter:in
13 Beiträge seit 2015
vor 8 Jahren

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.

5.657 Beiträge seit 2006
vor 8 Jahren

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:

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

D
Doofit Themenstarter:in
13 Beiträge seit 2015
vor 8 Jahren

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?

5.657 Beiträge seit 2006
vor 8 Jahren

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

P
1.090 Beiträge seit 2011
vor 8 Jahren

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

D
Doofit Themenstarter:in
13 Beiträge seit 2015
vor 8 Jahren

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... 🤔

5.657 Beiträge seit 2006
vor 8 Jahren

Ich glaube, Palin hat Recht. Es heißt schließlich "Schritt"-Motor 😃

Weeks of programming can save you hours of planning

D
Doofit Themenstarter:in
13 Beiträge seit 2015
vor 8 Jahren

@ 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 🙁

P
1.090 Beiträge seit 2011
vor 8 Jahren

Verwende doch mal die in der Doku angegebenen Testwerte.

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

D
Doofit Themenstarter:in
13 Beiträge seit 2015
vor 8 Jahren

Hat sich leider auch nach den veränderten Eingaben nichts geändert......ich weiß echt nicht was es sein könnte 😦

16.806 Beiträge seit 2008
vor 8 Jahren

Zeig mal Deinen Code mit der Schleife.
Denn mit "geht nicht" kann keiner was anfangen.

D
Doofit Themenstarter:in
13 Beiträge seit 2015
vor 8 Jahren

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);
}

U
1.688 Beiträge seit 2007
vor 8 Jahren

Ist es richtig, dass Du immer 0x0 ausgibst? Sollte nicht die Richtungsinformation erhalten bleiben und nur das Pulsbit alternieren?

D
Doofit Themenstarter:in
13 Beiträge seit 2015
vor 8 Jahren

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...

P
1.090 Beiträge seit 2011
vor 8 Jahren

@ 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).

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

D
Doofit Themenstarter:in
13 Beiträge seit 2015
vor 8 Jahren

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 😉

1.696 Beiträge seit 2006
vor 8 Jahren

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.

**:::

P
1.090 Beiträge seit 2011
vor 8 Jahren

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

D
Doofit Themenstarter:in
13 Beiträge seit 2015
vor 8 Jahren

Ja die Karte ist via LPT und USB angeschlossen.

Palin, kannst du das evtl etwas genauer ausführen? Ich kenne dieses Programm gar nicht. 🙁

P
1.090 Beiträge seit 2011
vor 8 Jahren

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

D
Doofit Themenstarter:in
13 Beiträge seit 2015
vor 8 Jahren

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 😄 Aber da mich dieser echt zur puren Verzweiflung bringt, versuche ich es nun mit USB.

Danke 😃

371 Beiträge seit 2008
vor 7 Jahren

Hallo doofit,

hast du das Board mitterweile zum Leben erweckt?

Gruesse,
Manullino