Разве accelRamp - это не ускорение ? Что тогда такое 5'000 кГц/сек, decelRamp ?
Вид для печати
Формулу чего?
Формулу того, когда должен возникать импульс?
s = v0*t + a*t2/2
Применяем формулу квадратного уравнения, и получаем, что импульс с номером n должен возникнуть в момент tn
tn = ((v02 + 2*a*n)0.5 - v0)/a
Но это, конечно, "формула для сферического ШД в вакууме". Т.е. чтобы оценить работу блока PRU_STEPPER на больших ускорениях, нужно в качестве a использовать не accelRamp, а немного другое значение.
Я при расчете a пользуюсь такой формулой: a = 2*s/t*t. Но при большом s steper не успевает выдать требуемое число импульсов за заданное время.
В общем, построил для нескольких значений accel_ramp первые 1000 импульсов, и получается следующая связь между accel_ramp и фактическим a:
accelRamp = -4e-9 * a2 + 1,7252 * a - 118961
a = 1e-9 * accelRamp2 + 0,5677 * accelRamp +85109
Иными словами, если указать accel_ramp = 5000000, то будет a = 1e-9 * 50000002 + 0,5677 * 5000000 + 85109 == 2948609
Вспоминаем, что когда указывали 5000000, то разгонялось за 23мс.
Проверяем: 300 * 0,023 + 2948609 * 0,0232/2 == 786 -- т.е. весьма близко к 800.
И наоборот. Чтобы получить a = 5000000, то нужно указывать accelRamp = -4e-9 * 50000002 + 1,7252 * 5000000 - 118961 == 8407039
И не забываем, что эти формулы только для min_speed=300.
Возможно, стоит провести больше экспериментов (для разных min_speed) и вывести общую формулу.
А из за чего такие сложности ?
Точное решение квадратного уравнения делать на PRU тяжело, т.к. там только целые числа, и умножения-деления-квадратного корня толком нет.
Можно было бы для каждого импульса применять формулу квадратного уравнения, но тогда пришлось бы для каждого импульса вычислять формулу из #973:
tn = ((v02 + 2*a*n)0.5 - v0)/a
Конечно, v02 это константа и вычислять 2an не так сложно, но всё равно остаются квадратный корень и деление.
Квадратный корень может занимать 0.5мкс, деление до 1мкс.
Сейчас же используется более простая формула -- без квадратного корня. Из сложных операций только одно деление. Это позволяет экономить ресурсы PRU. Из-за того, что квадратный корень не используется и получается отклонение от "эталонной формулы".
позволяет ли объем памяти держать таблицу корней?
В моей задаче надо за одно и то же фиксированное время генерировать разное количество импульсов. Число импульсов, которое надо генерировать за фиксированное время может колебаться от 16 до 1120.
Какова будет формула пересчета a в accelRamp при нулевой начальной частоте ?