Forum: Mikrocontroller und Digitale Elektronik Schrittmotor, kurze Ruckler in der Beschleunigungphase


von Tom (Gast)


Angehängte Dateien:

Lesenswert?

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

von aSma>> (Gast)


Lesenswert?

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
}

von Georg (Gast)


Lesenswert?

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

von Tom (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.