python - 步进电机控制的 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之类的库,它将处理卸载到守护进程,而不是访问应用程序级别的硬件。
推荐阅读
- javascript - 在下一个 TR 上将类添加到相同的 TD
- angularjs - 如何使用 if 语句实现 for 循环
- r - 从字符向量中提取所有匹配模式
- ios - 为什么之前调用 reloadRows 时 UITableView setContentOffset 不能正常工作?
- binding - 如何在 Angular 上为来自 HTTP 表的动态数据实现分页
- pyqt5 - PyQt5:通过实现QGraphicsScene、QGraphicsView和QGraphicsItem,使用mouseEvents绘制多个矩形
- reactjs - 笑话:添加元素后功能组件数组列表未映射
- design-patterns - 以最通用的方式对依赖于两种主要类型(或其子类型)的行为进行建模的最佳架构是什么?
- c# - EF Core 2.2 执行 SQL 存储过程在 SQL Server 管理中成功执行时超时
- php - 每个单个产品页面 woocommerce 的不同自定义数量