如何解决步进电机控制的 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)
解决方法
正如其他人所说,电机控制通常由微控制器管理,因为它们可以保证精确的计时。另一方面,Linux 等操作系统无法提供相同的时间一致性,因为它管理着操作系统的所有部分(网络、驱动程序等)。
因此,不是 Raspberry Pi 发送命令来连续给步进电机线圈通电,您可以使用以下命令:
[Pi] --Tx/Rx--> [Arduino] --GPIO--> [Stepper Motor]
但是,如果您确实需要在操作系统级别控制硬件,则可以查看 pigpio 之类的库,它将处理卸载到守护程序,而不是在应用程序级别访问硬件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。