繁体   English   中英

即使代码仍然有效,步进电机也会在短时间内停止工作。 (树莓派)

[英]Stepper motor quits working after a short while, even though the code still works. (Raspberry Pi)

我使用 Python 3.7.3 在我的 Raspberry Pi 4B 上运行以下代码:

from time import sleep
import RPi.GPIO as GPIO
import math
from watchgod import watch

g=open("/home/pi/Desktop/Int2/DesHeight.txt","r")
DesHeight = g.readline()
DesHeight1=float(DesHeight)
print(DesHeight1)

GPIO.cleanup()

DIR = 20
STEP = 21
CW = 0
CCW = 1
TX_ENC = 15
SPR = 200 # Steps per Rev [CONSTANT]
delay = .001 #Seconds per stepper pulse [CONSTANT]
ratio=24 #gear ratio [CONSTANT]
f = open("height.txt", "r")
y0 = f.readline()
y0 = float(y0)
d=1.25
r=d/2
theta0=y0/(2*math.pi*r)

GPIO.setmode(GPIO.BCM) # GPIO numbering
GPIO.setup(12,GPIO.OUT)
GPIO.output(12,1) # Turning on the "Enable Input"
GPIO.setup(DIR, GPIO.OUT)
GPIO.setup(STEP, GPIO.OUT)
GPIO.output(DIR, CW) # Setting CW Direction
GPIO.setup(TX_ENC, GPIO.IN) # Encoder input setup
GPIO.add_event_detect(TX_ENC, GPIO.BOTH)
Tx = 0

MODE = (16,17,18,19) # GPIO 16 is the standby input. It needs to be high for anything to move
GPIO.setup(MODE,GPIO.OUT)
RESOLUTION = {'Standby':(0,0,0,0),
              'Full':(1,0,0,0),
              'Half':(1,1,0,0),
              '1/4':(1,0,1,0),
              '1/8':(1,1,1,0),
              '1/16':(1,0,0,1),
              '1/32':(1,1,0,1),
              '1/64':(1,0,1,1),
              '1/128':(1,1,1,1)}
GPIO.output(MODE,RESOLUTION['Full'])
ass = (0,0,0,0)
pp = list(ass)
pp[0] = GPIO.input(MODE[0])
pp[1] = GPIO.input(MODE[1])
pp[2] = GPIO.input(MODE[2])
pp[3] = GPIO.input(MODE[3])
ass = tuple(pp)

if(ass == RESOLUTION['Standby']):
    res = 0
elif(ass == RESOLUTION['Full']):
    res = 200
elif(ass == RESOLUTION['Half']):
    res = 400
elif(ass == RESOLUTION['1/4']):
    res = 800
elif(ass == RESOLUTION['1/8']):
    res = 1600
elif(ass == RESOLUTION['1/16']):
    res = 3200
elif(ass == RESOLUTION['1/32']):    
    res = 6400
elif(ass == RESOLUTION['1/64']):
    res=12800
elif(ass == RESOLUTION['1/128']):
    res=25600
else:
    print("Whoops lol")

while(True):
    for changes in watch('/home/pi/Desktop/Int2/DesHeight.txt'):
        g=open("/home/pi/Desktop/Int2/DesHeight.txt","r")
        DesHeight = g.readline()
        DesHeight1=float(DesHeight)
        f = open("height.txt", "r")
        y0 = f.readline()
        y0=float(y0)
        while(abs(y0-DesHeight1)>.001):
            if(y0 < DesHeight1):
                while(y0 < DesHeight1):
                    GPIO.output(DIR,CCW)    
                    GPIO.output(STEP, GPIO.HIGH)
                    sleep(delay)
                    GPIO.output(STEP, GPIO.LOW)
                    sleep(delay)
                    Tx = Tx + 1
                    theta0=theta0+1/res*1/ratio#*1/gearratio
                    y0 = y0+2*5/4*14/15*.9944*math.pi*(1/res*1/ratio)*r
            else:
                while(y0 > DesHeight1):
                   if(y0>0):     
                        GPIO.output(DIR,CW)    
                        GPIO.output(STEP, GPIO.HIGH)
                        sleep(delay)
                        GPIO.output(STEP, GPIO.LOW)
                        sleep(delay)
                        Tx = Tx - 1
                        theta0=theta0-1/res*1/ratio#*1/gearratio
                        y0 = y0-2*5/4*14/15*.9944*math.pi*(1/res*1/ratio)*r
        y0 = str(y0)
        print(y0)
        f.close()
        f = open('height.txt', 'w')
        f.write(y0)
        f.close()

本质上,我要做的是从文本文件中读取机器的高度,然后将其与所需的高度进行比较,如单独的文本文件中所写的那样。 当代码检测到所需高度发生变化时,它会检查以确保实际高度和所需高度彼此相差 1/1000 英寸,如果不是,它会移动 NEMA-17 电机直到达到这种情况被满足。

我遇到的问题是,如果让这段代码运行一点点(通常大约 40 秒),当我改变所需的高度时,步进电机就会停止运行。 代码本身会运行,花费与预期一样长的时间来“移动”电机并计算高度并返回到 while 循环的顶部,但电机本身仍然停滞不前。 如果立即实施对所需高度文件的新更改,则不会发生这种情况。 我不知道这可能是什么并且可以使用一些帮助。

好的,所以遵循 RootTwo 的建议,并学习如何使用示波器,我能够隔离部分问题并确定解决方案。 在大约 90 秒不活动后,pi 或驱动程序停止向电机提供电压。 我无法找到一种方法使电机持续保持在保持扭矩,但我能够通过将 while(True): 和看门狗命令移动到开头来使代码在长时间休息后重新初始化代码。 我的问题在技术上已解决,但我的问题仍未得到解答:为什么我的 pi 停止向驱动板发出信号?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM