Forum: Mikrocontroller und Digitale Elektronik Schrittmotor-Steuerung


von Maxi Melzer (Gast)


Lesenswert?

Guten Abend,

wir haben in der Arbeit ein kleines Projekt gestartet und ich wollte 
Euch nur kurz bitten euren Senf dazu zu geben =) Also wenn wer eine Idee 
hat immer her damit !

Kurz zum Projekt:
Miniatur 6Achs-Roboter um Firmen-Intern Know-How zu sammeln.
Vorerst sollte es aber nicht zuviel kosten.

Unsere Idee:

Ein ganz normaler PC errechnet die Verfahrwerte jeder Achse, also wie 
viel Grad sich die Geschichte drehen soll. Diese Daten werden dann, für 
alle Achsen in einem Block der wie folgt aussieht
Achse[i](Vorschub mm/min) (Winkelwert °) (WinkelRichtung +/-) 
(RampenWert %)
an ein Raspberry PI gesendet. Also alle erforderlichen Daten für den 
kompletten Bewegungszyklus. Auf welche Art genau wissen wir noch nicht.
Dieses verteilt dann den jeweiligen Block an die betreffende 
Achs-Steuerung und Arbeitet sich durch, wie bei einem NC-Programm.

Die Steuerung ist für jede Achse gleich und soll wie folgt aussehen:
Ein Arduino Nano empfängt die Daten und berechnet die Rampen etc.
Aus dem Vorschub/min wird dann eine Frequenz errechnet die über einen 
SPI-Interface an einen programmierbaren Frequenzgenerator gesendet wird. 
(AD 9833+ OpAmp 3mal +1 gain um auf 5V TTL zu kommen)
Programmierbar um eben die Frequenz im Betrieb hoch- bzw runterzuregeln 
um die Rampe zu erzeugen.
Der gibt dann das eigentliche Step-Signal an die Motor-Endstufe.
Der Arduino übernimmt während dieses Vorgangs die Soll-Ist Abfrage vom 
Motor-Encoder(5V TTL 4000i/u) und positioniert den dann falls kleine 
Fehler auftreten.

Auch überwacht Er über die Analog Eingänge die Temperatur an der 
Endstufe, am Motor, am Arduino selbst und in der näheren Umgebung im 
Schaltschrank.
Drehrichtung und DE/EN wird halt auch vom Arduino übernommen.
Die Temperatur-Werte und noch n bissel andres Zeug schickt der Arduino 
nach jedem empfangenen Block mit einer Quittierung des Blocks an den PI 
zurück.

Das Raspberry PI übernimmt die komplette Peripherie, soll heißen:
Not-Aus, Stromüberwachung, Temperatur Überwachung, TeachIn etc etc.


Soweit unsere Idee.

Jetzt zurück zum Anfang!
Ist das überhaupt machbar? Wenn ja =>
Was haltet Ihr davon?
Was kann man besser machen?
Was ist gut?
Zu Aufwendig?
Gibt es effizientere Wege (Soll erstmal nicht zu teuer werden, daher der 
Eigenbau)?


Vielen Dank für jeden Kommentar im voraus !
Und nein, uns ist nicht mehr zu helfen =D

von Thorsten O. (Firma: mechapro GmbH) (ostermann) Benutzerseite


Lesenswert?

Das halte ich für viel zu kompliziert. Warum ein Arduino pro Achse, wenn 
man das auch mit 1-2 Controllern für alle Achsen zusammen machen kann? 
Und warum erzeugst du die Taktfrequenz nicht direkt mit dem Controller? 
Wie soll der denn vernünftig nachregeln, wenn er dafür erst noch einen 
externen Taktgeber beeinflussen muss?

KIS - Keep it simple! Ihr wollt ja keine Mondlandfähre bauen ;)

Mit freundlichen Grüßen
Thorsten Ostermann

von Noch einer (Gast)


Lesenswert?

Das GRBL ist recht übersichtlich aufgebaut. Da lassen sich auch die 
Einzelteile des Quellcodes benutzen.
https://github.com/grbl/grbl

Beschleunigungsrampen zusammensetzen und 3 Schrittmotore synchron 
ansteuern - alles auf einem Arduino.

von Maxi Melzer (Gast)


Lesenswert?

Danke erstmal für euren Input!


"Und warum erzeugst du die Taktfrequenz nicht direkt mit dem 
Controller?"

Wie macht man das? Was hat man für Möglichkeiten? Ein PWM-Signal 
herzunehmen ist mir auch schon durch den Kopf gegangen aber ein Arduino 
ist dafür nicht geeignet, deswegen haben wir das verworfen.



"Wie soll der denn vernünftig nachregeln, wenn er dafür erst noch einen
externen Taktgeber beeinflussen muss?"

Kannst du mir bitte genauer erklären wie du das meinst?
Wir stellen uns da so vor :

BlockDaten kommen zum Arduino
=>
Aus Vorschub/min wird eine Frequenz[x] für die Endstufe errechnet.
=>
Frequenz wird auf 0 gestellt und dann stufenlos bis X hochgeregelt.
Ungefähr so:
//Für jedes setFreq(); muss man 28BIT via SPI an den Chip senden. Das 
dürfte nicht zu lange dauern, denke ich.


setFreq(0);
for ( i= 0; i <??; i++){
setFreq(i);
delay(1);
}
==> hier ist die 10% Rampe zu Ende

setFreq(Verfahrgeschwindigkeit für die mittleren 80% der Strecke)

==> und dann wie gerade eben eine 10% Rampe zum abbremsen

//Aus Encoder-Werten lesen wie weint man vom Soll-Wert weg ist
//und dann mit einer kleinen Frequenz(500-1000Hz) zum Soll-Wert fahren.

==>

//Block beendet an Raspberry PI senden, mit Achsname und Kontrollwerten.

==> nächster Block =)


Sollte halt eine Rampe rauskommen.

Währenddessen überwacht er den Encoder um so nahe wie möglich an den 
Soll-Wert zu kommen.

Und wir wollten einen Nano pro Achse verwenden, um nur einen seeeeehr 
einfachen Code schreiben zu müssen der dann Universell einsetzbar ist. 
Auch würde die Platine dafür perfekt neben die Endstufe auf die 
Hut-Scheine passen.




Dieses GRBL sieht interessant aus, aber ist das nicht nur was für 
Werkzeugmaschinen? Das an unsere Bedürfnisse anzupassen wäre doch viel 
Aufwendiger, oder irre ich mich?
Ich bin dir sehr dankbar für den Tipp und werde es mir anschauen =)


Was gibt es denn noch für Möglichkeiten ein regelbares TTL 
Rechtecksignal zu erzeugen?
Mir fällt nur das PWM-Signal ein, welches aber beim Arduino wegen zu 
kleiner Frequenz ausfällt(max 65kHz). Wir wollten bis Minimum 1MHz 
(Ergibt bei 16x Microstepping und 1,8° Motor 1875 u/min). Um anständig 
fahren zu können, ihr versteht =)

Das mit dem stark fallendem Drehmoment bei dieses Umdrehungszahlen haben 
wir bedacht und durch eine ausreichende Übersetzung bereinigt =D
Später wenn das alles weiter ist werden wir dann wohl auch Servos 
verwenden.

Oder man erzeugt jedes Taktsignal mit dem Arduino selbst an einem Pin, 
aber schafft der da die 1MHz und kann währenddessen noch einen Encoder 
mit 4000i/u auswerten?

Wir sind wie gesagt noch auf der Suche nach einer Lösung!
Vielen Dank für die Tipps das hilft schon mal weiter.

von Maxi Melzer (Gast)


Lesenswert?

Maxi Melzer schrieb:
> Und wir wollten einen Nano pro Achse verwenden, um nur einen seeeeehr
> einfachen Code schreiben zu müssen der dann Universell einsetzbar ist.
> Auch würde die Platine dafür perfekt neben die Endstufe auf die
> Hut-Scheine passen.


Eins hab ich vergessen =D

Jede Achse hat ja unterschiedliche Verfahrgeschwindigkeiten, also 
braucht man wenn man das mit 2 Arduino's macht jeweils 3 Taktsignale mit 
unterschiedlicher Frequenz. Wie gesagt bis 1MHz. Dazu dann noch drei 
Encoder auswerten und verrechnen. Wird das nicht zuviel für einen 
Arduino?

Eine Idee hab ich auch noch:

Zwei Arduinos übernehmen alle sechs Achsen und ein dritter wertet die 
Encoder aus. Die Werte müssten dann aber halt wieder verschickt werden, 
was eine Menge Traffic nach sich ziehen würde. Lieg ich mit der 
Behauptung soweit richtig?
Gerade weil alleine durch die vielen Positions-Werte die verschickt 
werden eh einiges los ist (Wollen auch komplexe 3D Bahnen abfahren).

von m.n. (Gast)


Lesenswert?

Maxi Melzer schrieb:
> Wir wollten bis Minimum 1MHz
> (Ergibt bei 16x Microstepping und 1,8° Motor 1875 u/min). Um anständig
> fahren zu können, ihr versteht =)

Ich wollte ja noch mehr schreiben, aber wenn ich diese komischen Zahlen 
nachrechne, komme ich auf 18750 Upm. Mich würde der Motor interessieren, 
der so 'zügig' dreht.

Ich melde mich wieder, wenn die Taktrate <= 50 kHz liegen wird ;-)

von Bülent C. (mirki)


Lesenswert?

Maxi Melzer schrieb:
> Wie gesagt bis 1MHz.

Bist Du Dir da sicher, das Du den Stepper bis 1MHz takten möchtest?

Maxi Melzer schrieb:
> (Ergibt bei 16x Microstepping und 1,8° Motor 1875 u/min). Um anständig
> fahren zu können, ihr versteht =)

Wie kommst Du eigentlich auf diese Berechnung?

Maxi Melzer schrieb:
> Mir fällt nur das PWM-Signal ein, welches aber beim Arduino wegen zu
> kleiner Frequenz ausfällt(max 65kHz).

PWM???? Bitte nicht!!


Fangt mal klein an, und versucht zu verstehen, wie ein Stepper und 
dessen Treiber aufgebaut sind und wie sie funnktionieren.

: Bearbeitet durch User
von Maxi Melzer (Gast)


Lesenswert?

Danke für eure Beiträge m.n. und Bülent.

Muss ich mich wohl von 1MHz auf 100kHz runter korrigieren. Diese 
verdammten Nachkommastellen =D

Rechnung sieht wie folgt aus:

1875U/Min => 31,25U/Sekunde

31,25U/Sekunde * 200Schritte/Umdrehung => 6250 TaktSignale pro Sekunde

6250Taktsignale pro Sekunde * 16Fach MikroStepping => 100.000 
TaktSignale pro Sekunde

== 100kHz

Ist das diesmal korrekt oder vertue ich mich schon wieder?

War mein Fehler, wie gesagt wir Sammeln noch Erfahrung.

Dennoch würde es mich sehr freuen wenn ihr beiden vielleicht noch den 
einen oder anderen Tipp für uns habt!

Danke

von Chefentwickler (Gast)


Lesenswert?

Nimm ein BLDC-Motor.

von Thorsten O. (Firma: mechapro GmbH) (ostermann) Benutzerseite


Lesenswert?

1875 U/min musst du mit einem Schrittmotor erst einmal erreichen. 
Vergiss nicht, dass dann kaum noch Drehmoment zur Verfügung steht.

Und wenn du das schaffst, brauchst du auch kein 1/16-tel Schritt mehr, 
weil die Stromregelung dann längst nicht mehr greift. Falls im unteren 
Drehzahlbereich trotzdem 1/16 gewünscht sein sollte, könnte man 
dynamisch umschalten. Aber das kann GBRL dann sicherlich nicht mehr ohne 
Anpassung.

Was soll das eigentlich für ein Roboter werden, der 6 Achsen benötigt, 
die mit jeweils 1875 U/min angetrieben werden?

Mit freundlichen Grüßen
Thorsten Ostermann

von Maxi Melzer (Gast)


Lesenswert?

Danke für Eure Beiträge,

Chefentwickler schrieb:
> Nimm ein BLDC-Motor.

Daran haben wir Anfangs auch gedacht.
Leider haben BLDC-Motoren für unser Vorhaben zu wenig Drehmoment und 
sind mit komplettem Equipment meines Wissens nach zu teuer. Auch ist die 
enorme Stromstärke durch unsere beschränkten finanziellen Mittel ein 
Problem.
Korrigiert mich bitte wenn ich mich irre, denn wenn ich mich irre ist 
das eine Gute Alternative.




Thorsten Ostermann schrieb:
> Und wenn du das schaffst, brauchst du auch kein 1/16-tel Schritt mehr,
> weil die Stromregelung dann längst nicht mehr greift. Falls im unteren
> Drehzahlbereich trotzdem 1/16 gewünscht sein sollte, könnte man
> dynamisch umschalten.

Das hört sich nach einer guten Idee an !! Das werden wir mal weiter 
verfolgen.

Thorsten Ostermann schrieb:
> Was soll das eigentlich für ein Roboter werden, der 6 Achsen benötigt,
> die mit jeweils 1875 U/min angetrieben werden?

Nur ein Prototyp um wie oben genannt Know-How zu sammeln.
Ich weis, hört sich äußerst ambitioniert an....
Aber wer nichts wagt der nichts erreicht =)

Die 1875u/min kommen durch die hohen Untersetzungen zu Stande und ist 
auch das Maximum was wir uns wünschen. Also für die unteren Achsen. Für 
die vorderen wird es dank der kleineren Untersetzung und des weniger 
benötigten Halte-/Drehmoments eine kleinere Motor Drehzahl sein.
Aber wie das !immer! ist wird eh weniger rauskommen =)

Die Untersetzungen liegen zwischen 1:8 (6Achse) und 1:20(1Achse) um vom 
Bauraum her kleiner Motoren verwenden zu können und trotzdem das 
benötigte Drehmoment zu erreichen.

Unsere Überlegung:
Bei der 1Achse z.b soll ein NEMA 34 mit 9Nm Haltemoment (mit US 1:20 ca. 
180Nm) zum Einsatz kommen.
Laut Nanotec.com hat der bei 48V Parallel Versorgung bei n=1000u/min
zwar nurnoch 1,35Nm (mit US 1:20 ca. 27Nm) Drehmoment aber 
logischer-Weise annähernd seine volle Leistung. Mehr brauchen wir ja 
nicht. Ist die Last (über die Rampe erst einmal beschleunigt) hilft uns 
die Trägheit weiter und wir brauchen keine hohen Momente mehr, nur 
Drehzahl. So sieht unser Plan zumindest aus. Und das abbremsen kriegen 
wir auch irgendwie hin, zur Not verlängern wir die Brems-Rampe, oder 
bauen gleich was Mechanisches dazu.

Zur Untersetzung werden wir wohl Zahnriemen verwenden, da diese leicht, 
billig und Einfach zu verwenden sind. Auch zeichnen sie sich durch einen 
guten Wirkungsgrad aus und sind absolut (Die hundertstel oder 1/1000mm 
vernachlässigen wir mal =D ) spielfrei.

Erklärung:
Eine Drehzahl von 1000U/Min wird schätzungsweise am Ende rauskomen, 
trotz angepeilten 1875U/Min.
Bei n=1000 schaffen wir trotz 1:20 Untersetzung 300°/Sekunde ohne Rampe 
etc pipapo. Das reicht uns erstmal. Langsamer geht immer und wenn wir 
schneller werden wollen kommt wieder das mit dem Know-How sammeln ins 
Spiel.

Rechnung:
1000 U/Min / 60 ==> 16,666U/Sekunde(motor)
16,6U/Min(Motor) / 20  ==> 0,833 U/Sekunde (Achse)
=>(Untersetzung 1:20)

0,833U/Sekunde (Achse) *360° = 300°/Sekunde(Achse)

Ich denke diesmal hab ich mich nicht verrechnet =)

Ich hoffe ich konnte Euch einen besseren Überblick zu unserem Vorhaben 
geben.


So zu zurück zum eigentlichen Thema:
Ich stell mir das nun so vor:

1Nano pro Achssteuerung
     =>4 DPins für die Codierung des uSteppings
     =>  SPI an AD9833 um eben die RechtEck-Taktfrequenz erzeugen zu 
können.
     =>2 DPins für DIR und DE/EN
     =>4 APins für Temperatur Überwachung etc.

Das alles um die Flexibilität und Einfachheit des Codes zu 
gewährleisten. Auch wegen den Kosten (Ein Nano kostet nur 5€ soweit ich 
mich erinnere). Das ganze andre Zeugs nochmal 15€ ==> 20€ 
Achs-Controller in den man ohne Ende Softwaremäßige Features einbauen 
kann, wenn man will. Zusätzlich ist noch Platz für endlos elektronische 
Peripherie. Aber das ist Zukunftsmusik. Und der Kernpunkt, ein auf 0.004 
Hz genaues TaktSignal. Das benötigen wir, da wir auch komplexe Stecken 
möglichst präzise abfahren wollen. (Man denke an Vermessung von 
Werkstücken, Freiform-Bearbeitung im Modellbau etc.
!Wie gesagt Zukunftsmusik!)

Zitat AD Datasheet:
"with a 1 MHz clock rate, the AD9833 can be tuned to 0.004 Hz 
resolution."

Bei 4/1000Hz kommt mir das mit den Kanonen und Spatzen in den Sinn, aber 
schaden wird es auch nicht!

Wenn Euch was bessere einfällt bin ich dankbar um jeden Tipp!
Wie ihr seht, setze ich mich auch ernsthaft damit auseinander, da wir ja
Know-How sammeln wollen =)

Vielen Dank

von m.n. (Gast)


Lesenswert?

Es ist wohl wieder Karneval.

Bring erst einmal irgendeinen Schrittmotor zum Drehen. Mehr fällt mir 
dazu nicht ein.

von Maxi Melzer (Gast)


Lesenswert?

m.n. schrieb:
> Es ist wohl wieder Karneval.

Es tut mir sehr leid das du so denkst, aber könntest du mir bitte auch 
sagen wieso du uns für so unfähig hältst?
Wir sind vielleicht keine Experten oder haben die Weisheit gar mit 
Löffeln gefressen.....=> Genau deswegen gibt es diesen Topic also 
verzeih mir wenn ich Stuss rede.


Falls dir aber doch noch etwas konstruktives einfallen sollte, bedanke 
ich mich schon einmal im Voraus!

von Thorsten O. (Firma: mechapro GmbH) (ostermann) Benutzerseite


Lesenswert?

Für eine Untersetzung 1:20 benötigst du aber schon zwei Riemenstufen. 
Und bei den Leistungen die ihr da abrufen wollt (140W mechanisch), 
solltet ihr ernsthaft darüber nachdenken, ob Schrittmotoren die richtige 
Technologie sind. Schließlich benötigt ein mobiler Roboter auch 
Batterien, welche die Leistungs zur Verfügung stellen. Wenn es 
Schrittmotoren sein sollen, würde ich eine Steuerung verwenden, die 
echten closed-loop Betrieb erlaubt. Und ja, eine Steuerung für 5-8A bei 
48V mit closed-loop gibt es auch nicht geschenkt. Da sind die paar € 
mehr oder weniger für ein oder zwei zusätzliche Controller Peantus.

Schade dass du nicht mehr über den Verwendungszweck des Roboters 
schreiben kannst/willst. Aus Spaß am Basteln investiertert keine Firma 
Geld in so ein Projekt. Also sollte man es gleich vernünftig aufziehen. 
Und dazu gehören Lasten- und Pfichtenheft, damit die Anforderungen und 
der vorgesehene Lösungsweg klar definiert sind. Aber wenn noch nicht 
einmal die Grundlagen in Sachen Antriebstechnik vorhanden sind läuft das 
wohl eher auf "Jugend forscht" hinaus, als auf ein Projekt, mit dem ein 
konretes Ziel erreicht werden soll. Wahrscheinlich macht sich die 
Projektleitung da ziemlich falsche Vorstellungen von der Komplexität der 
Aufgabenstellung.

Mit freundlichen Grüßen
Thorsten Ostermann

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.