Plötzlicher Stromausfall des Raspberry Pi oder zufällige lange Verzögerung beim Betrieb des Schrittmotors mit Pigpiod

Also habe ich ein anderes Programm geschrieben, das den Schrittmotor Nema 34 mit dem Leadshine DM860-Treiber ausführen kann, und dies ist das Beispiel meines Codes:

import time
import pigpio

START_DELAY=580
FINAL_DELAY=480
STEP=1

GPIO=20

pi = pigpio.pi()

pi.set_mode(GPIO, pigpio.OUTPUT)
pi.set_mode(21, pigpio.OUTPUT)
pi.set_mode(26,pigpio.INPUT)
pi.set_mode(16,pigpio.INPUT)
#pi.write(21,1)
pi.wave_clear()

statee = 0
run = True
try:
    while run == True:

        pi.write(21,statee)
        pi.wave_clear()

        wf=[]
        offset = pi.wave_get_micros()
        for delay in range(START_DELAY, FINAL_DELAY, -STEP):
           wf.append(pigpio.pulse(1<<GPIO, 0,       delay))
           wf.append(pigpio.pulse(0,       1<<GPIO, delay))

        for i in range(500):
            wf.append(pigpio.pulse(1<<GPIO, 0,       FINAL_DELAY))
            wf.append(pigpio.pulse(0,       1<<GPIO, FINAL_DELAY))

        for delay in range(FINAL_DELAY, START_DELAY, STEP):
           wf.append(pigpio.pulse(1<<GPIO, 0,       delay))
           wf.append(pigpio.pulse(0,       1<<GPIO, delay))

        pi.wave_add_generic(wf)

        wid2 = pi.wave_create()

        #pi.wave_send_once(wid2)
        pi.wave_send_using_mode(wid2, pigpio.WAVE_MODE_ONE_SHOT_SYNC)

        if pi.read(26) == 0:
            pi.wave_tx_stop()
            run = False
        if pi.read(16) == 0:
            pi.wave_tx_stop()
            run = False

        time.sleep(0.7429)
        if statee == 0:
            statee = 1
        elif statee == 1:
            statee = 0
except KeyboardInterrupt:
    print ("\nCtrl-C pressed.  Stopping PIGPIO and exiting...")
    pi.wave_tx_stop()
    pi.stop()

Es läuft ohne Codefehler, aber manchmal hat der Schrittmotor beim Bewegen eine zufällige lange Verzögerung, selbst wenn ich den Wert bereits von START_DELAY, FINAL_DELAY, und verringere time.sleep()(wobei der Bereich zwischen START_DELAYund FINAL_DELAYWert 100 und time.sleep()Wert davon abhängt, wie reibungslos sich die Bewegung bewegt).

Wenn ich START_DELAY, FINAL_DELAY, und time.sleep()value wie den Beispielcode (die niedrigere Geschwindigkeit) verwende, wurde der Himbeer-Pi irgendwann vom Stromnetz getrennt (der Schrittmotor stoppt und der LCD-Monitor zeigt einen leeren Bildschirm mit dem Text „kein Signal“). Liegt das Problem also wirklich an meinem Code? Ich habe Pigpiod bereits auf v68 aktualisiert.

So wird es verkabelt:

Verkabelung zwischen Treiber und Raspberry Pi 3

Ich verwende Überbrückungsdrähte (mit Stecker zu Stecker und Buchse zu Buchse, weil ich keine Überbrückungsdrähte von Stecker zu Buchse habe) zwischen Treiber und Himbeer-Pi 3 und Verbindung zwischen DIR- und PUL- mit gewöhnlichem Kupferdraht.

Dies ist das Ergebnis der Pulsweitenmodulation, das ich mit piscope überprüfe:

Geben Sie hier die Bildbeschreibung ein

Spezifikation des bipolaren NEMA34-Schrittmotors:

  1. Haltemoment 5,9 Nm
  2. Schrittwinkel 1,8°
  3. Widerstand / Phase 0,33 ± 10 % Ω
  4. Induktivität / Phase 3,00 ± 20 % mH
  5. Max. Belastung axial 65 N
  6. Maximale Belastung radial 200 N

https://www.igus.com/info/drive-technology-nema-34-ca

DM860 Leadshine mit einem Ausgangsstrom von 1,0 - 7,2 A und einer Eingangsspannung von 24 - 80 VDC. Ich habe den Treiber mit 24V Stromversorgung konfiguriert.

Dies ist die Treiberstrom- und Impuls-/Umdrehungseinstellung:

Geben Sie hier die Bildbeschreibung ein

Treibereinstellung

Es hört sich so an, als hätten Sie möglicherweise zusätzlich zu anderen ein Stromversorgungsproblem. Wie wird der Pi mit Strom versorgt? Wie werden die Motoren angetrieben?
@ChrisStratton Ich habe den Schrittmotor mit einer Stromversorgung von 24 VDC 10 A betrieben. Raspberry Pi wird mit einem 5-V-2-A-Ladeadapter betrieben
Bearbeiten Sie die Frage, um zu zeigen, wie alles verdrahtet ist, sowohl logisch als auch physisch (Leitungsführung, Größe, Länge usw.). Geben Sie die Stepper-Stromsollwerte an. Lassen Sie eine serielle Konsole oder einen Monitor mit tailing /dev/kmesg laufen. Ändern Sie Ihren Code, um dort eine periodische Ausgabe zu erzeugen, und haben Sie auch einen unabhängigen Daemon, der eine periodische Ausgabe erzeugt.
@ChrisStratton Ich habe bereits ein paar Details hinzugefügt, ist das genug?
Eine 200-ms-Pause im Benutzermoduscode ist wahrscheinlich nur das System, das beschäftigt ist. Aber Sie haben einen "Shutdown" beschrieben, der etwas anderes wäre. Sie haben keine der angeforderten Informationen wirklich bereitgestellt.
Das sind Überbrückungskabel. Ich hoffe ernsthaft, dass Sie diese nicht verwenden, um Ihr Servo anzuschließen.

Antworten (1)

Ich denke, Sie sollten einen Moment innehalten und etwas über die Pigpio-Bibliothek lesen.

Eine Ihrer letzten Fragen betraf den Missbrauch einer der einfachsten Pigpio-Methoden (pi.stop)

Dies scheint viel komplizierter zu sein, und Sie müssen wirklich verstehen, was vor sich geht.

Nach einem kurzen Blick auf die Dokumentation und einige zufällige Beispiele im Internet scheint es mir, dass Sie vorsichtiger sein müssen, wenn Sie Wellen ändern oder zur Warteschlange hinzufügen. Das Ändern von Dingen zur falschen Zeit führt zu verlorenen oder übersprungenen Wellen.

Im Allgemeinen könnte Ihr Code verbessert werden.

  1. Machen Sie sich damit vertraut, wie die Wave-Funktionen funktionieren und wie (und wann) Sie Waves aus der Warteschlange ändern (oder hinzufügen oder löschen) können.

  2. Sie erzeugen die Wellen bei jedem Durchlauf durch die Schleife. Die Parameter für die Wellenerzeugung scheinen sich nicht zu ändern, sodass Sie kontinuierlich dieselben Muster erzeugen. Machen Sie sie einmal außerhalb der Schleife und verwenden Sie sie wieder.

  3. Sie scheinen immer wieder dieselbe Sequenz zu senden und zu stoppen, wenn ein externes Ereignis (Pins 16 und 26) eintritt. Sie können eine Welle so einstellen, dass sie wiederholt wird, bis Sie sie stoppen. das würde Ihren Code drastisch vereinfachen. Sehen Sie sich "wave_send_repeat" und "WAVE_MODE_REPEAT" an.

  4. Ihre Pins sind unbenannt. Wenn Sie in Ihrem "pi.read" einen Namen wie "Stop_Button" anstelle von "26" verwenden, wäre klarer, was Sie tatsächlich tun.

  5. Im Allgemeinen sollten Sie Ihre Konstanten Variablen mit guten Namen zuweisen.

Wenn Sie die Wiederholungen im Code so ausführen, wie Sie es tun, sind Sie anfällig für Verzögerungen bei der Ausführung. Python läuft im User Space und kann durch so ziemlich alles unterbrochen werden. Dies kann zu Verzögerungen beim Start der nächsten Welle führen.

Pigpio selbst läuft im Kernel-Space und kann nur durch Kernel-Tasks mit hoher Priorität unterbrochen werden - es ist viel wahrscheinlicher, dass es ordnungsgemäß läuft als alles andere im User-Space. Die Art und Weise, wie es geschrieben ist (unter Verwendung von programmiertem DMA), macht es sehr wahrscheinlich, dass nicht einmal der Kernel es stört. Dies macht es wirklich zum besten Weg, Wiederholungen und lange Sequenzen zu machen.


Sie kehren bei jeder Wiederholung um. Das wurde durch das Fehlen guter Namen in Ihrem Code verdeckt.

Sie müssen herausfinden, wie Sie Pigpio fragen, wann eine bestimmte Welle beendet ist. Sie senden Ihre Welle, warten, bis sie abgeschlossen ist (oder brechen sie ab und warten, bis sie abgeschlossen ist), und senden dann den nächsten Befehl.

Wenn Sie den Rückwärtsgang umlegen und sich das Servo noch bewegt, treten möglicherweise Spannungsspitzen auf der Erde auf, die den Pi und den Servocontroller verbinden.

Das DM860 scheint optisch isolierte Eingänge zu haben. Wenn Sie also nicht die Masse miteinander verbunden haben, sollten Sie keine Spitzen vom DM860 zum Pi bekommen.

Teilen Sie Erde oder Strom zwischen dem Pi und dem Motor / Motorcontroller?