У меня вполне конкретная задача: необходимо за заданное время сгенерировать определенное количество импульсов. Как мне посчитать ускорение ?
У меня вполне конкретная задача: необходимо за заданное время сгенерировать определенное количество импульсов. Как мне посчитать ускорение ?
Есть 2 варианта:
1) Для конкретного значения "начальной скорости" подобрать ускорение, чтобы в итоге разгонялось за нужное время
Например, если нужно разогнать с начальной скорости 300Гц с ускорением 5'000 кГц/сек, то нужно указывать accelRamp=860000.
Будет такая картина:
2017-06-30_860.png
Общая продолжительность -- 17.82мс
> 300*0.01782+5e6*(0.01782**2)/2
=> 799
Т.е. получается 800 импульсов за то время, какое должно было быть при нач. скорости 300 и ускорении 5'000 кГц/сек
Конкретное значение 8'600'000 я нашёл просто подбором.
2) Переписать весь stepper блок.
Последний раз редактировалось Владимир Ситников; 30.06.2017 в 17:34.
А из за чего такие сложности ?
Точное решение квадратного уравнения делать на PRU тяжело, т.к. там только целые числа, и умножения-деления-квадратного корня толком нет.
Можно было бы для каждого импульса применять формулу квадратного уравнения, но тогда пришлось бы для каждого импульса вычислять формулу из #973:
tn = ((v02 + 2*a*n)0.5 - v0)/a
Конечно, v02 это константа и вычислять 2an не так сложно, но всё равно остаются квадратный корень и деление.
Квадратный корень может занимать 0.5мкс, деление до 1мкс.
Сейчас же используется более простая формула -- без квадратного корня. Из сложных операций только одно деление. Это позволяет экономить ресурсы PRU. Из-за того, что квадратный корень не используется и получается отклонение от "эталонной формулы".
позволяет ли объем памяти держать таблицу корней?
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
Килобайт памяти суммарно есть, т.е. таблицу-то можно попробовать поместить (хотя не такую-то и большую таблицу можно в килобайт поместить)
В конце концов, квадратный корень работает в два раза быстрее деления, и с ним не такая большая проблема.
Вторая проблема: нет плавающей точки, а в широком диапазоне значений v0 и "a" может не хватать 32 битных чисел.
Грубо говоря, tn (в секундах) нужно умножить на 200'000'000 (чтобы перевести в такты).
Так вот: значение 200'000'000/a это константа, и, чтобы вообще исключить деление хотелось бы внести этот множитель под корень.
Но там-то и перестаёт хватать разрядности 32 (даже 64 не хватило бы), ведь (200'000'000/a)2 может быть весьма много (особенно, при небольших ускорениях порядка 10-100 Гц/сек).