首页 > 解决方案 > 步进电机控制的 Python 时序

问题描述

我正在尝试用 Python 为树莓派(树莓派操作系统)制作一个通用步进电机驱动程序。当驱动模块(连接到步进电机的物理设备)接收到脉冲时,步进器旋转一步(每转微步 1600 步)。脉冲由RPI.GPIO模块控制)。为了控制速度,我使用内置的“时间”模块来设置脉冲之间的延迟。这是我的问题:速度不准确,高速是不可能的。我不认为它与溢出有任何关系。我的猜测是我达到了时间模块的限制,有人可以确认吗?这是我使用的代码:

    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)

标签: pythontimeraspberry-pistepper

解决方案


正如其他人所说,电机控制通常由微控制器管理,因为它们可以保证精确的时序。另一方面,像 Linux 这样的操作系统无法提供相同的时序一致性,因为它管理着操作系统的所有部分(网络、驱动程序等)。

因此,与其让 Raspberry Pi 连续发送命令来为步进电机线圈通电,您还可以采用以下方式:

[Pi] --Tx/Rx--> [Arduino] --GPIO--> [Stepper Motor]

但是,如果您确实需要在操作系统级别控制硬件,您可以查看pigpio之类的库,它将处理卸载到守护进程,而不是访问应用程序级别的硬件。


推荐阅读