Python步进电机控制的时序
Python timing for stepper motor control
我正在尝试为 raspberry pi(raspberry pi OS)制作通用步进电机驱动器 Python。当驱动模块(连接到步进电机的物理设备)接收到脉冲时,步进器旋转一步(微步每转 1600 步)。脉冲由 RPI.GPIO 模块控制)。为了控制速度,我使用内置 'time' 模块来设置脉冲之间的延迟。这是我的问题:速度不准确,并且不可能高速。我不认为它与溢出有任何关系。我的猜测是我达到了时间模块的极限,谁能证实这一点?这是我使用的代码:
def run(self, speed: float, rotations: float, direction: Direction = Direction.CLOCKWISE) -> None:
"""
Start stepper motor signal.
:param speed: Motor speed in RPM.
:param rotations: Amount of rotations motor turns.
:param direction: Set the direction of the motor ('CW' or 'CCW'), default='CW'.
:return: None
"""
steps: int = int(self.spr * rotations)
delay: float = 60/(self.spr*speed)
if delay <= 0:
raise ValueError('Speed cannot be zero or lower.')
elif delay < 0.0001:
raise ValueError(f'Maximum speed in this setup is: {60/(self.spr * 0.0001)} RPM.')
if not isinstance(direction, Stepper.Direction):
raise TypeError('direction must be an instance of Direction')
GPIO.output(self.dir, direction.value)
for _ in range(steps):
GPIO.output(self.pul, GPIO.HIGH)
sleep(delay / 2)
GPIO.output(self.pul, GPIO.LOW)
sleep(delay / 2)
正如其他人所说,电机控制通常由微控制器管理,因为它们可以保证精确的定时。另一方面,像 Linux 这样的操作系统无法提供相同的时间一致性,因为它正在管理 OS 的所有部分(网络、驱动程序等)。
因此,不是 Raspberry Pi 发送命令来连续为步进电机线圈通电,您可以这样:
[Pi] --Tx/Rx--> [Arduino] --GPIO--> [Stepper Motor]
但是,如果您确实需要在 OS 级别控制硬件,您可以查看像 pigpio 这样的库,它将处理卸载到守护进程而不是访问应用程序上的硬件等级.
我正在尝试为 raspberry pi(raspberry pi OS)制作通用步进电机驱动器 Python。当驱动模块(连接到步进电机的物理设备)接收到脉冲时,步进器旋转一步(微步每转 1600 步)。脉冲由 RPI.GPIO 模块控制)。为了控制速度,我使用内置 'time' 模块来设置脉冲之间的延迟。这是我的问题:速度不准确,并且不可能高速。我不认为它与溢出有任何关系。我的猜测是我达到了时间模块的极限,谁能证实这一点?这是我使用的代码:
def run(self, speed: float, rotations: float, direction: Direction = Direction.CLOCKWISE) -> None:
"""
Start stepper motor signal.
:param speed: Motor speed in RPM.
:param rotations: Amount of rotations motor turns.
:param direction: Set the direction of the motor ('CW' or 'CCW'), default='CW'.
:return: None
"""
steps: int = int(self.spr * rotations)
delay: float = 60/(self.spr*speed)
if delay <= 0:
raise ValueError('Speed cannot be zero or lower.')
elif delay < 0.0001:
raise ValueError(f'Maximum speed in this setup is: {60/(self.spr * 0.0001)} RPM.')
if not isinstance(direction, Stepper.Direction):
raise TypeError('direction must be an instance of Direction')
GPIO.output(self.dir, direction.value)
for _ in range(steps):
GPIO.output(self.pul, GPIO.HIGH)
sleep(delay / 2)
GPIO.output(self.pul, GPIO.LOW)
sleep(delay / 2)
正如其他人所说,电机控制通常由微控制器管理,因为它们可以保证精确的定时。另一方面,像 Linux 这样的操作系统无法提供相同的时间一致性,因为它正在管理 OS 的所有部分(网络、驱动程序等)。
因此,不是 Raspberry Pi 发送命令来连续为步进电机线圈通电,您可以这样:
[Pi] --Tx/Rx--> [Arduino] --GPIO--> [Stepper Motor]
但是,如果您确实需要在 OS 级别控制硬件,您可以查看像 pigpio 这样的库,它将处理卸载到守护进程而不是访问应用程序上的硬件等级.