python – 步进电机线性加速度

我正在开发一个
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 =加速应该发生的步数

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

如果有人可以帮助我,我会非常感激,我认为这对于一般在Raspberry Pi上使用Steppers的人来说非常有用(我只找到了Arduino here的解决方案)

最佳答案 一种简单(尽管近似)的方式是使它全部按时间运行,而不是按步骤运行.因此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

因为延迟周期是恒定的,所以它还意味着循环本身的开销更接近于该延迟的恒定%增量,而不是随着延迟的缩小而增长.这让事情变得更加顺畅.

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

史蒂夫

点赞