2015-12-16 6 views
2

Я работаю над кодом Python (ниже), который ускоряет шаговый двигатель, пока не достигнет определенного количества шагов.Stepper Motor Lineair Acceleration 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, в которой математические термины объясняются тем, как можно добиться увеличения линии с помощью Stepper Motor, но мне не удалось перевести это в мой код на Python.

Я очень признателен, если кто-то может помочь мне с этим, и я думаю, что было бы очень полезно для людей, использующих степперы на Raspberry Pi в целом (я только нашел решение для Arduino here)

Заранее большое спасибо.

ответ

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 

Поскольку период задержки является постоянным, это также означает, что накладные расходы самой петли, ближе к постоянному приращению% к этой задержке, а не растет, поскольку задержки сжимается. Это делает вещи более гладкими.

Я не проверял это, но он должен быть рядом с справа .... Надеюсь, это поможет!

-Стив

+0

К сожалению, я забыл увеличиваем steps_done, что сделает это займет немного слишком много времени, чтобы закончить ... :( – TextGeek

+0

Привет, спасибо, я сделаю некоторые испытания с этим. Я думаю, что это определенно шаг в правильном направлении. Я думаю, что по мере того, как ускорение изменяет общую продолжительность, мне нужно будет угадать, как долго происходит ускорение, но я хотел бы это предсказать. В моей старой формуле я был способен сказать, ускорить более 20 из 200 (всего) шагов (= 20% от всего). Теперь я в конечном итоге догадываюсь, что, возможно, x секунд должно быть достаточно. – LuukS

+0

Хорошая точка. Возможно, вы можете измерить это достаточно надежно от фактического установленного двигателя (конечно, это будет зависеть от множества физических переменных). BTW, если заинтересована проверка stackExchange для 3D-печати, который пытается начать работу по адресу http://area51.stackexchange.com/proposals/82438/3d-printing – TextGeek