Сделал вычисление разгона-торможения.
Всё основывается на четырёх параметрах:
Код:
input quantity : DWORD; (* Общее количество импульсов *)
input accel_ramp : DWORD; (* Ускорение имп/сек^2 *)
input decel_ramp : DWORD; (* Замедление имп/сек^2 *)
input max_speed : DWORD; (* Максимально допустимая скорость имп/сек *)
Иными словами, на вход подаём "сколько нужно проехать и какие ограничения скорости", и в результате оно само планирует как именно ехать.
Текущее ограничение -- разгон до макс скорости должен укладываться в 232-1.
По-моему, этого должно хватать на все разумные случаи.
Например:
1) если макс скорость составляет 100кГц, то разгон нужно выполнить не дольше, чем за 11 часов (==((1<<32)-1)/100000/3600).
2) если макс скорость составляет 10кГц, то разгон нужно выполнить не дольше, чем за 119 часов (==((1<<32)-1)/10000/3600).
Примеры графиков.
На каждом из графиков после расчётного количества импульсов блок начинает выдавать статус "приехали, больше не надо"
3500 импульсов, разгон 500 имп/сек2, торможение 1000 имп/сек2
move_3500steps_1kHz_500_1000_output.png
CPU %:
На этом графике видно, что "подготовка" действительно занимает какое-то время.
Тут это было 768 тактов, т.е. целых 5.1 мкс. Не исключено, что можно соптимизировать, но деления-умножения там делать приходится.
Первый генерируемый импульс составляет 42.7 мс, и все вычисления просто немного сокращают длительность "ожидания".
move_3500steps_1kHz_500_1000_cpu_use.png
2250000 импульсов, разгон 5000 имп/сек2, торможение 6666 имп/сек2
move_2250000steps_100kHz_5000_6666_output.png
CPU %:
Тут подготовка была 867, т.е. 5.8 мкс.
move_2250000steps_100kHz_5000_6666_cpu_utilization.png
А теперь сделаем короткое передвижение (так, что максимальная скорость не достигается).
1000 импульсов, разгон 500 имп/сек2, торможение 1000 имп/сек2
move_1000_100khz_500_1000.png
Теперь осталось:
1) добавить "общий цикл", который будет моргать выходом и передавать параметры
2) добавить "экстренное торможение" (если enable переходит в false раньше времени, то вычислить торможение и начать это самое торможение)