4

我正在编写一个 Python 代码(如下),它可以加速步进电机,直到它达到特定的步数。

for s in range (steps):
    if s < accelerationsteps:
        lateststep = self.oneStep(direction, stepstyle)
        time.sleep(s_per_s)
        s_per_s = s_per_s - ((astart - aend) / accelerationsteps)

s_per_s= 每一步之间的时间

astart= 以秒/步为单位的起始速度(例如 0.5)

aend= 加速停止的速度(例如 0.05)

accelerationsteps= 加速应该发生的步数

问题是速度以每步每秒步数而不是每秒步数每秒增加,因此呈指数增加而不是线性增加。我发现这篇文章用数学术语解释了如何使用步进电机实现线性增长,但我还没有设法将其转换为我的 Python 代码。

如果有人能帮我解决这个问题,我将不胜感激,我认为这对于在 Raspberry Pi 上使用 Steppers 的人来说通常非常有用(我在这里只找到了 Arduino 的解决方案)

4

1 回答 1

4

一种简单的(虽然是近似的)方法是让它全部按时间运行,而不是按步骤运行。因此 time.sleep() 周期变得恒定,您可以跟踪当前速度以及下一次该踏步的时间。只要 time.sleep() 周期明显小于执行一步的时间,您将获得相当平稳的加速。

有点像:

accel = 20.0  # steps/sec/sec
time_passed = 0.000
steps_done = 0
cur_speed = 0  # steps/sec
time_for_next_step = 0.0

while (steps_done < steps_needed):
    if (time_passed >= time_for_next_step): 
        self.oneStep(direction, stepstyle)
        steps_done += 1
        time_for_next_step = time_passed + 1.0/cur_speed
    time.sleep(1);  # 1 millisecond, I assume
    time_passed += 0.001
    cur_speed += accel/1000.0

因为延迟周期是恒定的,这也意味着循环本身的开销更接近该延迟的恒定百分比增量,而不是随着延迟的缩小而增长。这让事情变得更顺利。

我还没有测试过这个,但它应该接近正确....希望它有帮助!

-史蒂夫

于 2015-12-16T21:14:01.877 回答