【问题标题】:Python timing for stepper motor control步进电机控制的 Python 时序
【发布时间】:2021-09-11 04:14:32
【问题描述】:

我正在尝试用 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)

【问题讨论】:

  • 本页讨论了尝试将 Linux 设备用于“实时”任务的一些问题以及相关问题。 raspberrypi.org/forums/viewtopic.php?t=62820
  • 通常你会想要一个微控制器设备(没有繁重的 Linux 操作系统)来执行实时任务(即电机步数),并且只需使用 raspberry-pi 来告诉微控制器移动到哪里。我知道这可能不是您的目标,但这就是通常这样做的原因。

标签: python time raspberry-pi stepper


【解决方案1】:

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

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

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

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

【讨论】:

  • 是否可以分离一个只代表硬件控制的cpu核心?像 Beckhoff 这样的想法使用他们的 TwinCat PLC 系统。
  • 为进程保留 cpu 核心称为processor affinityThis answer 展示了一种在 Python 中将进程固定到核心的方法,here's another 则用于 Linux。但是,您仍然会遇到时间问题,因为 Python 是一种解释型语言,而且速度通常不是它的强项。
猜你喜欢
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
  • 2014-05-21
  • 1970-01-01
相关资源
最近更新 更多