我正在开发一个
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
因为延迟周期是恒定的,所以它还意味着循环本身的开销更接近于该延迟的恒定%增量,而不是随着延迟的缩小而增长.这让事情变得更加顺畅.
我没有测试过这个,但它应该接近正确….希望它有所帮助!
史蒂夫