Pulsgenerator CNC-Steuerung

Hallo liebe Forum-User,

ich möchte einen Schrittmotortreiber mit meinem Arduino Duemilanove ansteuern. Um dies zu realisieren muss ich ein Rechtecksignal erzeugen, das eine Pulsweite von min. 5µs hat. Benutze ich die Methode delayMicroseconds() in einer Methode wie dieser: void Puls() { digitalWrite(2,HIGH); delayMicroseconds(5); digitalWrite(2,LOW); delayMicroseconds(5); } bekomme ich kein adäquates Rechtecksignal, da z.B. digitalWrite() ebenfalls Zeit benötigt. =(

[u]Kann mir jemand sagen, wie ich ein exaktes Rechtecksignal hinbekomme, ich wäre sehr dankbar dafür!?[/u] XD

Du könntest versuchen, die Ports direkt anzusprechen, das sollte einen gewissen Geschwindigkeitsschub bringen: http://www.arduino.cc/en/Reference/PortManipulation

Jau, danke. Der Motor läuft schon wesentlich besser.

Jedoch bekomme ich noch immer kein tolles Rechtecksignal :sleeping: . Ich glaube dass der wiederkehrende Aufruf der Endlosschleife so lange benötigt, dass er das Timing zwischen HIGH und LOW durcheinander bringt... Da reicht schon 1µs.

Das ist die Mindestlänge des Impulses. Du wirst den Motor sowieso nicht mit 100kHz ansteuern. Darum ist die genaue Impulslänge nicht so kritisch. Grüße Uwe

Macko400: Jedoch bekomme ich noch immer kein tolles Rechtecksignal

Verstehe ich nicht richtig... Wie sieht das Signal denn sonst aus?

Der Schrittmotor soll als Test mit 25000 Microsteps angesteuert werden (erledigt der Treiber).
Der Treiber müsste also 25000 HIGH-Impulse pro Sekunde bekommen um mit 60 Umdrehungen pro Minute zu laufen.
Die normale Drehgeschwindigkeit liegt laut Hersteller bei ca. 1000-1500 UpM, also max. 625000 High-Impulsen pro Sekunde.
Frequenz: 625kHz

Das Signal müsste so aussehen:


| || || || || |

Dadurch, dass das Timing mit der Schleife nicht passt, sieht es aber eher so aus:


| || || || || |

(beim folgenden Code:)

void Step()
{
while(true)
{
digitalWrite(2,HIGH);
delayMicroseconds(5);
digitalWrite(2,LOW);
delayMicroseconds(5);
}
}

P.S.: auch dieser Code hat das gleiche Problem:

void Step()
{
while(true)
{
PORTD = B00000100;
delayMicroseconds(5);
PORTD = B00000000;
delayMicroseconds(5);
}
}

Also geht es dir ein Puls-Pause-Verhältnis von 1:1 zu bekommen. Alles in allem ist das ja nur eine Spezialform eines Rechtecksignals. ;) Braucht man das tatsächlich? Ich bin immer davon ausgegangen, dass in diesem Anwendungsfall nur die auf eine steigende oder fallende Flanke getriggert wird. Warum muss das Verhältnis denn so genau sein?

Als "workaround" kannst du den 2. Pause-Wert ja kleiner machen z.B. delayMicroseconds(3); statt delayMicroseconds(5);, um das zusätzliche Delay durch die Programmstruktur auszugleichen.

Es ist so, dass diese Art von Motor im höheren Drehzahlbereich (+100 UpM) sehr empfindlich auf Signalstörungen reagiert, also Rechtecksignale, die nicht 1:1 sind. [außerdem ist der Motor so groß wie eine 0,5L-Dose und hat halt einiges an kinetischer Energie in sich]
Der Motor muss die Schritte sauber ausführen können und benötigt hierzu ein perfektes Timing.

Das mit dem Ausgleich wäre mal einen versuch wert. :wink:

Welchen Motor hast Du? Mit welchem Treiber steuerst Du ihn an? Grüße Uwe

Der Motor ist ein 3Nm starker Hybrid-Schrittmotor, der mit dem Microstep-driver DQ542MA (einfach 542M) angetrieben wird. Das Netzteil liefert eine Versorgungsspannung von 48V und leistet 10A maximale Stromstärke. Der Treiber selbst benötigt max. 4,2A.

Ich habe die Hauptfehlerquelle gefunden, die sehr unscheinbar ist. :fearful:

Der Motor trifft bei bestimmten Drehzahlen immer mal wieder seine Resonanzfrequenz (jaa, müsste ja eig. nur eine sein..) und blockiert dadurch.

Dadurch dass ich den Motor einmal sehr, sehr stark festgehalten habe und damit die Vibrationen verringerte, ließen sich auch hohe Drehzahlen erzielen.

Mir kommen 1000 bis 1500 RPM für einen Schrittmotor extrem viel vor. Bist Du sicher daß das nicht Schritte pro Sekunde sind (mit Vollschritt) Wenn man den Motor mit Microschritte betreibt dann multipliziert sich die max Schrittfrequenz mit den Microschrittanzahl.

Je höher die Frequenz ist desto niedriger ist der Strom im Motor weil die Induktivität der Stromänderung entgegenwirkt. Weil die Kraft des Motors proportional zum erzeugten Magnetfed ist und dieses proportional zum Strom ist, hat der Motor bei verminderten Strom auch weniger Kraft. Zusammenfassend das Drehmoment verringert sich mit der Drehgeschwindigkeit.

Welchen Motor hast Du? Ich hab kein Datenblatt des DQ542MA gefunden in dem die Timing bzw max Ansteuerfrequenz angegeben ist.

Grüße Uwe

Ich habe heute morgen mit dem Verkäufer des Motors telefoniert.
Er meinte dass der Motor im Normalbetrieb zwischen 1000-1500 UpM läuft, jedoch max. 8000 UpM kann (was ich aber eher weniger glaube).
Der Motor selbst ist ein Noname-Produkt aus China ohne Kennung.
Diese Daten sind mir jedoch bekannt:
Typ: Hybrid-Schrittmotor
Phasen: 2
Schrittwinkel: 1,8°
Spannung: 4,8V
Phasenstrom: 3A
Spulenwiderstand: 1,6 Ohm
Induktivität: 6,8 mH
Haltekraft: 3,0 Nm
Dynamische Kraft: 12,0 Ncm
Rotorträgheit: 810g /cm²
Gewicht: 1,65 Kg

Die Daten des Treibers findet man hier: http://www.kocomotion.de/fileadmin/pages/10_PRODUKTE/Leadshine/Datenblatt-Manuals/M542-V20-manual.pdf

Durch die Verringerung der Vibrationen [vorheriger Post von mir] steigt die maximale Umdrehungszahl wesentlich an.

Aus dem Datenblatt des Treibers:

Der PUL Eingang (STEP) ist flankengesteuert (einstellbar über internen Jumper auf H-L oder L-H) Darum ist das Duty Cycle Verhältnis relativ egal; es muß nur mindestens 1,5µS H bzw L sein.

Zum Timing des Pul Impulses; H- und L-Zeit min 1,5µS; DIR (Drehrichtung) muß 5µS vorher anliegen.

Pulse input frequency up to 300 KHz . Ich weiß nicht ob das bei der Höchsten Microstep-Einstellung gilt oder über alle Step-Modi.

Motordaten sind dürftig. ein Drehmoment-Drehzahl-Kurve würde helfen.

Grüße Uwe

Ja, leider ein wenig Hong-Kong-Style. Aber für den Preis beklage ich mich nicht, auch wenn die wichtigen Datenblätter fehlen. :disappointed_relieved:

Ich habe es nun geschafft bei 5000 Microsteps und einer Pulsweite von 10µs (HIGH), bzw. 2µs (LOW) eine Drehzahl von 1010 UpM zu erreichen. Sorry... mit dem 1:1 Rechtecksignal habe ich mich geirrt, die positive Flanke ist relevant. :sweat_smile:

[u]Resultat:[/u] Es liegt eindeutig an den Vibrationen, die der Motor erzeugt. Werde ihn wohl einzementieren müssen oder zumindest eine gute Halterung bauen. :D Nichts desto trotz werde ich die Signale am Wochenende noch einmal mit einem Oszilloskop unter die Lupe nehmen.

Schon einmal vielen Dank für eure Hilfe, vorallem an uwefed. Ich halte das Forum über die Tests auf dem Laufenden. ;)

Kontrollierst Du bitte mal den Wicklungswiderstand des Motors ob der mit den Daten zusammenstimmt. Grüße Uwe

Jede Spule hat bei Zimmertemperatur einen Widerstand von 2,0 Ohm. Stimmt also mit den angegebenen 1,6 Ohm [+-10%] nicht überein.

Welchen Widerstand haben die Meßkabel?
Grüße Uwe