Hallo, ich steuere einen Schrittmotor mit einem Timerinterrupt an. Ich gebe die Schrittzahl und eine 8Bit Zahl für die Geschwindigkeit an die Routine. Nun möchte ich aber den Schrittmotor mit Rampen anfahren und bremsen lassen. Wie kann ich die Rampen berechnen?? Es könnte ja z.B. sein, dass ich nur ein paar wenige Schritte habe wo die max. Geschwindigkeit gar nicht erreicht wird, und vorher schon wieder gebremst werden soll. Hat jemand Tipps, wie ich da rangehe?? Gruss
der rampenrutine wird ein sollwert übergeben, auf den die schrittgeschwindigkeit langsam zuläft. soll doch früher gebremst werde, muss das auch signalisiert werden
Hi AVR446: Linear speed control of stepper motor on tinyAVR and megaAVR devices http://www.atmel.com/dyn/resources/prod_documents/doc8017.pdf http://www.atmel.com/dyn/resources/prod_documents/AVR446.zip MfG Spess
Das hat mir geholfen: http://www.eetimes.com/design/embedded/4006438/Generate-stepper-motor-speed-profiles-in-real-time Hier kannste ein Demo-Codeschnipsel runterladen: http://www.eetimes.com/design/embedded/source-code/4210291/Motor-c Mit einem Mega2560@14.7456 MHz steuere ich 4x IMT901 an, mit Rampenberechnung zur Laufzeit also keine Tabelle. Befehle kommen über UART-IRQ rein. Funzt für langsame bis mittlere Geschwindigkeit mit 4 Motoren gleichzeitig ganz gut. Für schnelle Bewegungen habe ich die Berechnung durch eine Tabelle ersetzt. Die Bewegung ist nicht ganz so "smooth" aber erfüllt ihren Zweck.
Bei linearer Beschleunigung steigt die Geschwindigkeit=Frequenz proportional mit der vergangenen Zeit. D.h. proportional zu der Summe aller bisherigen Timer-Werte, die eine Step-IRQ ausgelöst haben. Die Zeit bis zum nächsten Timerinterrupt berechnet sich zu: newtimer=konst1/(timersumme+=oldtimer);oldtimer=newtimer; Man startet aber i.d.R. nicht mit 0 Hz, sondern mit einer Startfrequenz im Bereich von 400 - 2000 Hz, je nach Qualität von Motor und Treiber, Höhe der Vcc und der mechanischen Last (Trägheitsmoment). Andere Vorgehensweise: In meiner aktuellen DDS-Version erzeuge ich die beiden Phasenstromwerte aus einer sin- und aus einer cos-Lookup-Table: Phase1=sinTab[index=highword(istpos+=speed+=accel)&127}; Phase2=cosTab[index]; Wenn ich an einem bestimmten Punkt halten will, begrenze ich speed auf einen zum Abstand proportionalen Wert. if(abs(speed)>abs(sollpos-istpos)){speed=konst2*(sollpos-istpos);} Damit wird speed genau 0, wenn ich am Ziel angekommen bin. Die Drehrichtung ist das Vorzeichen von speed, Beschleunigung / Verzögerung ergibt sich aus dem Vorzeichen von accel. Hört sich einfach toll an, wenn der Motor innerhalb von wenigen Umdrehungen absolut linear von der max. neg. Geschwindigkeit auf max. pos. Geschwindkeit (bei mir 3000 rpm) beschleunigt.
Ich beschäftige mich auch gerade mit der Erstellung eines Schrittmotorcontrollers. Daher würde mich interessieren, ob schon jemand den Code von David Austin(http://www.eetimes.com/design/embedded/source-code/4210291/Motor-c) für einen AVR portiert hat. Wenn ja würde ich mich über Ansätze freuen. Grüße Peter
@Peter Simen Svale Skogsrud hat ein C-Project realisiert, in dem er mit einem ATmega168 / ATmega 328 (16MHz) die drei Vektoren einer CNC-Fräse steuert(Arduino). Es interpretiert ein paar Grundbefehle der G-Code Steuersprache, so wie sie z.B. auch von Eagle oder SPrint(Isolationsfräsen) exportiert werden können. Das Video ist hier zu finden: http://dank.bengler.no/-/page/show/5470_grbl?ref=mst Es ist ein Open Source Projekt, der Sourcecode ist hier zu finden: https://github.com/simen/grbl Hieraus kann man viel über das Ansteuern von Schrittmotoren lernen - Timer, Rampen etc. Habe das mal nachgebaut mit dem pollin Evaluation Board und Stepper(end)stufen mit dem L297 und L298 - mehr braucht man nicht.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.