Schrittmotor fällt aus - verursacht durch PWM oder anderes?

Wie bei meiner ursprünglichen Frage unter raspberrypi.stackexchange.com vorgeschlagen , poste ich mein Problem auch hier, Sie finden es wörtlich am Ende dieser Frage.

Da dies jedoch eine Elektrotechnik-Seite ist, formuliere ich gerne eine etwas spezifischere Frage zum Elektrotechnik-Teil:

Ist es basierend auf dem von mir beschriebenen Problem tatsächlich wahrscheinlich, dass das
Problem durch ein Timing-Problem verursacht wird (dh suchen Sie nach einer Lösung, wie ich den
Schrittmotor anspreche, dh Softwarelösung), oder glauben Sie, dass es eine Art
elektrisches / Mechanisches Problem oder Schrittmotorcharakteristik, die mir nicht bekannt sind?

Vielen Dank im Voraus!

EDIT 1: Update basierend auf bisherigen Kommentaren: Der Chopper ist eine 1 mm dicke Aluminiumplatte mit 16 cm Durchmesser und 5 Löchern darin. Unter der Annahme einer massiven Scheibe zur Vereinfachung der Berechnung hat die Scheibe ein Volumen von 20 cm^3 und eine Masse von 54 Gramm. Das Trägheitsmoment sollte 0,5 M R^2 = 0,5 0,054 0,08^2 = 0,0001728 kg.m2 betragen. Die Umrechnung in oz.inch^2 ergibt ~9,4 oz.inch^2, was meiner Meinung nach das 2-3-fache des Motordrehmoments auf der Grundlage des Datenblatts zu sein scheint. (Ich habe die Hardware für diesen Prototyp nicht ausgewählt ... :) ) Was mich überrascht, ist, dass selbst eine 10-mal langsamere Beschleunigung (Erreichen der vollen Geschwindigkeit im Laufe von 32 Sekunden) AUCH regelmäßig fehlschlägt, typischerweise bei etwa 2000 PPS oder 10000 PPS basierend auf a paar schnelle Versuche. Die Tatsache, dass es manchmal funktioniert(wenn auch selten) überrascht mich auch.

Soweit ich das bisher verstanden habe, könnte es sein, dass der Motor zu schwach ist. Irgendwelche Erklärungen, warum es manchmal gut funktioniert und manchmal sogar bei sehr langsamen Beschleunigungen versagt?


Originalbeitrag unten


Zusammenfassung:
Raspberry Pi steuert einen EasyDriver und einen Schrittmotor, aber die Ergebnisse sind inkonsistent und das System fällt regelmäßig aus. Kann nicht herausfinden, warum.

Langer Text:
Hallo zusammen,

Ich habe ein kleines Setup, bei dem ein Schrittmotor ein Chopperrad antreiben soll, um ein Signal zu modulieren. Das Zählen von Schritten ist nicht erforderlich, da der Motor mit einem Encoder ausgestattet ist, aber eine stabile Geschwindigkeit ist erforderlich. Ich verwende die Pigpio-Bibliothek (genauer gesagt die hardware_PWM-Funktion), um die Drehzahl auf Pin (12) auf der Himbeere einzustellen. Da das sofortige Einstellen auf volle Geschwindigkeit den Schrittmotor überhaupt nicht bewegt, habe ich einen kleinen Anstieg der Geschwindigkeit codiert. Das von mir verwendete Testskript lässt es auf 32000 ppm (20 Hz / 1200 U / min) hochfahren, dort einige Sekunden bleiben und dann wieder herunterfahren.

Ich habe regelmäßig ein Problem, bei dem der Motor zu irgendeinem Zeitpunkt während des Hochfahrens, stabilen Laufens oder Herunterfahrens (obwohl normalerweise beim Hochfahren) den „Griff“ auf der rotierenden Welle und dem Chopper zu verlieren scheint. Von diesem Moment an verlangsamt sich der Chopper auf 0 U/min, aber der Motor versucht weiterhin zu beschleunigen (Hochfahren) oder die Geschwindigkeit zu halten (stabile U/min), was ein vom normalen Betrieb abweichendes Heulen/Brummen verursacht. Ich denke derzeit, dass es sich um eine Art Timing-Problem handeln muss, da ein Schrittmotor nach meinem begrenzten Verständnis mit einer Schaukel verglichen werden kann, bei der Sie im richtigen Moment "drücken" müssen, oder er tut nichts oder ist tatsächlich langsam runter. Ist es möglich, dass an einem zufälligen Punkt eine Timing-Fehlanpassung zwischen der Impulsfolge und den "idealen Push-Timings" auftritt, die dieses Problem verursacht? Überraschenderweise,

Mir ist klar, dass dies wahrscheinlich eine Mischung aus Raspberry Pi, Hardware und Pigpio ist, aber ich hoffe, das klingelt bei jemandem, der mir helfen kann, es wäre sehr dankbar!

Einige Spezifikationen, falls sie helfen:
Motor : NEMA08-17-01D-AMT112S ( https://www.cuidevices.com/product/resource/nema08-amt112s.pdf )
Stromversorgung : LPV-150-24 (umfunktionierte LED- Treiber, https://www.meanwell-web.com/nl-nl/ac-dc-single-output-led-driver-constant-voltage-c-lpv--150--24 )
Treiber : EasyDriver ROB-12779 ( https://www.sparkfun.com/products/12779 )
Testcode : https://pastebin.com/tKS0jvDA (Es gibt einen Tippfehler in Zeile 7, der nicht im eigentlichen Code enthalten ist;))
Demo des Fehlers: https: //www.youtube.com/watch?v=KtLGCtxPLPw
Demo-Hinweise:Im ersten Zyklus fällt es beim Hochdrehen aus, Sie können hören, wie die Frequenz ansteigt, aber die Welle wird langsamer. Beim zweiten Versuch wird es so beschleunigt, wie es sollte, und scheitert dann beim Verlangsamen. An diesem Punkt wird die Melodie, die Sie hören, durch die Masse des Hubschraubers verursacht, der effektiv einen Motor ohne Stromversorgung antreibt :)

BEARBEITEN 29/04: Codeliste hinzugefügt, um wie gewünscht zu posten:

import datetime
import time
import pigpio
import numpy as np
import Rpi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(6, GPIO.OUT)
GPIO.output(6,0)    #Enable motor
pi = pigpio.pi()
 
freq_startup_diff = 100
freq_startup_wait = 0.01
motor_freq = 32000
startup_range = np.arange(0,motor_freq+1,freq_startup_diff)
print('Motor starting')
for freq in startup_range:
  pi.hardware_PWM(int(12),int(freq),int(1e6*0.5))
  print("Frequency equals {}".format(freq))
  time.sleep(freq_startup_wait)
 
print('Motor started.')
 
time.sleep(3)
print('Motor stopping.')
stop_range = np.flip(startup_range)
for freq in stop_range:
  pi.hardware_PWM(int(12),int(freq),int(1e6*0.5))
  print("Frequency equals {}".format(freq))
  time.sleep(freq_startup_wait)
 
GPIO.output(6,1)    # Disable motor
print('Motor stopped.')
```
Ich höre mich an, als würden Sie für Ihre körperliche Belastung zu schnell beschleunigen. Bitte beschreiben Sie Ihr Chopperrad, kennen Sie sein Trägheitsmoment? Oder wenn Sie uns das Gewicht und die Größe mitteilen, können wir es schätzen.
Es ist eine 1 mm dicke Aluminiumplatte mit 16 cm Durchmesser und 5 Löchern von etwa 3 x 3 cm. Das sollten ungefähr 55 Gramm sein (ohne Berücksichtigung der Löcher).
@SvB Das ist eine enorme Trägheit. Doch eine kleine Unwucht könnte dazu führen, dass der Motor Schritte verliert, Sie haben einen winzigen Motor mit einem großen Schwungrad kombiniert. Dies ist das Hauptproblem.
Wenn ich mir die Zahlen etwas genauer anschaue, muss ich Ihnen zustimmen. Ich hatte jedoch gerade 2 erfolgreiche Läufe, bei denen ich in 6,4 Sekunden auf volle Geschwindigkeit beschleunigte (Änderung der Geschwindigkeit alle 0,1 Sekunden), wonach 2 weitere fehlschlugen und ein 5. erneut erfolgreich war. Gleichzeitig hatte ich keinen einzigen erfolgreichen Lauf beim Beschleunigen über 32 Sekunden (Änderung der Geschwindigkeit alle 0,01 Sekunden). Ich kann mir einfach nicht vorstellen, warum dieses viel einfachere Szenario häufiger fehlschlagen würde. (Außerdem kenne ich ähnliche Prototypen, bei denen dieses Problem nicht zu existieren scheint.) Ich sage nicht, dass ich Ihnen nicht glaube, ich bin nur überrascht / verwirrt :)
Auf was ist der Strombegrenzer der Treiberplatine eingestellt? Nur 10 ms für das "Eingewöhnen" auf eine neue Frequenz klingt grob angesichts der Tatsache, dass Pigpio die Schrittmuster nicht "anpasst", was zufällig zu einer Situation "Schrittimpuls zur falschen Zeit" führen kann.
@ChristianB. Bis zum Maximum 750mA. Ich dachte, dass diese 10 ms in Ordnung sein sollten, solange die Frequenzänderung klein genug war, und vorzuziehen gegenüber längeren Einschwingzeiten, bei denen ein größerer Schritt gemacht wird. Natürlich sind auch längere Zeiten und kleine Schritte möglich, aber das würde zu minutenlangem Beschleunigen führen. Ich werde sehen, ob ich ein bisschen mehr herumspielen und einen optimalen Punkt finden kann, obwohl die Ergebnisse bisher nicht sehr zuverlässig waren: Einstellungen, die an einem Tag mit einer Erfolgsquote von 90% funktionieren würden, könnten am nächsten Tag durchgehend fehlschlagen oder umgekehrt .
PS Ist SJ2 geschlossen oder offen? Wenn es offen ist, sollte VCC 5 V betragen, was nicht zu den GPIOs des RPis passen würde. Wenn es geschlossen ist, sollte VCC gemäß den Schaltplänen 3,3 V betragen. Allerdings sollte dann auch der maximale Strom begrenzt werden (Datenblatt gibt an: ITRIPmax = VREF / 8 * R_sense ).
Ich würde stattdessen eine "benutzerdefinierte" Rampe versuchen. sowas wait_times = (t1, t2, t3) speeds = (v1,v2,v3) for cur_wait_time, cur_speed in zip(wait_times, speeds)und spiele dann mit den werten rum. Finden Sie die "größtmöglichen Schritte für Geschwindigkeit heraus, während Sie eine angemessene Wartezeit suchen"
Das schrittweise Ändern der Geschwindigkeit ist nicht die ideale Methode. Eine sofortige Geschwindigkeitsänderung erfordert eine Beschleunigungsspitze. Sie wollen wirklich eine konstante Beschleunigung. Mikrocontroller können dies mit Timern erreichen, anstatt PWM, wie das RPi verwendet.
Hast du dir die Pulse mal mit einem Oszilloskop angeschaut? Wenn die Impulse beim Umschalten der Geschwindigkeiten über PWM nicht synchronisiert sind, könnten 2 Impulse zu nahe beieinander liegen. Dies könnte zufällig sein und Ihr inkonsistentes Verhalten erklären. Die meisten Oszilloskope verfügen über eine Impulstriggeroption, die nach diesem Fall suchen kann.
Versuchen Sie, die printf-Befehle innerhalb der Schleifen zu entfernen.
@ Mattman944: Ich spiele mit benutzerdefinierten Wellenformen mit regelmäßigeren Beschleunigungsprofilen herum (wenn ich Zeit habe ...), aber bisher kein Erfolg. Habe aber nicht aufgehört es zu versuchen! Ich habe nicht mit einem Zielfernrohr nachgesehen, dieses Setup ist zu Hause und ich habe nur ein Zielfernrohr an meinem Arbeitsplatz, den ich heutzutage selten besuche. Ich habe die printf-Befehle entfernt, was es ein wenig verbessert hat, aber nicht viel.
@ChristianB. Ich musste nachsehen, aber Sj2 ist offen, dh VCC ist 5V und der maximale Strom sollte erreicht werden. Die VCC beträgt 5 V (wie in der Platine selbst von ihrer 24-V-Eingangsspannung geregelt), aber ich stimme zu, dass der RasPi-PWM-Ausgang nur 3,3 V betragen wird. Da es sich jedoch nur um PWM („Daten“, nicht „Strom“) handelt, sollte das überhaupt eine Rolle spielen, da es eindeutig registriert wird?
Laut Datenblatt muss der Eingangspegel mindestens 0,7 x VCC betragen, um als High registriert zu werden. Für VCC = 5 -> 3,5 V, was über dem Maximum des RPi liegt. Außerdem sind die Ausgänge des RPi höchstwahrscheinlich CMOS-3,3-V-Pegel. Dh es "muss" nur auf VDD - 0,4 = 3,1V kommen, um seinen Ausgangspegel zu "erfüllen". Dies ist besonders wichtig für schnelleres Schalten und laute Umgebungen.

Antworten (1)

Entweder liefert Ihr Schrittmotor nicht genug Drehmoment, um einer solchen Rampe zu folgen, oder der Strom ist zu klein für diesen Motor. Abhilfe: Acc/Dec-Rampe erhöhen und Ausgangsstromeinstellung der Treiberplatine prüfen.

T = J a

Das erforderliche Drehmoment, um die Trägheitsmasse bei einem bestimmten Beschleunigungswinkel zu beschleunigen. Ist die erforderliche Beschleunigung zu hoch, dann gerät der Schrittmotor aus dem Takt und verpasst Schritte.

Ein weiterer Aspekt ist das Drehmoment VS. Geschwindigkeitseigenschaften

Sanyo Denki

Geben Sie hier die Bildbeschreibung ein

Bei höheren Drehzahlen fällt das Drehmoment ab. Der Kniepunkt hängt von der Motorspannungskonstante und der Versorgungsspannung ab.

BEARBEITEN:

Geben Sie hier die Bildbeschreibung ein

Die Motor-Last-Kombination wirkt wie ein Torsionspendel. Die Kombination aus Rotor- und Lastträgheit mit einer Welle bildet ein schwingfähiges System. Wenn Sie den Motor mit einem Ungleichgewicht des Schwungrads drehen, erregen Sie das System tatsächlich, sobald die Resonanz erreicht ist, kann dieses Welligkeitsdrehmoment von Ihrem Motor nicht mehr aufrechterhalten werden.

HINWEIS für Ihre Rampengeneration:

D Ω D T = a

Wenn Sie den Geschwindigkeitssollwert schrittweise ändern, bedeutet das theoretisch eine unbegrenzte Beschleunigung. Sie sollten die PWM so schnell wie möglich mit winzigen Beträgen aktualisieren:

lim Δ T 0 Δ Ω Δ T = D Ω D T = a C Ö N S T

Sehen Sie sich die Methode zum Erstellen einer sich kontinuierlich ändernden PWM an: So erzeugen Sie eine gleichmäßige Frequenzrampe

Wird den Beitrag mit Informationen aktualisieren, zu viel für einen Kommentar.
Die PWM-Methode zur Erzeugung einer gleichmäßigen Frequenzrampe ist eigentlich genau das, was ich versucht habe. Ich bin jedoch auf einige Hindernisse gestoßen, da das Hochfahren auf 32000 PPS im Laufe weniger Sekunden viele Impulse erfordert, mehr als ich in eine einzelne Welle oder sogar eine Kette von Wellen stecken könnte. Ich versuche immer noch herauszufinden, ob ich an die Grenzen dieser Methode stoße oder ob mir die richtigen Fähigkeiten fehlen :)