Suavizar el movimiento del motor paso a paso cuando cambia la dirección

0

Por lo tanto, estoy manejando un motor paso a paso bipolar NEMA34 y está siendo manejado por un DM860 leadshine. Creo un programa en la frambuesa pi usando la biblioteca pigpio, el programa que hace que el cambio del motor paso a paso se mueva hacia atrás y adelante en el bucle de hilos. así que este es el ejemplo om mi código que sigo de (joan) ejemplo ( enlace ):

import time
import pigpio
import sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import QTime, QTimer
#this function I implement it on GUI PyQt
class step(QtCore.QThread):
    tulis = write()
    dataArray = []
    dataInput = 0
    startDelay=0
    finalDelay=0
    def __init__(self, parent=None):
        QtCore.QThread.__init__(self,parent)  
        self.GPIO=20
        self.dirrection = 21

    def triger(self,slider): #this function 'def triger(self,slider)' I use for update the value of variable 'stepdataInput','step.DataDelay',and 'step.dataStart' if the Gui gas update their input value
        step.dataInput = slider  #get value from slider UI and set it to 'step.dataInput' variable
        if slider > 0:
            step.startDelay = 600 - (2 * slider) #just the calculation of startDelay variable
            step.finalDelay = 570 - (2 * slider) #just the calculation of startDelay variable
        else:
            step.startDelay = 0
            step.finalDelay = 0

    def move(self):

        pi = pigpio.pi()
        pi.set_mode(self.GPIO, pigpio.OUTPUT) #inisiation of gpio pulse pin
        pi.set_mode(self.dirrection, pigpio.OUTPUT) #inisiation of gpio diretion pin
        pi.set_mode(26,pigpio.INPUT) #left limit switch
        pi.set_mode(16,pigpio.INPUT) #right limit switch

        statee = 0  #the first inisialisation of motor direction
        x = 0

        while step.startDelay > 0 or step.finalDelay > 0:  #this is the requitmen of loop
            pi.wave_clear()
            pi.write(self.dirrection,statee)

            wf=[]   #ramp up wave from startDelay to finalDelay

            for delay in range(step.startDelay, step.finalDelay, -1): #looping for create ramp up wave from step.starDelay' to 'step.finalDelay'
                wf.append(pigpio.pulse(1<<self.GPIO, 0,       delay))
                wf.append(pigpio.pulse(0,       1<<self.GPIO, delay))

            pi.wave_add_generic(wf)

            offset = pi.wave_get_micros()
            wid1 = pi.wave_create()   #end ramp up code

            wf=[]  #max speed wave from finalDelay

            wf.append(pigpio.pulse(1<<self.GPIO, 0,       step.finalDelay))
            wf.append(pigpio.pulse(0,       1<<self.GPIO, step.finalDelay))

            pi.wave_add_generic(wf)
            wid2 = pi.wave_create()  #end max speed code

            #ramp down wave from finalDelay to startDelay
            wf = []

            for delay in range(step.finalDelay,step.startDelay):
#looping for create ramp down delay from 'step.finalDelay' to 'step.startDelay'
                wf.append(pigpio.pulse(1<<self.GPIO, 0,       delay))
                wf.append(pigpio.pulse(0,       1<<self.GPIO, delay))       

            pi.wave_add_generic(wf)

            wid3 = pi.wave_create() #end ramp down code

            #pi.wave_send_once(wid1)
            pi.wave_send_using_mode(wid1, pigpio.WAVE_MODE_ONE_SHOT_SYNC) #send ramp up wave

            time.sleep(float(offset)/1000000.0) #transition delay to another wave send

            pi.wave_send_using_mode(wid2, pigpio.WAVE_MODE_REPEAT_SYNC) # the maximum wave send here
            if pi.read(26) == 0: #check if something hit the limmiter switch
                pi.wave_tx_stop()
                self.stop()
            if pi.read(16) == 0: #check if something hit the limmiter switch
                pi.wave_tx_stop()
                self.stop()
            time.sleep(0.35)
            pi.wave_send_using_mode(wid3, pigpio.WAVE_MODE_ONE_SHOT_SYNC) #send ramp down wave

            if statee == 0: #if the value of 'statee' variable is 0
                step.dataArray.append({'x':x,'y':0.25,'speed':step.dataInput}) #just save record
                statee = 1 #set 'statee' varable to 1, for chaging the direction

            elif statee == 1:
                step.dataArray.append({'x':x,'y':0.25 * -1,'speed':step.dataInput})
                statee = 0


            x = x + 1

        print("stop the process")
        #this function from gpiod to stop and terminate all wave
        pi.wave_tx_stop()
        pi.stop()

    def run(self):
        #this function 'def run(self)' run by itself when you first time start the thread by calling 'def start() function'
        self.move()

    def start(self):
        #this function 'def start(self)' I use to start the thead looping 
        super(step, self).start()

    def stop(self):
        #this function 'def stop(self)'I use to stop the thread loop
        step.startDelay = 0
        step.finalDelay = 0

el problema ocurrió cuando el motor paso a paso cambia la dirección, no puede cambiar la dirección o descender suavemente, hay demasiados golpes al cambiar la dirección o cada extremo del movimiento, uso la rampa hacia abajo para reducir la velocidad del movimiento cuando pi.wave_send_using_mode(wid2, pigpio.WAVE_MODE_REPEAT_SYNC) ya finaliza la ejecución y el rango entre step.startDelay y step.finalDelay no hasta ahora, ya que para que el movimiento del motor paso a paso no sea demasiado lejos y aumente la precisión de pi.read(26) y pi.read(26) para finalizar pi.wave_send_using_mode(wid2, pigpio.WAVE_MODE_REPEAT_SYNC) cuando golpeo el interruptor normaly close. funciona como la rampa de aterrizaje no funcionó en absoluto, así que, ¿qué debo hacer?

    
pregunta Jan sebastian

0 respuestas

Lea otras preguntas en las etiquetas