【问题标题】:Stepper motor linear acceleration步进电机直线加速度
【发布时间】:2015-12-16 18:27:50
【问题描述】:

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

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

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

【问题讨论】:

    标签: python raspberry-pi motordriver


    【解决方案1】:

    一种简单的(虽然是近似的)方法是让它全部按时间运行,而不是按步骤运行。因此 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
    

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

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

    -史蒂夫

    【讨论】:

    • 糟糕,我忘了增加steps_done,这会导致完成此过程的时间过长... :(
    • 您好,非常感谢您,我将对此进行一些试验。我认为这绝对是朝着正确方向迈出的一步。我确实认为随着加速度改变总持续时间,我需要猜测加速度需要多长时间,但我希望能够预测这一点。在我的旧公式中,我可以说,加速 200 个(总)步骤中的 20 个以上(= 整体的 20%)。现在我最终会猜测也许 x 秒就足够了。
    • 好点。您可能可以相当可靠地测量实际安装的电机(当然这将取决于许多物理变量)。顺便说一句,如果有兴趣,请查看 stackExchange 以尝试在 area51.stackexchange.com/proposals/82438/3d-printing 开始的 3d 打印
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多