Potencia repentina de raspbery pi o retraso largo aleatorio cuando se ejecuta el motor paso a paso usando pigpiod

1

Así que escribí otro programa que puede ejecutar el motor paso a paso nema 34 con el controlador leadshine DM860 y este es el ejemplo de mi código:

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()

Se ejecuta sin error de código, pero a veces el motor paso a paso cuando se mueve tiene un retraso largo aleatorio, incluso ya disminuyo el valor de START_DELAY , FINAL_DELAY y time.sleep() (con el rango entre START_DELAY y FINAL_DELAY el valor es 100 y el valor time.sleep() depende de la suavidad del movimiento).

Cuando uso el valor de START_DELAY , FINAL_DELAY y time.sleep() como el código de ejemplo (la velocidad más baja) en algún momento, la Raspberry Pi recibió un corte de energía (el motor paso a paso deja de moverse y el monitor LCD muestra la pantalla en blanco con el texto 'no señal'). Entonces, ¿es realmente el problema de mi código? Ya actualicé pigpiod a v68.

Así es como está cableado:

Usocablesdepuente(usandomachoamachoyhembraahembra,porquenotengocablesdepuentemachoahembra)entreelcontroladoralaframbuesapi3ylaconexiónentreDIRyPULconuncabledecobrecomún.

Esteeselresultadodelamodulacióndeanchodepulsoqueverificousandopiscope:

EspecificacióndelmotorpasoapasobipolarNEMA34:

  1. Parderetención5.9Nm
  2. Ánguloescalonado1.8°
  3. Resistencia/fase0.33±10%Ω
  4. Inductancia/fase3.00±20%mH
  5. Cargamáximaaxial65N
  6. Cargamáximaradial200N

enlace

DM860 leadshine con una corriente de salida de 1.0 - 7.2A y una tensión de entrada de 24 - 80 VDC. Tengo el controlador configurado con una fuente de alimentación de 24V.

Esta es la configuración actual del controlador y pulso / revoluciones:

    
pregunta Jan sebastian

1 respuesta

0

Creo que debes detenerte un momento y leer un poco sobre la biblioteca pigpio.

Una de sus últimas preguntas involucró el uso indebido de uno de los métodos más simples de pigpio (pi.stop)

Esto parece ser mucho más complicado, y realmente necesitas entender lo que está pasando.

Por un vistazo rápido a la documentación y algunos ejemplos aleatorios en Internet, me parece que debe tener más cuidado cuando cambia o agrega olas a la cola. Cambiar las cosas en el momento incorrecto causará olas perdidas o saltadas.

En general, su código podría mejorarse.

  1. Familiarícese con la forma en que funcionan las funciones de onda y cómo (y cuándo) puede cambiar (o agregar o eliminar) las ondas de la cola.

  2. Está generando las ondas en cada ejecución a través del bucle. Los parámetros de la generación de ondas no parecen cambiar, por lo que está generando continuamente los mismos patrones. Hágalos una vez fuera del bucle y reutilícelos.

  3. Pareces estar enviando la misma secuencia una y otra vez, y parando cuando ocurre algún evento externo (pines 16 y 26). Puedes configurar una ola para que se repita hasta que la detengas. Eso simplificaría drásticamente su código. Busque en "wave_send_repeat" y "WAVE_MODE_REPEAT."

  4. Sus pines no tienen nombre. Si usaste un nombre como "Stop_Button" en lugar de "26" en tu "pi.read", entonces sería más claro lo que realmente estás haciendo.

  5. En general, debe asignar sus constantes a variables con buenos nombres.

Hacer las repeticiones en el código a medida que lo haces te deja abierto a demoras en la ejecución. Python se ejecuta en el espacio de usuario y puede ser interrumpido por casi cualquier cosa. Esto puede causar retrasos en el inicio de la próxima ola.

Pigpio se ejecuta en el espacio del kernel, y solo puede ser interrumpido por tareas del kernel de alta prioridad; es mucho más probable que se ejecute correctamente que cualquier cosa en el espacio del usuario. La forma en que está escrito (utilizando DMA programado) hace que sea muy probable que incluso el núcleo no lo moleste. Esto lo convierte en la mejor manera de hacer repeticiones y secuencias largas.

Estás invirtiendo en cada repetición. Eso quedó oculto por la falta de buenos nombres en su código.

Necesitas averiguar cómo preguntar a pigpio cuando se termina una ola en particular. Envíalo tu ola, espera hasta que se complete (o cancela y espera hasta que se complete) luego envía el siguiente comando.

Si volteas a la reverenda y el servo aún se está moviendo, es posible que tengas picos de voltaje en el suelo que conectan el pi y el servocontrol.

El DM860 parece tener entradas aisladas ópticamente, por lo tanto, a menos que tenga las bases unidas, no debería tener picos del DM860 al pi.

¿Está compartiendo terreno o energía entre el pi y el motor / controlador de motor?

    
respondido por el JRE

Lea otras preguntas en las etiquetas