Werte Schrittmotor Freunde, Problem: Bei der linearen Beschleunigung eines Schrittmotors sind leichte Ruckler hörbar. Verwendet wird ein ATMEGA16+OrientalmotorTreiber+Nema23 Ich bastel aktuell an einer Rohrpoliermaschine. Hauptsächlich des bastelns wegen ;-) In meinem aktuellen Code ist der Beschleunigungsalgorithmus aus folgenden 2 Dokumenten integriert: - AVR446 Application Note von ATMEL - David Justin: Generate stepper motor speed profiles in real time. Das Geschwindigkeitsprofil wird in Echtzeit berechnet. Der Timer läuft im CTC-Modus, der OCR1A-Wert wird ständig neu berechnet und definiert die Taktung. Steuerung des Motors über Takt + Richtung. Nun läuft der Motor eigentlich smooth an, es sind jedoch ab und an "Ruckler" drin. Die Ruckler treten nach dem Zufallsprinzip auf, ich erkenne kein Muster. Das Problem ist mit einer anderen billigen Treiberstufe sowie einem anderen Schrittmotor (China Nema 17) reproduzierbar. Ich schließe Treiber+Motor demnach als Grund aus. Ich weiß, dass man auch vorberechnete Arrays mit den Timerwerten für eine Beschleunigung hinterlegen könnte, ich möchte die Rampe aber bewusst in Echtzeit berechnen. Ich könnte mir vorstellen man braucht tiefe Hardwareprogrammierkentnisse um das Problem zu lösen. Und genau da setzts bei mir aus... Den Code hab ich hinterlegt. Aktuell beschleunigt der Motor bei Tastendruck und stoppt apprupt (ohne Decel-Rampe) wenn die Taste losgelassen wird. Evtl. hat jemand nützliche Tips, wäre echt super :-) Grüße, Tom
Servus, welche Treiber hast du jetzt? Die chinesischen machen oftmals Probleme. Um Softwarefehler auszuschließen, würde ich einfach mittels Debugger prüfen oder einfach eine Tabelle anlegen (uart und co.) unsigned int min(unsigned int x, unsigned int y) geht auch kürzer:
1 | unsigned int min(unsigned int x, unsigned int y){ |
2 | return (x<y) ? x : y; |
3 | }
|
Tom schrieb: > der OCR1A-Wert wird ständig neu berechnet Kannst du dir diese Werte nicht zur Kontrolle ausgeben lassen (z.B. über serielle Schnittstelle), ob da ungewollte Stufen drin sind? Oder andersrum mal nach Tabelle hochfahren, wie schon vorgeschlagen. Für eine lineare Rampe folgen die Timer-Werte einer 1/x-Funktion. Georg
Servus Zusammen, danke für die schnellen Antworten! @aSma: - kürzeren Code implementiert, Danke für den Tipp! - Verwende die Treiberplatine von Orientalmotor CVD228. Der Chinesische Treiber hat nen THB7128 Chip drauf. Bei beiden Triebern verhält sich der Motor gleich. Ich schließe den Treiber als Problemursache demnach aus. - ich werd mal ne vorberechnete Tabelle implementieren. Mal schaun wie da das Verhalten ist. @Georg: - hab die Rampe mal in Excel abgebildet. Astreine Kurve, ohne Stufen oder dgl. Wie auch aSma meinte werde ich das mit der vorberechneten Tabelle mal implementieren. Werde auch mal mit UART rumspielen, hab da noch keine Erfahrung. Ich meld mich wenn es wieder Neuigkeiten gibt. Tom
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.